Kodokon kodokon.com

Formulaires avancés et validation native

Exploitez required, pattern, inputmode et l'API de validation par contraintes pour des formulaires robustes sans bibliothèque externe.

10 min · 3 questions

Ouvrir cette leçon dans Kodokon

Le navigateur embarque un moteur de validation complet que beaucoup d'équipes réimplémentent en JavaScript par réflexe. Les briques : required (champ obligatoire), les types (email, url, date) qui valident le format, minlength/maxlength, min/max/step pour les valeurs numériques, et pattern qui accepte une expression régulière. Détail crucial : pattern est implicitement ancré, la valeur entière doit correspondre, comme si la regex était entourée de ^ et $. Ajoutez autocomplete avec les valeurs normalisées (postal-code, email, tel) : c'est à la fois de l'UX et de l'accessibilité.

HTML
<label for="zip">Code postal</label>
<input id="zip" name="zip" type="text"
       required pattern="[0-9]{5}"
       inputmode="numeric"
       autocomplete="postal-code">
Validation native : format, obligation, clavier adapté

L'attribut inputmode est souvent mal compris : il ne valide rien. Il indique seulement au système mobile quel clavier virtuel afficher (numeric, tel, email, decimal, search). C'est pourquoi le duo type="text" + inputmode="numeric" + pattern est le pattern recommandé pour les codes numériques : vous obtenez le bon clavier sans hériter des comportements de type="number".

CSS
input:user-invalid {
  border: 2px solid #b3261e;
}
input:user-valid {
  border: 2px solid #1b5e20;
}
:user-invalid n'agit qu'après interaction de l'utilisateur

Côté CSS, préférez :user-invalid à :invalid : la seconde s'applique dès le chargement, marquant en rouge des champs que l'utilisateur n'a pas encore touchés. Côté JavaScript, l'API de validation par contraintes complète le dispositif : checkValidity() déclenche la vérification, l'objet validity expose la cause précise (patternMismatch, valueMissing, tooShort), et setCustomValidity() vous permet de remplacer les messages génériques du navigateur par les vôtres.

JAVASCRIPT
const zip = document.querySelector("#zip");
zip.addEventListener("input", () => {
  if (zip.validity.patternMismatch) {
    zip.setCustomValidity("Entrez 5 chiffres.");
  } else {
    zip.setCustomValidity("");
  }
});
Message personnalisé via l'API de validation

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Quel est le rôle exact de inputmode="numeric" ?
    • Rejeter toute saisie non numérique
    • Convertir la valeur du champ en nombre
    • Suggérer un clavier numérique sur mobile, sans valider
  2. Avec pattern="[0-9]{5}", la valeur « abc12345 » est-elle acceptée ?
    • Oui, car elle contient bien 5 chiffres consécutifs
    • Non, car pattern exige que la valeur entière corresponde
    • Oui, si le champ n'est pas required
  3. Pourquoi préférer :user-invalid à :invalid pour styler les erreurs ?
    • :user-invalid ne s'applique qu'après une interaction de l'utilisateur
    • :invalid n'est pas supporté par les navigateurs récents
    • :user-invalid valide aussi les champs désactivés