Aller au contenu
M05 · D. Gérer les événements utilisateur

Gérer un formulaire en JavaScript

Lire les valeurs des champs, intercepter l'envoi d'un formulaire, valider les données et afficher les erreurs, réagir à la saisie au clavier et activer ou désactiver un bouton.

1Situer

Le festival Gnaoua d'Essaouira ouvre les inscriptions pour ses bénévoles. Le formulaire doit refuser un e-mail sans @, un âge de moins de 18 ans, un message trop long, et n'autoriser l'envoi qu'une fois la charte acceptée. Les attributs HTML5 vus au module 04 ne suffisent pas pour des règles sur mesure et des messages clairs : JavaScript prend le relais.

2Comprendre

Valider un formulaire en JavaScript
E-mail youssef.gmail.com Âge 16 Envoyer E-mail invalide ·Il faut avoir 18 ans Merci Youssef ✓ form.addEventListener('submit', (e) => {   e.preventDefault();   const erreurs = [];   if (!email.includes('@')) …   if (age < 18) …   if (erreurs.length) afficher   else confirmer }); erreurs : 2

Le bénévole remplit le formulaire et clique sur Envoyer : l'événement submit se déclenche sur le formulaire.

1 / 5

Lire les champs

const prenom = document.querySelector('#prenom').value.trim();  // texte sans espaces autour
const age = Number(document.querySelector('#age').value);       // value est une chaîne
const accepte = document.querySelector('#charte').checked;      // case à cocher

Intercepter l’envoi

form.addEventListener('submit', (e) => {
  e.preventDefault();          // pas d'envoi, pas de rechargement
  const erreurs = [];
  if (!email.includes('@')) erreurs.push('E-mail invalide');
  if (age < 18) erreurs.push('Il faut avoir 18 ans');
  if (erreurs.length) {
    zoneErreurs.textContent = erreurs.join(' · ');
    return;                    // on s'arrête là
  }
  // tout est correct : envoyer les données (AJAX, partie E) ou afficher un message
});

On écoute submit sur le formulaire, pas click sur le bouton : ainsi la touche Entrée est aussi gérée.

Réagir pendant la saisie

ÉvénementMoment
inputà chaque modification
changeà la sortie du champ, ou au choix d’une case, d’un radio, d’une option
focus / blurle champ devient actif / inactif
keydownune touche est enfoncée (e.key)
charte.addEventListener('change', () => {
  bouton.disabled = !charte.checked;    // bouton actif seulement si coché
});

HTML5 et JavaScript ensemble

Les attributs required, type="email", min… (module 04) font une première vérification. JavaScript ajoute des règles sur mesure, des messages clairs et des vérifications en direct. Et le serveur vérifie toujours une dernière fois.

Exemple simple

Le contrôleur à l'entrée

Avant de laisser passer le dossier, le contrôleur vérifie chaque pièce. S'il manque quelque chose, il arrête le dossier (preventDefault) et explique ce qui manque.

form.addEventListener('submit', (e) => {
  e.preventDefault();             // on garde la main
  if (!email.value.includes('@')) {
    erreurs.textContent = 'E-mail invalide';
  }
});
Exemple simple

Le compteur de caractères

Comme le compteur d'un SMS, l'événement input se déclenche à chaque caractère tapé : on peut afficher en direct combien il en reste.

message.addEventListener('input', () => {
  compteur.textContent = `${message.value.length} / 200`;
});

3Manipuler

Complétez le script, puis testez le formulaire dans l'aperçu : envoyez-le avec une erreur, puis avec des données correctes.
Ouvrir dans le lab ↗
Console
  • Ajoutez e.preventDefault() puis envoyez un formulaire valide : « Merci ... » s'affiche
  • Si l'e-mail n'a pas de @, affichez « E-mail invalide » (testez-le)
  • Si l'âge est inférieur à 18, affichez « Il faut avoir 18 ans » (testez-le)
  • Avec l'événement input, affichez « n / 200 » dans #compteur pendant la saisie de la motivation
  • Au chargement, désactivez le bouton (disabled = true) tant que la charte n'est pas cochée
  • Quand on coche la charte (événement change), le bouton se réactive

4Pratiquer

Exercice 1 · Lire tous les types de champs

Comment lire : (1) un champ texte ; (2) une case à cocher ; (3) le bouton radio choisi dans le groupe name="taille" ; (4) la valeur d'un <select> ?

Voir le corrigé
document.querySelector('#prenom').value              // texte
document.querySelector('#charte').checked            // true / false
document.querySelector('input[name="taille"]:checked')?.value
document.querySelector('#ville').value               // option choisie

Exercice 2 · L'erreur sous le champ

Plutôt qu'un message global, ajoutez la classe invalide sur le champ e-mail quand il est faux, et retirez-la quand il devient correct pendant la saisie.

Voir le corrigé
const email = document.querySelector('#email');
email.addEventListener('input', () => {
  email.classList.toggle('invalide', !email.value.includes('@'));
});
/* CSS : .invalide { border-color: #c0392b; } */

Exercice 3 · Le formulaire en objet

Comment récupérer toutes les valeurs d'un formulaire d'un coup ?

Voir le corrigé
const donnees = Object.fromEntries(new FormData(form));
// Les champs doivent avoir un attribut name.
console.log(donnees); // { prenom: 'Salma', email: '...' }

5Vérifier

1. Pourquoi appeler e.preventDefault() dans l'écouteur submit ?
2. Quelle propriété contient le texte saisi dans un <input> ?
3. Quel événement se déclenche à chaque caractère tapé ?