Cómo obtener fechas y números de un input HTML
Introducción
Aún recuerdo los días en los que no existían etiquetas <input>
especializadas. Tenías los genéricos de <input type="text">
, <input type="button">
, <input type="file">
, <input type="hidden">
y algún otro. Pero, básicamente, las validaciones se realizaban mediante JavaScript en un <input type="text">
.
Desde hace un tiempo contamos con muchos otros especializados como <input type="color">
para hacer aparecer un color picker, <input type="date">
para mostrar un calendario, <input type="number">
para incrementar o decrementar números, etc.
Y es justo sobre estos dos últimos (date
y number
), de los que vamos a comentar una pequeña funcionalidad que tal vez no conozcas.
Obteniendo el valor del campo
Para acceder al valor del <input>
, basta con consultar la propiedad inputElement.value
. Ésta devuelve el valor actual como un string. Si el valor aún no se hubiera especificado, devuelve también un string, en este caso vacío (''
).
function extractValue(element) {
// Devolvemos la propiedad "value"
return element.value
}
/* Código de la demo */
function updateElements() {
const date = extractValue(document.getElementById('date-input'))
document.getElementById('date-value').textContent = date
document.getElementById('date-type').textContent = typeof date
const number = extractValue(document.getElementById('number-input'))
document.getElementById('number-value').textContent = number
document.getElementById('number-type').textContent = typeof number
}
updateElements()
document
.getElementById('date-input')
.addEventListener('change', updateElements)
document
.getElementById('number-input')
.addEventListener('change', updateElements)
El problema de este código es que JavaScript cuenta con objetos Date para manipulación de fechas y el tipo primitivo Number. Así pues si tenemos nuestro valor como string primero deberemos realizar conversiones tales como new Date(stringValue)
en el caso de fechas, o Number(stringValue)
/ parseInt(stringValue, 10)
en el caso de números.
Recuerda que si no realizas las conversiones y tratas de sumar dos cadenas de texto como, por ejemplo, '2' + '2'
, el resultado no es 4
, si no 22
.
Podemos evitar esta conversión simplemente utilizando un par de propiedades que ya llevan unos años entre nosotros y tal vez no conozcas.
Obteniendo el valor del campo como fecha o número
En el caso de los <input type="date">
contamos con la propiedad inputElement.valueAsDate
.
En el caso de <input type="number">
, la propiedad se llama inputElement.valueAsNumber
.
¿Fácil verdad? Veámos un ejemplo.
function extractValue(element) {
// Devolvemos la propiedad "valueAsDate", "valueAsNumber" o "value" dependiendo del input
if (element.type === 'date') {
return element.valueAsDate
} else if (element.type === 'number') {
return element.valueAsNumber
} else {
return element.value
}
}
/* Código de la demo */
function updateElements() {
const date = extractValue(document.getElementById('date-input'))
document.getElementById('date-value').textContent = date
document.getElementById('date-type').textContent = typeof date
const number = extractValue(document.getElementById('number-input'))
document.getElementById('number-value').textContent = number
document.getElementById('number-type').textContent = typeof number
}
updateElements()
document
.getElementById('date-input')
.addEventListener('change', updateElements)
document
.getElementById('number-input')
.addEventListener('change', updateElements)
Ahora nuestra fecha es de tipo object y por lo tanto acepta manipulaciones tales como date.getTime()
o date.toISOString()
.
En el caso del <input type="number">
nuestro valor tendrá el tipo number, así que ya estamos listos para realizar operaciones sobre los números sin miedo a que se nos olvide la conversión previa.
Cuando el valor del <input type="number">
aún no haya sido especificado, la propiedad inputElement.valueAsNumber
tendrá el valor de NaN
.
¿Recuerdas cuál es el tipo de NaN
? Exacto, typeof NaN // 'number'
.
Por lo tanto, ten cuidado si el valor aún no existe en el <input>
y realiza una comprobación mediante if (!isNaN(number)) {}
.
Asignando un valor al campo
Por último cabe destacar que estas propiedades son tanto getters como setters.
Es decir, podemos asignar valores a estas propiedades y nuestro <input>
cambiará de valor.
Por ejemplo, podemos asignar inputElement.valueAsDate = new Date()
y nuestro <input type="date">
actualizará su valor de fecha.
En el caso de los <input type="number">
podemos hacer exactamente lo mismo: inputElement.valueAsNumber = totalIncome
.
¿Sabías que esta propiedad existe desde los tiempos de Internet Explorer?
Puedes apoyarme para que pueda dedicar aún más tiempo a escribir artículos y tener recursos para crear nuevos proyectos. ¡Gracias!