Validación de Formularios con checkValidity: API de Validación HTML5
Aprende a validar formularios usando la API de validación HTML5 de JavaScript, incluyendo checkValidity(), validity y restricciones de validación nativas.
TL;DR - Resumen rápido
- checkValidity() valida todos los campos de un formulario según restricciones HTML5
- La propiedad validity devuelve un objeto con el estado de validación de cada campo
- Las restricciones HTML5 incluyen required, pattern, min, max, minlength, maxlength
- setCustomValidity() permite definir mensajes de error personalizados
- Los eventos invalid y validitychange detectan cambios en el estado de validación
Introducción a la Validación de Formularios
La validación de formularios es un aspecto crítico de cualquier aplicación web. Antes de la aparición de la API de validación HTML5, los desarrolladores tenían que escribir código JavaScript complejo para validar cada campo manualmente. Hoy en día, los navegadores modernos proporcionan una API de validación nativa que simplifica enormemente este proceso y proporciona una experiencia de usuario consistente.
La API de validación HTML5 incluye métodos como checkValidity(), propiedades como validity, y atributos HTML como required, pattern, min, max, minlength y maxlength. Estas herramientas te permiten validar formularios de manera eficiente sin dependencias externas, usando únicamente JavaScript vanilla puro.
- <strong>Validación nativa:</strong> Los navegadores manejan la validación automáticamente sin necesidad de código adicional
- <strong>Accesibilidad:</strong> Los mensajes de error nativos son accesibles y funcionan con lectores de pantalla
- <strong>Consistencia:</strong> La validación se comporta de manera consistente en todos los navegadores modernos
- <strong>Rendimiento:</strong> La validación nativa es más rápida que la validación en JavaScript puro
- <strong>Flexibilidad:</strong> Puedes combinar validación nativa con validación personalizada cuando sea necesario
Método checkValidity()
El método checkValidity() verifica si un elemento o un formulario completo cumple con todas sus restricciones de validación. Devuelve true si todos los campos son válidos y false si alguno es inválido. Además, muestra automáticamente mensajes de error en los campos inválidos, lo que proporciona feedback visual inmediato al usuario.
Validar un Formulario Completo
Cuando llamas a checkValidity() en un formulario, este valida todos sus elementos automáticamente. Este es el enfoque más común para validar formularios antes de enviarlos. Si algún campo es inválido, checkValidity() devuelve false y muestra los mensajes de error correspondientes en cada campo inválido.
Este código muestra cómo validar un formulario completo antes de enviarlo. El event listener para el evento submit previene el envío por defecto, llama a checkValidity(), y solo permite el envío si todos los campos son válidos. Si hay errores, checkValidity() muestra automáticamente los mensajes de error en los campos correspondientes.
checkValidity() no envía el formulario
Es importante entender que checkValidity() solo valida el formulario, no lo envía. Debes llamar a form.submit() o usar FormData API después de validar. Este diseño te permite agregar lógica adicional antes de enviar, como transformar datos o hacer peticiones AJAX.
Validar un Elemento Individual
También puedes llamar a checkValidity() en un elemento individual para validar solo ese campo. Esto es útil para validación en tiempo real, donde quieres mostrar feedback al usuario mientras escribe, en lugar de esperar hasta que envíe el formulario. La validación individual proporciona una experiencia de usuario más interactiva.
Este ejemplo muestra cómo validar un campo individualmente en tiempo real. El event listener para el evento input valida el campo cada vez que el usuario escribe algo. Esto proporciona feedback inmediato y ayuda al usuario a corregir errores antes de intentar enviar el formulario.
Validación en tiempo real vs. al enviar
La validación en tiempo real (usando el evento input) proporciona feedback inmediato, pero puede ser molesta si muestra errores mientras el usuario aún está escribiendo. Una buena práctica es validar en tiempo real solo después de que el usuario haya interactuado con el campo (evento blur) o usar un debounce para validar después de que el usuario deje de escribir.
Eventos de Validación
Los elementos de formulario disparan eventos específicos cuando cambia su estado de validación. El evento invalid se dispara cuando un campo se vuelve inválido, y el evento validitychange se dispara cuando cambia la propiedad validity. Estos eventos te permiten reaccionar a cambios en el estado de validación de manera programática.
Este código muestra cómo escuchar eventos de validación. El evento invalid se dispara cuando un campo se vuelve inválido, lo que te permite mostrar mensajes de error personalizados o cambiar el estilo del campo. El evento validitychange se dispara cuando cambia la propiedad validity, lo que te permite actualizar la UI en respuesta a cambios en el estado de validación.
Propiedad validity
La propiedad validity devuelve un objeto que contiene el estado de validación de un elemento. Este objeto tiene múltiples propiedades booleanas, cada una representando un tipo específico de error de validación. La propiedad valueMissing indica si el campo está vacío cuando es required, typeMismatch indica si el valor no coincide con el tipo esperado, y así sucesivamente.
Propiedades del Objeto validity
El objeto validity tiene 11 propiedades booleanas que indican diferentes tipos de errores de validación. La propiedad valid es true si todas las demás propiedades son false, lo que significa que el campo es válido. Las otras propiedades se activan cuando se viola una restricción específica de validación.
- <strong>valueMissing:</strong> El campo está vacío cuando es required
- <strong>typeMismatch:</strong> El valor no coincide con el tipo esperado (email, url, etc.)
- <strong>patternMismatch:</strong> El valor no coincide con el atributo pattern
- <strong>tooShort/tooLong:</strong> El valor es más corto/largo que minlength/maxlength
- <strong>rangeUnderflow/rangeOverflow:</strong> El valor está fuera del rango min/max
- <strong>customError:</strong> Se estableció un error personalizado con setCustomValidity()
Este código muestra cómo acceder a las propiedades del objeto validity. Cada propiedad representa un tipo específico de error de validación. Por ejemplo, valueMissing es true cuando el campo está vacío pero tiene el atributo required. Puedes usar estas propiedades para mostrar mensajes de error específicos para cada tipo de error. Es importante notar que validity.valid es equivalente a llamar a checkValidity(), pero sin mostrar mensajes de error, lo que es útil cuando quieres verificar el estado sin afectar la UI.
Ejemplo Práctico: Mensajes de Error Específicos
Un caso de uso común es mostrar mensajes de error específicos según el tipo de error de validación. Por ejemplo, puedes mostrar un mensaje diferente si el campo está vacío (valueMissing) que si el formato del email es incorrecto (typeMismatch). Esto proporciona una experiencia de usuario más clara y ayuda al usuario a corregir errores más rápidamente.
Este ejemplo muestra cómo mostrar mensajes de error específicos según el tipo de error de validación. La función obtenerMensajeError verifica cada propiedad del objeto validity y devuelve un mensaje apropiado. Este patrón es útil cuando quieres proporcionar feedback más detallado que los mensajes de error genéricos del navegador.
Restricciones de Validación HTML5
Las restricciones de validación HTML5 son atributos que puedes agregar a los elementos de formulario para definir reglas de validación. Estas restricciones incluyen required para campos obligatorios, pattern para expresiones regulares, min y max para valores numéricos, y minlength y maxlength para longitud de texto. Los navegadores usan estas restricciones para validar automáticamente los campos.
Restricción required
El atributo required indica que un campo es obligatorio y debe tener un valor antes de enviar el formulario. Cuando un campo tiene required y está vacío, la propiedad valueMissing del objeto validity es true. Esta es la restricción más común y fundamental para cualquier formulario que capture datos esenciales.
Este código muestra cómo usar la restricción required. El atributo required en el HTML hace que el campo sea obligatorio. En JavaScript, puedes verificar si el campo está vacío usando la propiedad valueMissing del objeto validity. Este patrón es esencial para validar campos obligatorios.
required y checkboxes/radio buttons
Para checkboxes y radio buttons, required significa que al menos una opción debe estar seleccionada. En el caso de radio buttons, el usuario debe seleccionar una opción del grupo. Para checkboxes, required significa que el checkbox debe estar marcado. Este comportamiento es diferente al de los campos de texto, donde required significa que el campo no puede estar vacío.
Restricción pattern
El atributo pattern permite definir una expresión regular que el valor del campo debe cumplir. Esta restricción es útil para validar formatos específicos como números de teléfono, códigos postales, o identificadores personalizados. Cuando el valor del campo no coincide con el patrón, la propiedad patternMismatch del objeto validity es true.
Este ejemplo muestra cómo usar la restricción pattern para validar un código postal. El patrón es una expresión regular que define el formato válido del código postal. Cuando el valor del campo no coincide con el patrón, la propiedad patternMismatch es true. Este patrón es útil para validar formatos específicos que no están cubiertos por los tipos de input estándar. Algunos patrones comunes incluyen códigos postales, números de teléfono y contraseñas con requisitos mínimos. Siempre documenta tus patrones y proporciona ejemplos claros de formato válido para ayudar al usuario.
Restricciones min, max, minlength, maxlength
Las restricciones min y max definen el valor mínimo y máximo para campos numéricos, mientras que minlength y maxlength definen la longitud mínima y máxima para campos de texto. Estas restricciones son útiles para validar rangos de valores y limitar la cantidad de texto que el usuario puede ingresar.
Este ejemplo muestra cómo usar las restricciones min, max, minlength y maxlength. Para campos numéricos, min y max definen el rango de valores válidos. Para campos de texto, minlength y maxlength definen la longitud mínima y máxima. Estas restricciones se validan automáticamente por el navegador y proporcionan feedback visual al usuario.
maxlength vs. validación de longitud
maxlength impide que el usuario escriba más caracteres del límite, mientras que minlength solo muestra un error al validar. Esto significa que el usuario nunca podrá exceder maxlength, pero sí podrá escribir menos caracteres que minlength. Para validación más flexible, considera usar JavaScript para validar la longitud en lugar de maxlength.
Restricción type
El atributo type define el tipo de input y activa validación específica para ese tipo. Por ejemplo, type="email" valida que el valor sea un email válido, type="url" valida que sea una URL válida, y type="number" valida que sea un número. Cuando el valor no coincide con el tipo esperado, la propiedad typeMismatch del objeto validity es true.
Este ejemplo muestra cómo usar diferentes tipos de input para validar automáticamente el formato de los datos. type="email" valida emails, type="url" valida URLs, y type="number" valida números. Estos tipos proporcionan validación automática sin necesidad de código adicional, lo que simplifica enormemente el desarrollo de formularios. HTML5 también introdujo tipos como date, time, color, range y tel que no solo validan automáticamente, sino que proporcionan UI especializada en navegadores modernos (calendarios, sliders, etc.).
Mensajes de Error Personalizados
Aunque los navegadores proporcionan mensajes de error nativos, a menudo quieres mostrar mensajes personalizados que sean más específicos para tu aplicación. El método setCustomValidity() te permite definir mensajes de error personalizados para un elemento, y el método reportValidity() muestra estos mensajes de error al usuario.
Método setCustomValidity()
El método setCustomValidity() te permite definir un mensaje de error personalizado para un elemento. Cuando pasas un string no vacío a setCustomValidity(), el elemento se marca como inválido y la propiedad customError del objeto validity es true. Para marcar el elemento como válido nuevamente, debes pasar un string vacío.
Este ejemplo muestra cómo usar setCustomValidity() para definir mensajes de error personalizados. La función validarContrasena verifica si la contraseña cumple con ciertos requisitos y llama a setCustomValidity() con un mensaje de error apropiado. Para marcar el campo como válido, pasamos un string vacío.
setCustomValidity() anula validación nativa
Cuando llamas a setCustomValidity() con un mensaje de error, el elemento se marca como inválido independientemente de si cumple con las restricciones HTML5. Esto significa que la validación nativa se ignora mientras haya un mensaje de error personalizado. Para combinar validación nativa y personalizada, verifica la validación nativa antes de llamar a setCustomValidity().
Método reportValidity()
El método reportValidity() es similar a checkValidity(), pero siempre muestra mensajes de error incluso si el elemento ya tenía mensajes de error personalizados. Esto es útil cuando quieres forzar la visualización de mensajes de error después de validar manualmente un formulario. reportValidity() devuelve true si todos los campos son válidos y false si alguno es inválido.
Este ejemplo muestra cómo usar reportValidity() para mostrar mensajes de error después de validar manualmente un formulario. La diferencia principal con checkValidity() es que reportValidity() siempre muestra mensajes de error, mientras que checkValidity() solo los muestra cuando hay cambios en el estado de validación. Usa reportValidity() cuando quieras forzar la visualización de errores después de validación personalizada.
Resumen: Validación de Formularios
Conceptos principales:
- •checkValidity() valida todos los campos de un formulario según restricciones HTML5
- •La propiedad validity devuelve un objeto con el estado de validación de cada campo
- •Las restricciones HTML5 incluyen required, pattern, min, max, minlength, maxlength
- •setCustomValidity() permite definir mensajes de error personalizados
- •Los eventos invalid y validitychange detectan cambios en el estado de validación
Mejores prácticas:
- •Usa validación en tiempo real con debounce para mejor UX
- •Combina validación nativa con validación personalizada cuando sea necesario
- •Muestra mensajes de error específicos según el tipo de error de validación
- •Usa reportValidity() para forzar la visualización de mensajes de error
- •Documenta claramente los requisitos de validación para el usuario