Karte
Klicke auf den Button – beide Listener feuern.
Events wandern oft vom geklickten Element zu den Eltern hoch – das nennt man Bubbling. Genau das nutzt Event Delegation: Ein Listener am Eltern-Element reicht für viele Kinder.
Klickst du auf ein Element, startet das Event dort – und steigt danach die Eltern-Kette nach oben. Wie eine Luftblase im Wasser: vom Kind zum Eltern-Element, weiter zum Großeltern-Element, bis zum Document.
Deshalb kann ein Listener am Eltern-Element auch reagieren, wenn du eigentlich auf ein Kind geklickt hast.
1<div id="karte">
2 <button id="btn">Klick</button>
3</div>1const karte = document.getElementById("karte");
2const btn = document.getElementById("btn");
3
4karte.addEventListener("click", function() {
5 console.log("Karte");
6});
7
8btn.addEventListener("click", function() {
9 console.log("Button");
10});Karte
Klicke auf den Button – beide Listener feuern.
Die Reihenfolge ist immer gleich: zuerst das Element, das du wirklich angeklickt hast, danach seine Eltern von innen nach außen.
Beispiel: Button in einer Karte in einem äußeren Bereich → zuerst Button, dann Karte, dann äußerer Bereich.
1// Klick auf den Button:
2// 1. Button (Ziel)
3// 2. Innere Karte
4// 3. Äußerer BereichKlicke auf den Button und sieh die Reihenfolge.
Manchmal soll nur das Kind reagieren – nicht auch noch der Eltern-Listener. Mit event.stopPropagation() stoppst du das Weiterwandern nach oben.
1<div id="karte">
2 <button id="btn">Details</button>
3</div>1const karte = document.getElementById("karte");
2const btn = document.getElementById("btn");
3
4karte.addEventListener("click", function() {
5 console.log("Karte");
6});
7
8btn.addEventListener("click", function(event) {
9 event.stopPropagation();
10 console.log("Nur Button");
11});Karte
Klicke Button vs. Karte – beim Button stoppt stopPropagation().
Bei Event Delegation setzt du einen Listener auf ein Elternelement statt viele Listener auf jedes Kind.
Das spart Code und funktioniert auch für Elemente, die später erst erzeugt werden – weil der Listener schon am Eltern-Element hängt.
1<ul id="liste">
2 <li><button class="item">Aufgabe 1</button></li>
3 <li><button class="item">Aufgabe 2</button></li>
4</ul>1const liste = document.getElementById("liste");
2
3liste.addEventListener("click", function(event) {
4 if (event.target.matches(".item")) {
5 console.log("Geklickt:", event.target.textContent);
6 }
7});Ein Listener am Eltern-Element – klicke eine Aufgabe.
Praktisch: Du hängst den Listener an die Liste oder den Container. Beim Klick prüfst du mit event.target, welches Kind getroffen wurde.
1<ul id="nav">
2 <li>Start</li>
3 <li>Kurse</li>
4 <li>Kontakt</li>
5</ul>1const nav = document.getElementById("nav");
2
3nav.addEventListener("click", function(event) {
4 if (event.target.tagName === "LI") {
5 console.log("Punkt:", event.target.textContent);
6 }
7});Listener hängt an der Liste, nicht an jedem li.
In einem Container gibt es oft verschiedene Klickziele. Mit event.target.matches(".loeschen") prüfst du, ob genau das richtige Element (oder Selektor) getroffen wurde.
Passt es nicht, ignorierst du den Klick – so reagierst du nur auf die Buttons, die du meinst.
1liste.addEventListener("click", function(event) {
2 if (event.target.matches(".loeschen")) {
3 console.log("Löschen:", event.target.dataset.name);
4 }
5});Nur Klicks auf .loeschen werden ausgewertet.
Neue Elemente, die du per JavaScript erzeugst, haben oft noch keinen eigenen Listener. Mit Delegation ist das egal: Der Listener am Eltern-Element gilt auch für Kinder, die erst später dazukommen.
1<button id="addBtn">Hinzufügen</button>
2<ul id="liste"></ul>1const liste = document.getElementById("liste");
2const addBtn = document.getElementById("addBtn");
3
4liste.addEventListener("click", function(event) {
5 if (event.target.matches(".item")) {
6 console.log(event.target.textContent);
7 }
8});
9
10addBtn.addEventListener("click", function() {
11 const li = document.createElement("li");
12 const btn = document.createElement("button");
13 btn.className = "item";
14 btn.textContent = "Neuer Eintrag";
15 li.appendChild(btn);
16 liste.appendChild(li);
17});Neue Einträge brauchen keinen eigenen Listener – Delegation reicht.
Merksatz: Events blubbern nach oben. Mit Delegation reicht ein Eltern-Listener; mit matches() filterst du die richtigen Kinder – auch neue.
Im nächsten Kapitel lernst du: Event Listener verwalten