Kodokon kodokon.com

Formularios avanzados y validación nativa

Aprovecha required, pattern, inputmode y la Constraint Validation API para formularios robustos sin ninguna librería externa.

10 min · 3 preguntas

Abrir esta lección en Kodokon

El navegador incluye un motor de validación completo que muchos equipos reimplementan en JavaScript por costumbre. Los bloques básicos: required (campo obligatorio), los tipos (email, url, date) que validan el formato, minlength/maxlength, min/max/step para los valores numéricos, y pattern, que acepta una expresión regular. Detalle crucial: pattern está anclado implícitamente - el valor entero debe coincidir, como si la expresión regular estuviera envuelta en ^ y $. Añade autocomplete con los valores estandarizados (postal-code, email, tel): es a la vez UX y accesibilidad.

HTML
<label for="zip">Postal code</label>
<input id="zip" name="zip" type="text"
       required pattern="[0-9]{5}"
       inputmode="numeric"
       autocomplete="postal-code">
Validación nativa: formato, obligatoriedad, teclado adecuado

El atributo inputmode se malinterpreta a menudo: no valida nada. Se limita a indicar al sistema móvil qué teclado virtual mostrar (numeric, tel, email, decimal, search). Por eso la combinación type="text" + inputmode="numeric" + pattern es el patrón recomendado para los códigos numéricos: obtienes el teclado adecuado sin heredar los comportamientos de type="number".

CSS
input:user-invalid {
  border: 2px solid #b3261e;
}
input:user-valid {
  border: 2px solid #1b5e20;
}
:user-invalid solo actúa después de que el usuario haya interactuado

Del lado de CSS, prefiere :user-invalid frente a :invalid: este último se aplica en cuanto se carga la página, pintando de rojo campos que el usuario ni siquiera ha tocado. Del lado de JavaScript, la Constraint Validation API completa el conjunto de herramientas: checkValidity() dispara la comprobación, el objeto validity expone la causa exacta (patternMismatch, valueMissing, tooShort) y setCustomValidity() te permite sustituir los mensajes genéricos del navegador por los tuyos.

JAVASCRIPT
const zip = document.querySelector("#zip");
zip.addEventListener("input", () => {
  if (zip.validity.patternMismatch) {
    zip.setCustomValidity("Enter 5 digits.");
  } else {
    zip.setCustomValidity("");
  }
});
Mensaje personalizado mediante la API de validación

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Qué hace exactamente inputmode="numeric"?
    • Rechazar cualquier entrada no numérica
    • Convertir el valor del campo en un número
    • Sugerir un teclado numérico en el móvil, sin validar nada
  2. Con pattern="[0-9]{5}", ¿se acepta el valor "abc12345"?
    • Sí, porque sí contiene 5 dígitos consecutivos
    • No, porque pattern exige que coincida el valor entero
    • Sí, si el campo no es required
  3. ¿Por qué preferir :user-invalid frente a :invalid para dar estilo a los errores?
    • :user-invalid solo se aplica después de que el usuario haya interactuado
    • :invalid no está soportado por los navegadores recientes
    • :user-invalid también valida los campos deshabilitados