# JS 04: DOM-Manipulation & Events đ
Willkommen zu **Modul 04** des JavaScript-Kurses!
Das **Document Object Model (DOM)** ist die Schnittstelle zwischen JavaScript und der sichtbaren HTML-Struktur im Webbrowser. Durch die Kombination aus DOM-Selektoren, Manipulation und Event-Listenern hauchst du statischen Webseiten echtes Leben ein und machst sie interaktiv.
---
## đĄ 1. Das Wichtigste in KĂźrze
### A. Was ist das DOM?
Der Browser parst HTML-Code und baut daraus einen hierarchischen Baum aus JavaScript-Objekten (*DOM Tree*):
```
document
â
âââââ´ââââ
â âââââ´âââââââââ
(Container)
âââââ´ââââ
â
```
Jeder HTML-Tag wird zu einem **DOM-Element (Node)** mit Eigenschaften und Methoden, die du in JavaScript zur Laufzeit auslesen und verändern kannst.
---
### B. Elemente selektieren
Moderne Selektoren nutzen dieselbe Syntax wie CSS:
```javascript
// Einzelnes Element selektieren (erstes Vorkommen):
const ueberschrift = document.querySelector("h1");
const speicherBtn = document.querySelector("#save-btn");
const erstesItem = document.querySelector(".liste-item");
// Mehrere Elemente selektieren (NodeList / Collection):
const alleButtons = document.querySelectorAll(".btn");
alleButtons.forEach(btn => console.log(btn.textContent));
```
---
### C. Element-Inhalte & Klassen manipulieren
```javascript
const box = document.querySelector("#info-box");
// 1. Textinhalt sicher ändern (schßtzt vor XSS-Sicherheitslßcken):
box.textContent = "Neuer sicherer Text";
// 2. CSS-Klassen verwalten mit classList:
box.classList.add("aktiv"); // Klasse hinzufĂźgen
box.classList.remove("inaktiv"); // Klasse entfernen
box.classList.toggle("sichtbar"); // HinzufĂźgen falls fehlt, sonst entfernen
console.log(box.classList.contains("aktiv")); // true oder false
```
---
### D. Event-Listener (Ereignis-Steuerung)
Mit `addEventListener()` reagiert deine Webanwendung auf Benutzerinteraktionen wie Klicks, Tastatureingaben oder Formulare:
```javascript
const button = document.querySelector("#klick-mich");
button.addEventListener("click", (event) => {
console.log("Button wurde angeklickt!", event.target);
button.textContent = "Erfolgreich geklickt! đ";
});
```
---
### E. Dynamische Elemente erstellen
Du kannst neue HTML-Elemente dynamisch zur Laufzeit erzeugen und in den DOM-Baum einhängen:
```javascript
// 1. Element im Speicher erzeugen:
const neuesLi = document.createElement("li");
neuesLi.textContent = "Neuer dynamischer Eintrag";
neuesLi.classList.add("eintrag");
// 2. In den DOM-Baum an ein Elternelement anfĂźgen:
const liste = document.querySelector("#aufgaben-liste");
liste.appendChild(neuesLi);
```
---
## đź Die didaktische Analogie: "Der Dirigent des Web-Orchesters"
- **Das HTML-Dokument als Partitur:**
HTML liefert den statischen Notentext und die Struktur des MusikstĂźcks.
- **Der Browser als Orchester:**
Die Musiker (DOM-Nodes) sitzen bereit, um TĂśne und Farben darzustellen.
- **JavaScript als Dirigent:**
- **Selektoren (`querySelector`):** Der Dirigent schaut gezielt zu den Streichern oder Bläsern.
- **Manipulation (`textContent`, `classList`):** Mit dem Taktstock gibt der Dirigent Anweisungen fßr Lautstärke, Helligkeit oder Text.
- **Events (`addEventListener`):** Der Dirigent wartet auf den Einsatz oder den Applaus des Publikums und reagiert dynamisch.
---
## đď¸ Headless- & Isolierte Logik (Testbare Architektur)
In moderner Web-Entwicklung (wie React, Vue oder Node.js) trennen professionelle Entwickler reine **Berechnungs- und Zustandslogik** von direkten DOM-Zugriffen.
Dadurch kĂśnnen Funktionen wie `aktualisiereZaehlerAnzeige` oder `filtereElementeNachKlasse` sowohl im echten Browser als auch in **Headless-Umgebungen (z.B. Unittests im Web-Worker / CI-Runner)** blitzschnell und ohne echten Monitor getestet werden!
---
## đŻ Aufgaben & Teilziele in `aufgabe.js`
Ăffne `aufgabe.js` und lĂśse die 4 Aufgaben:
1. **TODO 1:** `erzeugeButtonElement(text, cssKlasse, clickCallback)`
Erstelle einen Button (`document.createElement("button")`), setze den Text, fĂźge optional die CSS-Klasse hinzu und binde den Click-Callback per `addEventListener` an.
2. **TODO 2:** `erstelleListenEintrag(titel, istErledigt = false)`
Erstelle ein ` `-Element mit dem Titel und fĂźge die Klasse `"erledigt"` hinzu, falls `istErledigt === true` ist.
3. **TODO 3:** `filtereElementeNachKlasse(elementListe, cssKlasse)`
Filtere ein Array von DOM-Elementen nach `element.classList.contains(cssKlasse)`.
4. **TODO 4:** `aktualisiereZaehlerAnzeige(aktuellerWert, schwellenwert = 10)`
Berechne das Zustands-Objekt fßr eine Zähler-Komponente:
```javascript
{
text: `Zähler: ${aktuellerWert} / ${schwellenwert}`,
wert: aktuellerWert,
istKritisch: aktuellerWert >= schwellenwert,
statusKlasse: aktuellerWert >= schwellenwert ? "status-kritisch" : "status-normal"
}
```
---
## đ§Ş Tests ausfĂźhren
Starte die Tests im Test-Runner oder in der Web-IDE. Sobald alle Tests grĂźn sind, hast du DOM-Manipulation & Events gemeistert!