L’objet event
Au mur du musée, une plaque. Le cadre extérieur est #wall. Dedans, #plaque porte un lien, #seal. Le mot sur le lien est open, et href vaut /wing. Sous le mur, #slip dit encore blank.
Le navigateur remet un objet à la fonction. Le paramètre s’appelle event. event.type est la sorte d’événement. Un clic met cette chaîne à click. event.target est l’élément où le clic est tombé. event.currentTarget est l’élément où cet écouteur est posé. Les deux ne coïncident que si le clic et l’écouteur partagent un élément.
Le sceau est un lien. preventDefault annule le saut vers /wing. Après l’appel, event.defaultPrevented vaut true. Sans l’appel, le drapeau reste false. Le clic part ensuite vers l’extérieur : sceau, plaque, mur. stopPropagation sur la plaque coupe ce trajet, l’écouteur du mur ne tourne pas.
Le script de la page clique une fois sur le sceau. La ligne sous la plaque se lit click / seal / plaque / true / quiet. Ici on n’assigne pas onclick, on n’appelle pas removeEventListener, et on ne crée pas d’élément.
L’objet que le navigateur passe
La page d’avant était le porte-manteau. wool et silk n’avaient pas de paramètre et ne lisaient pas cet objet. Leur ligne était wool silk / 2 / peg. La page de la sonnette assignait onclick et lisait this. Pas celle-ci. getElementById ne donne que le mur, la plaque, le sceau et la fiche.
addEventListener ne fait encore que ranger la fonction. L’objet arrive quand le clic exécute la fonction, pas au moment de l’ajout. Lis currentTarget dans la fonction. Au retour, cette propriété vaut null.
Ce qu’un clic rapporte
La fiche commence par blank. Le texte du lien reste open. Lis les rangées dans l’ordre. Chaque extrait part de ce mur neuf, sauf la rangée de la page, qui est la démo en bas. Cette démo n’appelle pas removeEventListener.
📊 Ce qu’un clic rapporte
| Moment | Ce que tu lis | Texte de la fiche | Confusion facile |
|---|---|---|---|
écouteur sur le sceau, seal.click(), lire le type |
event.type |
click | lire l’id comme type |
| écouteur sur la plaque, clic sur le sceau, target | event.target.id |
seal | lire currentTarget |
| le même clic, currentTarget | event.currentTarget.id |
plaque | lire target |
preventDefault sur le sceau, puis le drapeau |
event.defaultPrevented |
true | croire que le lien part encore |
sans preventDefault |
event.defaultPrevented |
false | croire que chaque écouteur annule le lien |
stopPropagation sur la plaque, le mur écoute aussi |
marks joints | plaque | attendre plaque wall |
script de la page, un click |
la ligne | click / seal / plaque / true / quiet | la ligne finit par wall |
Un clic sur le sceau est un seul objet. Chaque écouteur sur le trajet voit le même. type ne change pas. target ne change pas. currentTarget change : c’est l’élément dont l’écouteur tourne maintenant.
preventDefault parle à l’action par défaut du navigateur. Pour ce lien, c’est suivre /wing. L’appel ne retire pas un écouteur de la liste. stopPropagation parle au trajet. Il n’annule pas le lien. Appeler l’un n’appelle pas l’autre.
join(" ") ne met un espace qu’entre des mots déjà dans marks. On ne joint pas une liste vide ici. La fiche commence par le mot blank et ne change que dans un écouteur, ou dans le script de la page après le clic.
Le type
L’écouteur est sur le sceau. La fonction nomme le paramètre event et écrit event.type sur la fiche. Ensuite seal.click() la lance.
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function readType(event) {
slip.textContent = event.type;
}
seal.addEventListener("click", readType);
seal.click();
console.log(slip.textContent);
La sortie est click. Le type est la sorte d’événement, pas l’id et pas le mot open.
L’élément sous le clic
Mur neuf. L’écouteur est sur la plaque, pas sur le sceau. Le clic tombe quand même sur le sceau. event.target est cet élément, donc event.target.id vaut seal.
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function readTarget(event) {
slip.textContent = event.target.id;
}
plaque.addEventListener("click", readTarget);
seal.click();
console.log(slip.textContent);
La sortie est seal. L’élément de l’écouteur est la plaque. target ne nomme pas la plaque. Il nomme l’élément sous le clic.
Où l’écouteur est posé
Même mur neuf, écouteur toujours sur la plaque, clic toujours sur le sceau. La fiche écrit les deux id, target d’abord, puis currentTarget.
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function readWhere(event) {
slip.textContent = event.target.id + " " + event.currentTarget.id;
}
plaque.addEventListener("click", readWhere);
seal.click();
console.log(slip.textContent);
La sortie est seal plaque. Le premier mot est le clic. Le second est l’élément qui porte cet écouteur. Pose l’écouteur sur le sceau et clique le sceau : les deux id valent seal, car le clic et l’écouteur partagent un élément. Cette lecture passe par la plaque, donc les id diffèrent. Lis currentTarget dans la fonction. Au retour, il vaut null.
Annuler le lien
Le href du sceau est /wing. L’action par défaut de ce clic est de suivre le lien. preventDefault annule cette action. Il ne retire pas l’écouteur. Juste après, event.defaultPrevented vaut true.
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function hold(event) {
event.preventDefault();
slip.textContent = String(event.defaultPrevented);
}
seal.addEventListener("click", hold);
seal.click();
console.log(slip.textContent);
La sortie est true. Sans preventDefault, la même lecture vaut false. La fiche dirait false, et l’action du lien resterait. stopPropagation ne pose pas ce drapeau.
Le clic part vers l’extérieur
Le sceau est dans la plaque, la plaque dans le mur. Un clic sur le sceau atteint l’écouteur de la plaque, puis celui du mur, sauf si le trajet est coupé. stopPropagation sur la plaque le coupe. La fonction du mur ne tourne pas. preventDefault ne coupe pas le trajet.
let wall = document.getElementById("wall");
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
let marks = [];
function onPlaque(event) {
marks.push("plaque");
event.stopPropagation();
}
function onWall() {
marks.push("wall");
}
plaque.addEventListener("click", onPlaque);
wall.addEventListener("click", onWall);
seal.click();
slip.textContent = marks.join(" ");
console.log(slip.textContent);
La sortie est plaque. Le mot wall n’entre pas dans marks. Sans stopPropagation, le même clic écrirait plaque wall. La démo du bas coupe le trajet et annule aussi le lien.
Une ligne sous la plaque
Le script est à la fin du body, une fois le mur et les paragraphes en place. L’écouteur du sceau appelle preventDefault. Celui de la plaque appelle stopPropagation, puis garde le type, l’id de target, l’id de currentTarget et le drapeau. Celui du mur mettrait heard à wall, mais le trajet est déjà coupé, donc heard reste quiet. La ligne s’écrit après seal.click(), quand le mur a eu sa chance.
<!DOCTYPE html>
<html>
<head>
<title>event-object — page</title>
</head>
<body>
<div id="wall">
<div id="plaque">
<a id="seal" href="/wing">open</a>
</div>
</div>
<p id="slip">blank</p>
<p id="line">…</p>
<script>
let wall = document.getElementById("wall");
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
let kind = "";
let from = "";
let on = "";
let held = "";
let heard = "quiet";
seal.addEventListener("click", function (event) {
event.preventDefault();
});
plaque.addEventListener("click", function (event) {
event.stopPropagation();
kind = event.type;
from = event.target.id;
on = event.currentTarget.id;
held = String(event.defaultPrevented);
});
wall.addEventListener("click", function () {
heard = "wall";
});
seal.click();
slip.textContent = kind + " " + from + " " + on;
document.getElementById("line").textContent =
kind + " / " + from + " / " + on + " / " + held + " / " + heard;
</script>
</body>
</html>
La ligne se lit click / seal / plaque / true / quiet. Le type est click. L’id de target est seal. L’id de currentTarget est plaque, car cet écouteur est sur la plaque. Le drapeau est true, car l’écouteur du sceau a appelé preventDefault avant la lecture par la plaque. Le dernier mot est quiet, pas wall, car stopPropagation a tourné sur la plaque. Le texte open n’est pas dans la ligne. La fiche devient click seal plaque. La page suivante est la délégation. Le sceau est déjà dans le balisage. Ici on n’ajoute pas d’enfant après l’écouteur.
Cinq contrôles à la plaque
- Pose l’écouteur sur le sceau et clique. La fiche est click.
- Pose l’écouteur sur la plaque, clique le sceau, lis
event.target.id. La fiche est seal. - Le même écouteur écrit les deux id. La fiche est seal plaque. Un écouteur sur le sceau lui-même écrirait seal seal.
- Appelle
preventDefault, puis lisevent.defaultPrevented. La fiche est true. Sans l’appel, elle est false. - Appelle
stopPropagationsur la plaque pendant que le mur écoute aussi. marks se joint en plaque. Lis la ligne : click / seal / plaque / true / quiet.
Où cette plaque trompe
Le lien dit encore open. La fiche n’est pas le texte du lien.
- Attendre que l’argument de la fonction soit l’élément sceau, et non l’objet d’événement
- Lire
event.targetalors que tu voulais l’élément de l’écouteur - Lire
event.currentTargetalors que tu voulais l’élément sous le clic - Attendre que
preventDefaultretire l’écouteur, commeremoveEventListenerau porte-manteau - Attendre que
stopPropagationannule le saut vers/wing - Attendre que l’écouteur du mur tourne encore après
stopPropagationsur la plaque - Lire
event.currentTargetaprès le retour de la fonction et attendre plaque - Assigner
onclick, ou lirethisettypeof null; c’était la sonnette - Construire le lien avec
createElement; c’était une page plus ancienne - Lire la ligne comme si elle finissait par wall, ou comme wool silk / 2 / peg
Ce qui reste
event.typeaprès un clic vaut click- Écouteur sur la plaque et clic sur le sceau :
event.target.idvaut seal - Sur ce même clic,
event.currentTarget.idvaut plaque - Écouteur sur le sceau : target et currentTarget valent tous deux seal
preventDefaultmetevent.defaultPreventedà true ; sans l’appel, false restestopPropagationsur la plaque empêche l’écouteur du mur- La ligne se lit click / seal / plaque / true / quiet
🧠 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