EMZETT.
Login

Kurz: Webseiten reagieren auf Ereignisse: Klicks, Tastendrücke, Formulare, Mausbewegungen. Mit addEventListener legst du fest, welche Funktion dann laufen soll.

Teil des Kurses JavaScript

Kapitel 29 von 40 im Kurs JavaScript. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Webseiten reagieren auf Ereignisse: Klicks, Tastendrücke, Formulare, Mausbewegungen. Mit addEventListener legst du fest, welche Funktion dann laufen soll.

events1.html

<button id="b">Klick mich</button>
<p id="ausgabe">noch nichts</p>
<script>
  const b = document.getElementById("b");
  let zaehler = 0;
  b.addEventListener("click", (event) => {
    zaehler++;
    document.getElementById("ausgabe").textContent =
      `Klick Nr. ${zaehler} auf <${event.target.tagName.toLowerCase()}>`;
  });
</script>

Häufige Ereignisse

EreignisWann
click, dblclickKlick, Doppelklick
inputWert eines Felds ändert sich (bei jedem Tastendruck)
changeWert wurde bestätigt
submitFormular wird abgeschickt
keydown, keyupTaste gedrückt/losgelassen
mouseover, mouseout, mousemoveMaus
pointerdown, pointerup, pointermoveMaus, Touch und Stift einheitlich
focus, blurFokus erhalten/verloren
scroll, resizeScrollen, Fenstergröße
DOMContentLoaded, loadSeite geladen

Das Event-Objekt

Die Funktion bekommt ein Objekt mit Details zum Ereignis:

events2.html

<input id="feld" placeholder="Tippe etwas">
<p id="info"></p>
<script>
  const feld = document.getElementById("feld");
  feld.addEventListener("keydown", (e) => {
    document.getElementById("info").textContent =
      `Taste: ${e.key}, Code: ${e.code}, Shift: ${e.shiftKey}`;
  });
  feld.addEventListener("input", (e) => console.log("Wert:", e.target.value));
</script>
EigenschaftBedeutung
e.targetElement, an dem das Ereignis entstand
e.currentTargetElement, an dem der Listener hängt
e.key, e.codegedrückte Taste
e.clientX, e.clientYMausposition im Fenster
e.preventDefault()Standardverhalten verhindern
e.stopPropagation()Weitergabe nach oben stoppen

Standardverhalten verhindern

events3.html

<a id="link" href="https://example.com">Normaler Link</a>
<form id="f"><input name="q" value="test"><button>Senden</button></form>
<p id="ausgabe"></p>
<script>
  document.getElementById("link").addEventListener("click", (e) => {
    e.preventDefault();                              // Link nicht öffnen
    document.getElementById("ausgabe").textContent = "Link blockiert";
  });
  document.getElementById("f").addEventListener("submit", (e) => {
    e.preventDefault();                              // Seite nicht neu laden
    const daten = new FormData(e.target);
    document.getElementById("ausgabe").textContent = "Formular: " + daten.get("q");
  });
</script>

Bubbling und Delegation

Ereignisse steigen auf: Ein Klick auf ein <li> löst die Listener am <li>, dann am <ul>, am <body> usw. aus (Bubbling). Das nutzt man für Event Delegation: Ein einziger Listener am Elternelement bedient viele (auch später hinzugefügte) Kinder:

events4.html

<ul id="liste">
  <li>Eins</li><li>Zwei</li><li>Drei</li>
</ul>
<button id="neu">Neuer Eintrag</button>
<p id="ausgabe"></p>
<script>
  const liste = document.getElementById("liste");
  liste.addEventListener("click", (e) => {
    const li = e.target.closest("li");
    if (!li) return;
    document.getElementById("ausgabe").textContent = "Gewählt: " + li.textContent;
    li.classList.toggle("fertig");
    li.style.textDecoration = li.classList.contains("fertig") ? "line-through" : "";
  });
  let n = 3;
  document.getElementById("neu").addEventListener("click", () => {
    const li = document.createElement("li");
    li.textContent = "Eintrag " + (++n);
    liste.append(li);
  });
</script>

Neue Einträge funktionieren sofort, ohne dass du einen weiteren Listener anmeldest.

Listener entfernen und Optionen

function einmal(e) { console.log("nur einmal", e.type); }
btn.addEventListener("click", einmal);
btn.removeEventListener("click", einmal);       // dieselbe Funktion nötig
 
btn.addEventListener("click", () => {}, { once: true });      // nach dem ersten Mal automatisch entfernt
window.addEventListener("scroll", () => {}, { passive: true }); // verspricht, nicht preventDefault zu rufen
 
const abbruch = new AbortController();
btn.addEventListener("click", () => {}, { signal: abbruch.signal });
abbruch.abort();                                // entfernt alle Listener dieses Signals

Verwende addEventListener statt onclick="..." im HTML. So bleiben HTML und JavaScript getrennt, und du kannst mehrere Listener anmelden.

Tastatur-Bedienung

Baue Funktionen so, dass sie auch per Tastatur gehen: Nutze <button> statt <div> mit Klick-Listener (Buttons sind fokussierbar und reagieren auf Enter/Leertaste), und prüfe bei eigenen Tastenkürzeln e.key.

document.addEventListener("keydown", (e) => {
  if (e.key === "Escape") schliesseDialog();
  if (e.ctrlKey && e.key.toLowerCase() === "k") { e.preventDefault(); oeffneSuche(); }
});

Eigene Ereignisse

const el = new EventTarget();          // oder ein beliebiges DOM-Element
el.addEventListener("meldung", (e) => console.log("Detail:", e.detail));
el.dispatchEvent(new CustomEvent("meldung", { detail: { id: 1 } }));

Ausgabe:

Detail: { id: 1 }

Merke

  • addEventListener("click", funktion) meldet eine Reaktion an
  • Das Event-Objekt liefert target, key, Position usw.
  • preventDefault() verhindert das Standardverhalten (Link, Formular)
  • Ereignisse steigen auf: Event Delegation spart Listener
  • Nutze Buttons und Formularelemente, damit alles per Tastatur geht

Übungsaufgabe

Baue eine Liste mit Event Delegation: Ein Klick auf einen Eintrag hakt ihn ab; ein Eingabefeld mit Button fügt neue Einträge hinzu.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Das DOM: Elemente finden und ändern

Weiter: Formulare und Eingaben

Alle Kapitel: JavaScript im Überblick