Événements et formulaires
Cours · JavaScript : rendre le Web interactif (école d'ingénieur), chapitre 8 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Au chapitre précédent, le script de la Librairie du Campus s'exécutait une fois, au chargement, puis s'arrêtait. Une page interactive doit au contraire attendre : que le visiteur clique sur le bouton du menu, tape un mot dans la recherche, choisisse un livre dans le formulaire de commande. Chacune de ces actions produit un événement, et le script indique à l'avance quelle fonction appeler quand il se produit.
C'est le modèle des interfaces graphiques que Java connaît avec ses listeners : on enregistre un écouteur, et c'est le système qui l'appelle. La différence est qu'en JavaScript tout le programme fonctionne ainsi : il n'y a pas de main qui tourne en boucle, seulement des fonctions qui réagissent. Ce chapitre présente les événements, leur trajet dans l'arbre du DOM, la délégation, et leur usage le plus important : guider la saisie d'un formulaire. À la fin, la Librairie aura un menu repliable sur téléphone, un catalogue filtré pendant la frappe et un formulaire de commande qui calcule son total et explique ses erreurs.
Objectifs du chapitre
- Enregistrer un écouteur avec
addEventListeneret exploiter l'objet événement. - Choisir le bon événement :
click,input,change,keydown,submit. - Comprendre la propagation (capture, cible, remontée) et en tirer la délégation d'événements.
- Empêcher un comportement par défaut ; lire un formulaire ; utiliser l'API de validation et des messages d'erreur accessibles.
- Rendre une interaction utilisable au clavier et par un lecteur d'écran.
Les affichages de console de ce chapitre ont été produits dans Chromium, en simulant les actions décrites (clics, frappes) avec l'outil Playwright.
8.1 Écouter un événement
<button id="ajouter" type="button">Ajouter au panier</button>
<p>Articles : <output id="compteur">0</output></p>
const bouton = document.querySelector("#ajouter");
const compteur = document.querySelector("#compteur");
let nombre = 0;
bouton.addEventListener("click", (evenement) => {
nombre += 1;
compteur.textContent = String(nombre);
console.log(evenement.type, evenement.target.id, nombre);
});
Après trois clics sur le bouton :
click ajouter 1
click ajouter 2
click ajouter 3
cible.addEventListener(type, ecouteur) enregistre la fonction ecouteur, qui sera appelée à chaque événement type ("click", "input"…) survenant sur cible. Elle reçoit un objet événement : type, target (l'élément où l'événement s'est produit), currentTarget (celui qui porte l'écouteur), key pour le clavier, etc. removeEventListener(type, ecouteur) le retire (avec la même fonction, pas une copie).
Remarquez la variable nombre : déclarée hors de l'écouteur, elle survit entre deux clics, grâce à la fermeture (chapitre 4). L'écouteur peut être appelé des centaines de fois ; le reste du script, lui, ne s'est exécuté qu'une fois.
On peut enregistrer plusieurs écouteurs du même type sur un même élément : ils s'exécutent dans l'ordre d'enregistrement. Un troisième argument règle des options : { once: true } retire l'écouteur après son premier appel, { capture: true } est expliqué plus bas.
Pas d'attribut onclick dans le HTML
On rencontre encore <button onclick="ajouter()">. Cette forme mêle le code au HTML, n'accepte qu'un écouteur, oblige la fonction à être globale (ce qu'elle n'est pas dans un module) et est interdite par les politiques de sécurité des sites sérieux. On utilise toujours addEventListener.
Passer une méthode comme écouteur
bouton.addEventListener("click", panier.vider) transmet la fonction sans son objet : quand le navigateur l'appelle, this n'est pas le panier (exercice 6.10). On écrit () => panier.vider().
8.2 Les principaux événements
<label for="nom">Nom</label>
<input id="nom" type="text">
<label for="rayon">Rayon</label>
<select id="rayon">
<option>Informatique</option>
<option>Littérature</option>
</select>
const nom = document.querySelector("#nom");
const rayon = document.querySelector("#rayon");
nom.addEventListener("input", () => console.log("input :", nom.value));
nom.addEventListener("change", () => console.log("change :", nom.value));
nom.addEventListener("keydown", (e) => console.log("keydown :", e.key));
rayon.addEventListener("change", () => console.log("change :", rayon.value));
On clique dans le champ, on tape « Tom », on efface le dernier caractère, on quitte le champ avec Tab, puis on choisit « Littérature » :
keydown : T
input : T
keydown : o
input : To
keydown : m
input : Tom
keydown : Backspace
input : To
keydown : Tab
change : To
change : Littérature
keydownse produit à l'enfoncement de chaque touche, avant que le caractère n'apparaisse ;e.keydonne la touche ("T","Backspace","Tab","Escape"…).inputse produit à chaque modification de la valeur, quelle qu'en soit l'origine (clavier, collage, dictée, correcteur) : c'est l'événement des réactions « pendant la frappe ».changese produit quand la modification est validée : à la sortie du champ pour un texte, immédiatement pour une liste, une case ou un bouton radio.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.