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

Les événements : réagir aux actions du visiteur

Comprendre ce qu'est un événement, brancher une fonction avec addEventListener, utiliser l'objet événement (target, key), et réagir à la souris et au clavier.

1Situer

Le cinéma Rif de Tanger veut une page de réservation : on choisit le nombre de places avec des boutons + et −, l'affiche s'éclaire au survol de la souris, et le bouton « Réserver » affiche un récapitulatif. Rien de tout cela ne se passe au chargement de la page : le code doit attendre que le visiteur agisse. C'est la programmation événementielle.

2Comprendre

Un écouteur attend un événement
body p Places : 2 + 👆 plus.addEventListener(   'click', ajouter); écouteur installé e.type : 'click' e.target : <button#plus> places++ → 3 nb.textContent = places bouton → p → body : l'événement remonte

addEventListener('click', ajouter) installe un écouteur sur le bouton +. Rien ne s'exécute encore.

1 / 5

Qu’est-ce qu’un événement ?

Un événement est quelque chose qui arrive dans la page : un clic, une touche, la souris qui bouge, un champ modifié, la page chargée. Le programme attend et réagit : c’est la programmation événementielle.

addEventListener

const plus = document.querySelector('#plus');

plus.addEventListener('click', () => {    // type d'événement, fonction à exécuter
  places++;
  nb.textContent = places;
});
  • on peut brancher plusieurs fonctions sur le même événement ;
  • removeEventListener débranche une fonction nommée ;
  • l’ancienne façon onclick="..." dans le HTML est à éviter.

Les événements courants

FamilleÉvénements
souris (MouseEvents)click, dblclick, mouseover, mouseout, mousemove, mousedown, mouseup
clavierkeydown, keyup
formulaireinput, change, focus, blur, submit (leçon suivante)
pageDOMContentLoaded, load, scroll, resize

L’objet événement

La fonction reçoit un objet qui décrit l’événement :

document.addEventListener('click', (e) => {
  console.log(e.target);              // l'élément cliqué
  console.log(e.clientX, e.clientY);  // position de la souris
});
champ.addEventListener('keydown', (e) => {
  console.log('Touche :', e.key);     // "a", "Enter", "Escape"...
});

e.preventDefault() annule le comportement normal (suivre un lien, envoyer un formulaire). e.stopPropagation() empêche l’événement de remonter aux parents.

La propagation

Un clic sur un <li> est aussi un clic sur le <ul> qui le contient, puis sur le <body> : l’événement remonte (bouillonnement). On en profite pour écouter une seule fois sur le parent : c’est la délégation d’événements.

Exemple simple

La sonnette de la porte

On installe la sonnette une fois (addEventListener). Ensuite, à chaque fois que quelqu'un appuie (l'événement click), elle sonne (la fonction s'exécute). Entre deux visites, elle attend.

bouton.addEventListener('click', () => {
  console.log('Ding dong !');
});
Exemple simple

Savoir qui a sonné

La fonction reçoit un objet événement qui décrit ce qui s'est passé : sur quel élément (target), quelle touche (key), où était la souris (clientX).

document.addEventListener('keydown', (e) => {
  console.log('Touche :', e.key);
});

3Manipuler

Branchez les événements, puis testez-les dans l'aperçu : cliquez, survolez, tapez. Les consignes se cochent au fur et à mesure de vos essais.
Ouvrir dans le lab ↗
Console
  • Le bouton + augmente le nombre : cliquez jusqu'à afficher 5
  • Le bouton − diminue le nombre sans descendre sous 0 : descendez jusqu'à 0
  • Au survol de l'affiche (mouseover), ajoutez-lui la classe vue
  • Le bouton Réserver écrit le récapitulatif dans #recap, par exemple « Réservation : 3 places »
  • Dans le champ code, affichez chaque touche dans la console (« Touche : ... », événement keydown)

4Pratiquer

Exercice 1 · Le bon événement

Quel événement utiliser pour : (1) un clic sur un bouton ; (2) chaque caractère tapé dans un champ ; (3) le choix dans une liste <select> ; (4) la page entièrement chargée ; (5) la souris qui quitte une image ?

Voir le corrigé
1. click
2. input (ou keydown / keyup pour les touches)
3. change
4. DOMContentLoaded (HTML prêt) ou load (images comprises)
5. mouseout (ou mouseleave)

Exercice 2 · Un seul écouteur pour toute la liste

Une liste #films contient 30 <li>. Plutôt que 30 écouteurs, écrivez un seul écouteur sur la liste qui affiche le titre du film cliqué.

Voir le corrigé
document.querySelector('#films').addEventListener('click', (e) => {
  const li = e.target.closest('li');
  if (li) console.log('Film choisi :', li.textContent);
});
// L'événement « remonte » (bouillonnement) du li jusqu'à la liste :
// c'est la délégation d'événements.

Exercice 3 · Le raccourci clavier

Quand le visiteur appuie sur Échap, cachez l'élément #fenetre.

Voir le corrigé
document.addEventListener('keydown', (e) => {
  if (e.key === 'Escape') {
    document.querySelector('#fenetre').hidden = true;
  }
});

5Vérifier

1. Que fait bouton.addEventListener('click', afficher) ?
2. Dans un écouteur, que désigne e.target ?
3. Quelle est la différence entre mouseover et click ?