diff --git a/slides/223015c/03-interaktivitaet-javascript.md b/slides/223015c/03-interaktivitaet-javascript.md index 1469e33..9727612 100644 --- a/slides/223015c/03-interaktivitaet-javascript.md +++ b/slides/223015c/03-interaktivitaet-javascript.md @@ -14,220 +14,210 @@ title: "Kapitel 3: Interaktivität & JavaScript" --color-highlight: #d63384; --color-dimmed: #4a4a6a; } -section.invert { - --color-foreground: #fff; -} -section { - font-size: 1.7rem; -} -h1 { - color: #a02060; /* darker raspberry */ -} -section.invert h1 { - color: #fff; -} -h2 { - color: #1f2937; /* dark gray, almost black */ -} +section.invert { --color-foreground: #fff; } +section { font-size: 1.7rem; } +h1 { color: #a02060; } +section.invert h1 { color: #fff; } +h2 { color: #1f2937; } pre { background: #0f0f23; color: #d63384; border-radius: 8px; border-left: 3px solid #d63384; } -pre code { - background: transparent; - color: inherit; -} +pre code { background: transparent; color: inherit; } code { - background: #1a1a2e; - color: #d63384; + background: #0f0f23; padding: 0.15em 0.4em; border-radius: 4px; + font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; } -a { - color: var(--color-highlight); -} -section.klausur { - background: repeating-linear-gradient( - 135deg, - #fce4ec, - #fce4ec 40px, - #fff 40px, - #fff 80px - ) !important; -} -@media print { - section.klausur { - background: #fce4ec !important; - } -} -section.aufgabe { - background: #fce4ec !important; -} -section.aufgabe footer { - display: none; -} +section code:not(.hljs) { color: #d63384 !important; } +section code.hljs { color: #f8f8f8 !important; } +a { color: var(--color-highlight); } +section.aufgabe { background: #fce4ec !important; } +section.aufgabe footer { display: none; } +section.erklaerung { font-size: 1.1rem; } +section.erklaerung h1 { font-size: 1.5rem; color: #a02060; margin-bottom: 0.3rem; } - - - - - - - -# Grundlagen IT- und Internettechnik - -**223015c** · Modul "Technik 1" · 1. Semester -Digital- und Medienwirtschaft -Hochschule der Medien Stuttgart - -**Sommersemester 2026** - -[https://librete.ch/hdm/223015c/](https://librete.ch/hdm/223015c/) - ---- - - - - - - ---- - -# Kapitel 3 – 24.01.2026 +# Kapitel 3 ## Interaktivität & JavaScript ---- + --- -# Teil 1: JavaScript-Grundlagen -## Die Sprache des Webs +# „Statisch ist langweilig" + + --- -# Was ist JavaScript? +# Was kann JavaScript? -**Die einzige Programmiersprache, die im Browser läuft!** +| Kann | Beispiel | +|------|----------| +| DOM ändern | Element-Text, -Klasse, -Inhalt manipulieren | +| Events behandeln | Klick, Tastendruck, Scroll, Submit | +| Daten holen | `fetch()` API-Anfragen | +| Daten lokal speichern | `localStorage`, `sessionStorage` | +| Animationen | `requestAnimationFrame`, CSS-Animationen triggern | +| Web-APIs nutzen | Geolocation, Camera, Audio, Notification | -- **1995:** In 10 Tagen entwickelt (Brendan Eich, Netscape) -- **Heute:** Überall – Browser, Server, Apps, IoT - -**Nicht verwechseln:** -- Java ≠ JavaScript (komplett unterschiedlich!) -- "JavaScript ist zu Java wie Carpet zu Car" +**Aus Sicherheitsgründen NICHT:** willkürlich Dateien auf der Platte lesen/schreiben. --- # JavaScript-Timeline -| Jahr | Meilenstein | -|------|-------------| -| **1995** | JavaScript erfunden (Netscape) | -| **1997** | ECMAScript-Standard (ECMA-262) | -| **2005** | AJAX revolutioniert Web (Gmail, Google Maps) | -| **2008** | V8 Engine (Chrome) – JS wird schnell | -| **2009** | Node.js – JS auf dem Server | -| **2015** | ES6 – Modernes JavaScript | +| Jahr | Was | +|------|-----| +| **1995** | Brendan Eich entwickelt JS in 10 Tagen für Netscape | +| 1997 | ECMAScript-1 standardisiert (offizieller Name) | +| 2009 | **Node.js** — JS auch außerhalb des Browsers | +| **2015** | ES6 (große Erneuerung: `let`, `const`, arrow functions, classes, modules) | +| 2017+ | jährliche Updates (ES2017, ES2018, …) | +| heute | TypeScript als statisch-getypter Aufsatz | + +JS ist die **am weitesten verbreitete** Programmiersprache der Welt. --- # JavaScript einbinden -**Option 1: Externe Datei (empfohlen!)** ```html -
- - - -``` + + -**Option 2: Inline** -```html + + + + ``` -⚠️ Script am **Ende** des `` – damit HTML zuerst lädt! +**Modern:** als ES-Modul mit `type="module"`. Erlaubt `import` / `export`. --- -# Die Konsole: Euer bester Freund + + -**Browser DevTools → Console** -- Windows/Linux: `F12` oder `Strg+Shift+I` -- Mac: `Cmd+Option+I` - -```javascript -console.log("Hallo Welt!"); -console.log(42); -console.log("Die Antwort ist:", 42); -``` - -**Direkt in der Konsole tippen und Enter!** + --- -# Variablen: Daten speichern - - +# Variablen — Daten speichern ```javascript -// Modern (empfohlen) -let age = 25; // Kann geändert werden -const name = "Max"; // Konstante (nicht änderbar) +let name = "Ada"; // veränderlich +const PI = 3.14159; // konstant +var alt = "vermeiden"; // pre-ES6, hat skopen-bugs -// Alt (vermeiden!) -var city = "Stuttgart"; // Problematisches Scoping +// Verändern: +name = "Grace"; // OK +PI = 3.0; // FEHLER: const kann nicht überschrieben werden ``` -**Regeln:** -- Beginnt mit Buchstabe, `_` oder `$` -- Keine Leerzeichen, keine Sonderzeichen -- Case-sensitive: `name` ≠ `Name` +**Faustregel:** `const` als Default. Nur `let`, wenn man umzuweisen plant. Niemals `var`. --- @@ -235,276 +225,226 @@ var = alte Syntax, hat Scoping-Probleme # Datentypen ```javascript -// String (Text) -const text = "Hello"; -const text2 = 'World'; -const text3 = `Hello ${text2}`; // Template Literal +let text = "Hallo"; // string +let zahl = 42; // number +let ist_an = true; // boolean +let nichts = null; // null +let nicht_gesetzt; // undefined +let liste = [1, 2, 3]; // array +let objekt = { x: 1 }; // object -// Number (Zahl) -const integer = 42; -const decimal = 3.14; - -// Boolean (Wahrheitswert) -const isTrue = true; -const isFalse = false; - -// Undefined & Null -let unknown; // undefined -const nothing = null; // null (bewusst leer) +typeof text // "string" +typeof liste // "object" (auch arrays sind objects) ``` +**6 Grund-Typen** + objects/arrays. + --- -# Arrays: Listen + + - - -```javascript -const colors = ["red", "green", "blue"]; - -// Zugriff (0-basiert!) -console.log(colors[0]); // "red" -console.log(colors[2]); // "blue" - -// Länge -console.log(colors.length); // 3 - -// Hinzufügen/Entfernen -colors.push("yellow"); // Am Ende hinzufügen -colors.pop(); // Letztes entfernen -``` + --- -# Objects: Strukturierte Daten + + - + + + --- -# Operatoren +# Funktionen ```javascript -// Arithmetik -5 + 3 // 8 (Addition) -5 - 3 // 2 (Subtraktion) -5 * 3 // 15 (Multiplikation) -5 / 3 // 1.666... (Division) -5 % 3 // 2 (Modulo/Rest) -5 ** 3 // 125 (Potenz) - -// Vergleich -5 === 3 // false (strikt gleich) -5 !== 3 // true (strikt ungleich) -5 > 3 // true -5 >= 3 // true - -// Logisch -true && false // false (UND) -true || false // true (ODER) -!true // false (NICHT) -``` - - - ---- - -# Hands-On: Variablen & Konsole (20 Min) - -**In der Browser-Konsole:** - -1. Erstellen Sie Variablen für sich: - ```javascript - const name = "Your Name"; - let age = 20; - const hobbies = ["Hobby1", "Hobby2"]; - ``` - -2. Gib sie aus: - ```javascript - console.log(`I am ${name}, ${age} years old.`); - console.log("My hobbies:", hobbies); - ``` - -3. Erstelle ein `person`-Objekt und greife auf Properties zu - ---- - -# Funktionen: Code wiederverwenden - -```javascript -// Funktion definieren -function greet(name) { - return `Hello ${name}!`; +// Function declaration +function gruessen(name) { + return "Hallo " + name; } -// Funktion aufrufen -const message = greet("Max"); -console.log(message); // "Hello Max!" +// Arrow function (modern, kompakt) +const gruessen = (name) => "Hallo " + name; -// Arrow Function (modern) -const add = (a, b) => { - return a + b; +// Mit mehreren Zeilen +const summe = (a, b) => { + const result = a + b; + return result; }; -// Kurzform (bei einem Ausdruck) -const double = x => x * 2; +gruessen("Ada") // "Hallo Ada" +summe(3, 4) // 7 ``` --- -# Kontrollstrukturen: if/else + + -```javascript -const age = 18; - -if (age >= 18) { - console.log("Adult"); -} else if (age >= 16) { - console.log("Almost adult"); -} else { - console.log("Minor"); -} - -// Ternärer Operator (Kurzform) -const status = age >= 18 ? "Adult" : "Child"; -``` + - ---- - -# Schleifen: Wiederholen - - +Schleifen — Wiederholungen. ```javascript -// for-Schleife +// for-Schleife (klassisch) for (let i = 0; i < 5; i++) { - console.log(i); // 0, 1, 2, 3, 4 + console.log(i); // 0, 1, 2, 3, 4 } -// for...of (Arrays) -const colors = ["red", "green", "blue"]; -for (const color of colors) { - console.log(color); +// for...of (über Array) +for (const frucht of ["A", "B", "C"]) { + console.log(frucht); } // forEach (Array-Methode) -colors.forEach(color => console.log(color)); +[1, 2, 3].forEach(n => console.log(n)); + +// map (transformieren) +[1, 2, 3].map(n => n * 2); // [2, 4, 6] + +// filter (auswählen) +[1, 2, 3, 4].filter(n => n > 2); // [3, 4] ``` - --- -# Nützliche Array-Methoden +# Kontrollstrukturen ```javascript -const numbers = [1, 2, 3, 4, 5]; +// if / else +if (age >= 18) { + console.log("erwachsen"); +} else if (age >= 14) { + console.log("jugendlich"); +} else { + console.log("kind"); +} -// map: Transformieren -const doubled = numbers.map(x => x * 2); // [2, 4, 6, 8, 10] +// Ternärer Operator (Kurzform) +const status = age >= 18 ? "erwachsen" : "kind"; -// filter: Filtern -const large = numbers.filter(x => x > 2); // [3, 4, 5] - -// find: Erstes Element finden -const found = numbers.find(x => x > 3); // 4 - -// reduce: Aggregieren -const sum = numbers.reduce((acc, x) => acc + x, 0); // 15 +// switch (mehrere Werte) +switch (browser) { + case "Chrome": return "Blink"; + case "Safari": return "WebKit"; + case "Firefox": return "Gecko"; + default: return "unknown"; +} ``` --- -# Hands-On: Funktionen & Schleifen (30 Min) - -**Erstellt `script.js`:** - -1. Funktion die prüft ob Zahl gerade ist: - ```javascript - function isEven(num) { /* your code */ } - ``` - -2. Funktion die Array-Summe berechnet - -3. FizzBuzz: 1-10 ausgeben, "Fizz" bei /3, "Buzz" bei /5 - -**Tipp:** `num % 2 === 0` prüft ob gerade - ---- - -# Teil 2: Das DOM -## HTML mit JavaScript manipulieren +# Das DOM +## HTML im Speicher des Browsers + + --- -# Was ist das DOM? + + -**D**ocument **O**bject **M**odel - -- Browser parst HTML → Baumstruktur -- JavaScript kann diesen Baum **lesen und ändern** -- Jedes HTML-Element = ein "Node" - - + --- @@ -512,539 +452,450 @@ Jedes Element ist ein Objekt # Elemente finden ```javascript -// Einzelnes Element (erstes gefundene) -document.getElementById("meinId"); -document.querySelector(".meineKlasse"); -document.querySelector("nav > a"); +// EIN Element (erstes match) +const heading = document.querySelector('h1'); +const btn = document.querySelector('#submit-button'); +const card = document.querySelector('.card'); -// Mehrere Elemente (NodeList) -document.getElementsByClassName("meineKlasse"); -document.querySelectorAll("p"); +// MEHRERE Elemente (NodeList) +const allButtons = document.querySelectorAll('button'); +const allCards = document.querySelectorAll('.card'); -// Beispiel -const titel = document.querySelector("h1"); -console.log(titel.textContent); // Text auslesen +// Iterieren +allButtons.forEach(btn => console.log(btn.textContent)); ``` +`querySelector(...)` nimmt **denselben Selektor wie CSS.** + --- -# Elemente manipulieren + + - + + + --- -# Klassen manipulieren + + - + + + --- -# Elemente erstellen - - - -```javascript -// Neues Element erstellen -const neuerAbsatz = document.createElement("p"); -neuerAbsatz.textContent = "Ich bin neu!"; -neuerAbsatz.classList.add("highlight"); - -// In DOM einfügen -const container = document.querySelector("#container"); -container.appendChild(neuerAbsatz); // Am Ende -container.prepend(neuerAbsatz); // Am Anfang -container.insertBefore(neuerAbsatz, anderesElement); - -// Element entfernen -neuerAbsatz.remove(); -``` - - - ---- - -# Hands-On: DOM manipulieren (30 Min) - -**HTML:** -```html - -