Écouteurs d’événements
Au vestiaire, un porte-manteau. Le bouton est #peg, le mot dessus est hang. En dessous, #ticket dit encore blank.
La page d’avant, c’était la sonnette et la propriété onclick. Là, une seule place. La deuxième fonction chassait la première. Ici on n’écrit pas cette propriété. typeof et this appartiennent aussi à cette page-là.
Ici, c’est addEventListener. L’appel ajoute la fonction à la liste de clic du bouton. Cette ligne ne l’exécute pas. Le ticket reste blank jusqu’à peg.click().
Tu ajoutes wool, puis silk. La seconde ne pousse pas la première dehors. Un clic lance les deux : wool d’abord, silk ensuite. Le ticket devient wool silk. Le mot du bouton reste hang.
Si tu passes deux fois la même fonction wool, le second appel n’ajoute rien. Un clic, un passage.
removeEventListener retire la fonction que tu as ajoutée. Une fonction neuve, même avec les mêmes lignes, est un autre objet. wool reste.
Le script de la page ajoute les deux et clique une fois. La ligne sous le porte-manteau est wool silk / 2 / peg. On ne crée pas d’élément, on n’écrit pas de style, et on ne lit pas l’argument d’événement. Ça, c’est la page suivante.
Deux crochets, pas une seule place
getElementById ne te donne que le bouton et le paragraphe du ticket. Chaque appel à addEventListener peut poser un autre écouteur à côté. Le clic parcourt la liste du début à la fin. Ces fonctions ne prennent pas de paramètre. L’objet événement vient ensuite.
Qui écoute
Le bouton commence avec hang, et blank en dessous. Lis les lignes dans l’ordre. Chaque extrait part de ce bouton neuf, sauf la ligne de la page : c’est la démo en bas. Cette démo ne retire personne.
📊 Qui écoute
| Moment | Qui écoute | Texte du ticket | Confusion facile |
|---|---|---|---|
click, pas encore d’écouteur |
personne | blank | un clic vide écrit wool |
addEventListener pour wool, avant click |
wool | blank | l’ajout lui-même écrit wool |
click avec wool seul |
wool | wool | le texte du bouton devient wool |
wool puis silk, un click |
les deux, wool puis silk | wool silk | seul le second tourne |
removeEventListener pour wool, puis click |
silk | silk | les deux tournent encore |
script de la page, un click |
les deux | wool silk | la ligne finit par hang |
addEventListener("click", wool) met wool au bout de la liste de clic. Il n’appelle pas wool. peg.click() envoie un clic et parcourt la liste depuis le début. Le texte du bouton ne change pas.
silk, ajouté après, se place derrière wool. Les deux tournent. L’ordre est l’ordre d’ajout.
Le même objet fonction n’est pas ajouté deux fois. peg.addEventListener("click", wool) puis la même ligne laissent une liste d’un seul. Un clic lance wool une fois. parts.length vaut 1 et le ticket est wool.
removeEventListener("click", wool) retire cet objet. silk reste, si tu l’as ajouté. Une fonction neuve qui fait aussi push de "wool" ne correspond pas. Après peg.removeEventListener("click", function () { parts.push("wool"); }), le wool d’origine est encore sur la liste. Un clic écrit encore wool.
join(" ") met seulement une espace entre les mots déjà dans parts. On ne joint pas une liste vide ici. Le ticket commence par le mot blank et ne change que dans un écouteur.
Personne n’écoute encore
Le fichier s’ouvre avec le bouton et le paragraphe. Aucun écouteur n’est ajouté. Le clic part, et ces deux journaux demandent le ticket et le mot du bouton.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
peg.click();
console.log(ticket.textContent);
console.log(peg.textContent);
Les journaux sont blank et hang. La liste de clic était vide. Le paragraphe n’a pas changé.
L’écouteur attend
addEventListener range wool. Le corps ne tourne pas sur cette ligne. parts reste vide, le ticket reste blank, le bouton dit encore hang.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
Les journaux sont blank, 0 et hang. wool est sur la liste. Personne ne l’a appelée, donc parts n’a pas de mot.
click lance ceux qui sont sur la liste
Cet extrait repart du bouton neuf. Seul wool est ajouté, puis peg.click(). Le ticket devient wool. Le texte du bouton reste hang. parts.length vaut 1.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.click();
console.log(ticket.textContent);
console.log(peg.textContent);
console.log(parts.length);
Les journaux sont wool, hang et 1. Un écouteur, un mot. hang est encore le bouton.
silk s’assoit à côté de wool
Bouton neuf. wool d’abord, silk ensuite, et seulement alors un click. Pas de clic entre les deux ajouts. wool pousse "wool" et l’écrit. silk pousse "silk" et écrit les deux mots avec une espace. Le ticket est wool silk. parts.length vaut 2. Le bouton reste hang.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.click();
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
Les journaux sont wool silk, 2 et hang. silk n’a pas effacé wool. Un clic a parcouru la liste dans l’ordre d’ajout.
Retirer wool du porte-manteau
Bouton neuf. Les deux fonctions sont ajoutées, puis removeEventListener est appelé avec la même fonction wool. silk reste. Un click ne lance que silk. Le ticket est silk, pas wool silk. parts.length vaut 1.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.removeEventListener("click", wool);
peg.click();
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
Les journaux sont silk, 1 et hang. wool était le même objet que tu avais ajouté, donc il a quitté la liste. La démo du bas ne retire personne.
Une ligne sous le porte-manteau
Le script est à la fin du body, une fois le bouton et les paragraphes en place. Il ajoute wool, puis silk, puis appelle click une fois. Chaque fonction ajoute 1 à hits et pousse son mot. La ligne assemble le texte du ticket, le compte et peg.id. Elle n’écrit pas le texte du bouton. Elle ne lit pas d’argument d’événement.
<!DOCTYPE html>
<html>
<head>
<title>event-listeners — page</title>
</head>
<body>
<button id="peg" type="button">hang</button>
<p id="ticket">blank</p>
<p id="line">…</p>
<script>
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
let hits = 0;
function wool() {
hits = hits + 1;
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
hits = hits + 1;
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.click();
document.getElementById("line").textContent =
ticket.textContent + " / " + hits + " / " + peg.id;
</script>
</body>
</html>
La ligne est wool silk / 2 / peg. Le ticket est wool silk, pas blank. Le compte est 2, parce que les deux écouteurs ont tourné sur un seul clic. Le dernier mot est l’id du bouton, peg.id, pas le mot hang. Sur le bouton, c’est encore hang. La page suivante est l’objet événement. Elle lit l’argument que ces fonctions ne prennent pas.
Cinq vérifications au porte-manteau
- Clique sans écouteur. Le ticket est blank et le bouton est hang.
- Ajoute wool et ne clique pas. Le ticket est blank,
parts.lengthvaut 0, le bouton est hang. - Ajoute wool, puis clique. Le ticket est wool, le bouton est hang,
parts.lengthvaut 1. - Ajoute wool, puis silk, puis clique une fois. Le ticket est wool silk,
parts.lengthvaut 2, le bouton est hang. - Ajoute les deux, retire wool, puis clique. Le ticket est silk,
parts.lengthvaut 1, le bouton est hang. Lis la ligne de la page : wool silk / 2 / peg.
Où ce porte-manteau trompe
Sur le bouton, c’est encore hang. La liste avait les deux fonctions, ou seulement silk, ou personne.
- Attendre que le second
addEventListenerremplace le premier, commeonclick - Attendre que
addEventListenerlui-même mette le ticket à wool - Attendre que seul silk tourne quand les deux sont ajoutés
- Attendre que le texte du bouton devienne wool
- Attendre que
removeEventListeneravec une fonction neuve retire wool - Ajouter deux fois la même fonction
woolet attendre deux passages - Lire ici
onclick,typeof nullouthis.id; c’était la page de la sonnette - Lire ici
event.target; ces fonctions ne prennent pas d’argument, l’objet événement est la page suivante - Construire le bouton avec
createElement; c’était une page plus ancienne - Lire la ligne comme blank / 0 / hang
Ce qui reste
- Sans écouteur,
peg.click()laisse le ticket blank et le bouton hang addEventListenerlaisse le ticket blank jusqu’auclick- Un clic avec wool seul met le ticket à wool et laisse le bouton hang
- wool puis silk, puis un clic, met le ticket à wool silk
removeEventListeneravec le même wool, puis le clic, met le ticket à silk- Le même wool ajouté deux fois tourne une fois, et une fonction neuve ne le retire pas
- La ligne de la page est wool silk / 2 / peg
🧠 Testez Vos Connaissances
Testez Vos Connaissances
Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut