Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m291:learningunits:lu04:theorie:b_events [2026/03/01 21:20] – angelegt gkoch | de:modul:m291:learningunits:lu04:theorie:b_events [2026/03/01 21:44] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== LU04b – Events & State ====== | ====== LU04b – Events & State ====== | ||
| + | |||
| ===== Events & EventListener ===== | ===== Events & EventListener ===== | ||
| - | Ein **Event** ist ein Signal, das der Browser aussendet, wenn etwas passiert – ein Klick, eine Tastatureingabe, | + | Ein **Event** ist ein Signal, das der Browser aussendet, wenn etwas passiert – ein Klick, eine Tastatureingabe, |
| - | <WRAP tip> | + | < |
| + | <code javascript> | ||
| + | const btn = document.querySelector('# | ||
| + | |||
| + | btn.addEventListener(' | ||
| + | console.log(' | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP round center | ||
| **Verbindung zum Alarado-Projekt: | **Verbindung zum Alarado-Projekt: | ||
| </ | </ | ||
| - | ==== addEventListener – Grundprinzip ==== | ||
| - | <code javascript> | + | ===== Die wichtigsten Event-Typen ===== |
| - | const btn = document.querySelector('# | + | |
| - | // Syntax: element.addEventListener(eventTyp, funktion) | + | ==== Allgemeine Interaktion ==== |
| - | btn.addEventListener(' | + | <WRAP box round center 80%> |
| - | | + | ^ Event ^ Wann? ^ Einsatz ^ |
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | </ | ||
| + | <WRAP box round center 80%> | ||
| + | <code javascript> | ||
| + | // Tastatur: Escape schliesst ein Element | ||
| + | document.addEventListener(' | ||
| + | | ||
| + | panel.classList.remove('open'); | ||
| + | } | ||
| }); | }); | ||
| - | // Kürzer mit Arrow Function: | + | // JS erst ausführen, wenn das DOM bereit ist |
| - | btn.addEventListener(' | + | document.addEventListener(' |
| - | | + | |
| + | // ... | ||
| }); | }); | ||
| </ | </ | ||
| + | </ | ||
| - | ==== Wichtige Event-Typen | + | ===== Pointer Events (moderner Standard) ===== |
| - | ^ Event ^ Wann wird es ausgelöst? ^ Typischer Einsatz | + | Pointer Events sind der **aktuelle Standard** für alle Zeigereingaben. Sie decken Maus, Touchscreen und Stift mit einem einzigen Event-System ab – und ersetzen damit die älteren separaten Maus- und Touch-Events. |
| - | | '' | + | <WRAP box round center 80%> |
| - | | '' | + | ^ Event ^ Wann? ^ |
| - | | '' | + | | '' |
| - | | '' | + | | '' |
| - | | '' | + | | '' |
| - | | '' | + | | '' |
| - | | '' | + | | '' |
| - | + | | '' | |
| - | ==== Das Event-Objekt ==== | + | </ |
| - | Jeder Handler erhält automatisch ein **Event-Objekt** als Parameter – darin stecken nützliche Informationen: | ||
| + | ==== Beispiel: Hover und Klick mit Pointer Events ==== | ||
| + | <WRAP box round center 60%> | ||
| <code javascript> | <code javascript> | ||
| - | btn.addEventListener('click', (event) => { | + | const box = document.querySelector('.box'); |
| - | // event.target → das Element, das geklickt wurde | + | |
| - | console.log(event.target); | + | |
| - | // event.key → bei Tastaturevents: | + | box.addEventListener('pointerenter', |
| - | | + | |
| }); | }); | ||
| - | // Keyboard: Enter und Space wie Click behandeln | + | box.addEventListener(' |
| - | btn.addEventListener(' | + | |
| - | if (event.key === 'Enter' | + | }); |
| - | | + | |
| + | box.addEventListener(' | ||
| + | // Welches Gerät wird verwendet? | ||
| + | if (event.pointerType | ||
| + | console.log(' | ||
| + | } else if (event.pointerType | ||
| + | | ||
| + | } else if (event.pointerType === ' | ||
| + | console.log(' | ||
| } | } | ||
| }); | }); | ||
| </ | </ | ||
| + | </ | ||
| - | > **Tipp:** Wenn Sie '' | + | <WRAP round center 80% important> |
| + | **Ältere Alternativen:** '' | ||
| + | </ | ||
| - | ---- | + | |
| + | ===== Das Event-Objekt ===== | ||
| + | |||
| + | Alle Handler erhalten automatisch ein **Event-Objekt** als Parameter: | ||
| + | <WRAP box round center 80%> | ||
| + | ^ Eigenschaft / Methode ^ Beschreibung ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | <code javascript> | ||
| + | // Beispiel: Link-Klick abfangen | ||
| + | document.querySelector(' | ||
| + | event.preventDefault(); | ||
| + | console.log(' | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| ===== State – Zustand im UI ===== | ===== State – Zustand im UI ===== | ||
| Zeile 66: | Zeile 120: | ||
| Das Muster kennen Sie bereits vom Toggle: | Das Muster kennen Sie bereits vom Toggle: | ||
| + | <WRAP box round center 60%> | ||
| ^ Zustand ^ Klasse gesetzt? ^ '' | ^ Zustand ^ Klasse gesetzt? ^ '' | ||
| | geschlossen | '' | | geschlossen | '' | ||
| | offen | '' | | offen | '' | ||
| + | </ | ||
| ==== State aus dem DOM lesen ==== | ==== State aus dem DOM lesen ==== | ||
| Sie können den Zustand direkt aus dem DOM ablesen, ohne eine eigene Variable zu führen: | Sie können den Zustand direkt aus dem DOM ablesen, ohne eine eigene Variable zu führen: | ||
| + | <WRAP box round center 80%> | ||
| <code javascript> | <code javascript> | ||
| const panel = document.querySelector(' | const panel = document.querySelector(' | ||
| Zeile 80: | Zeile 135: | ||
| btn.addEventListener(' | btn.addEventListener(' | ||
| - | // Zustand aus dem DOM lesen | ||
| const istOffen = panel.classList.contains(' | const istOffen = panel.classList.contains(' | ||
| Zeile 90: | Zeile 144: | ||
| btn.setAttribute(' | btn.setAttribute(' | ||
| } | } | ||
| - | |||
| - | // Oder kürzer in einem Schritt: | ||
| - | // panel.classList.toggle(' | ||
| }); | }); | ||
| </ | </ | ||
| + | </ | ||
| ==== Alle anderen Panels schliessen ==== | ==== Alle anderen Panels schliessen ==== | ||
| - | Bei einem klassischen Accordion soll immer nur ein Panel offen sein. Beim Öffnen eines neuen Panels werden alle anderen geschlossen: | + | Bei einem klassischen Accordion soll immer nur ein Panel offen sein: |
| + | <WRAP box round center 80%> | ||
| <code javascript> | <code javascript> | ||
| const buttons = document.querySelectorAll(' | const buttons = document.querySelectorAll(' | ||
| Zeile 105: | Zeile 157: | ||
| buttons.forEach(btn => { | buttons.forEach(btn => { | ||
| btn.addEventListener(' | btn.addEventListener(' | ||
| - | const panel = btn.nextElementSibling; | + | const panel = btn.nextElementSibling; |
| const istOffen = panel.classList.contains(' | const istOffen = panel.classList.contains(' | ||
| Zeile 122: | Zeile 174: | ||
| }); | }); | ||
| </ | </ | ||
| + | </ | ||
| + | |||