JS 101
JavaScript ist die dritte Säule des Webs. HTML ist das Skelett, CSS die Haut, JavaScript sind die Muskeln. Von der ersten Zeile bis zur interaktiven Seite.
Zuerst gestalten? CSS 101 kommt vor JS 101.
Kapitel 01
Einführung & Setup
Was ist JavaScript — und wie binden wir es ein?
Der Browser hat eine eingebaute JS-Engine. Kein Server, keine Installation.
script.jsim MyFirst-Site-Ordner<script>auf allen 4 Seiten, vor </body>console.log() zeigt, was drin stecktHTML ist das Skelett, CSS die Haut, JavaScript die Muskeln.
script.js<script src defer>- Konsole mit F12
JavaScript ist die dritte Säule des Webs. HTML ist das Skelett, CSS die Haut — und JavaScript sind die Muskeln. In diesem Kapitel lernst du was JS kann, wie du es in deine MyFirst Site einbindest, und du schreibst deine erste JS-Zeile.
- Was JavaScript ist und warum es die dritte Säule des Webs ist
- Den Unterschied zwischen HTML, CSS und JavaScript verstehen
- JavaScript in deine MyFirst Site einbinden — richtig!
- Deine erste JS-Zeile schreiben und im Browser testen
- Die Browser-Konsole als dein wichtigstes Werkzeug kennenlernen
1.1 · Was ist JavaScript?
| Technologie | Aufgabe | Beispiel |
|---|---|---|
| HTML | Struktur & Inhalt | <button>Klick mich</button> |
| CSS | Aussehen & Layout | button { background: blue; } |
| JavaScript | Verhalten & Interaktion | button.onclick = () => alert('Hallo!'); |
1.2 · Wie "denkt" JavaScript?
JS liest deinen Code Zeile für Zeile, von oben nach unten. Wie ein Koch der ein Rezept befolgt — Schritt für Schritt.
// JS liest das hier als erstes let name = "Mikey"; // Schritt 1: Variable erstellen name = "Dante"; // Schritt 2: Wert ändern console.log(name); // Schritt 3: "Dante" ausgeben // Das hier wird NICHT "Mikey" ausgeben — name wurde geändert!
1.3 · JavaScript einbinden — der richtige Weg
Es gibt drei Wege JS einzubinden — wir lernen alle drei, verwenden aber konsequent den besten.
<button onclick="alert('Hi')">Klick</button> <!-- Funktioniert, aber schwer zu warten! -->
<head> <script src="script.js"></script> <!-- Problem: JS lädt bevor HTML fertig! --> </head>
<!-- JS immer kurz vor </body> einbinden --> <script src="script.js" defer></script> </body> </html>
defer? Es sagt dem Browser: "Lade die JS-Datei schon herunter, aber führe sie erst aus wenn das gesamte HTML fertig geladen ist." So findet dein JS alle HTML-Elemente die es braucht.// ======================================== // MyFirst Site — script.js // JS 101 Lernprojekt // ======================================== // Unser erstes "Lebenszeichen" console.log("✅ script.js erfolgreich geladen!");
1.4 · Die Browser-Konsole
Die Konsole ist wie ein direktes Telefon zu JavaScript. Hier siehst du was dein Code macht — und wo er Fehler macht.
| Browser | Tastenkürzel | Alternativ |
|---|---|---|
| Chrome / Edge | F12 oder Ctrl+Shift+J | Rechtsklick → "Untersuchen" → Console |
| Firefox | F12 oder Ctrl+Shift+K | Rechtsklick → "Element untersuchen" → Console |
| Safari | Cmd+Option+C | Entwickler-Menü → JavaScript-Konsole |
> 2 + 2 < 4 > console.log("Hallo Welt!") < Hallo Welt! > console.error("Das ist ein Fehler!") < ❌ Das ist ein Fehler! > console.warn("Vorsicht!") < ⚠️ Vorsicht!
console.log() Aufrufe. Besucher sollen deine Debug-Ausgaben nicht sehen.1.5 · Deine ersten JS-Zeilen
// Das aktuelle Datum und die Uhrzeit const jetzt = new Date(); console.log("Seite geladen am:", jetzt.toLocaleString("de-CH")); // Den Titel der Seite auslesen console.log("Seiten-Titel:", document.title); // Zählen wie viele Links auf der Seite sind const alleLinks = document.querySelectorAll("a"); console.log("Anzahl Links:", alleLinks.length);
Was passiert hier?
new Date()— JS fragt den Browser: "Wie spät ist es gerade?"document.title— JS liest den<title>Tag aus dem HTMLquerySelectorAll("a")— JS sucht ALLE Links auf der Seite
Das Wort document ist dein Tor zum HTML — über document kann JS alles auf der Seite lesen und verändern. Mehr dazu in Kapitel 6!
- Binde
script.jskorrekt in alle vier Seiten deiner MyFirst Site ein - Öffne jede Seite und prüfe ob script.js erfolgreich geladen! in der Konsole erscheint
- Füge einen eigenen
console.log()mit deinem Namen ein - Tippe direkt in der Konsole:
document.body.style.background = "red"— was passiert? Warum ist die Änderung nach Neuladen weg?
→ Weiter mit Kapitel 2: Variablen & Datentypen
Kapitel 02
Variablen & Datentypen
Wie JavaScript Daten speichert — und welche Arten es gibt.
Eine Variable ist ein beschrifteter Behälter. Darin liegt ein Wert von einem bestimmten Typ.
let änderbar, const fest"Mikey"350truevar ist alt. Nimm let oder const.
let consttypeof
Variablen sind Behälter für Daten. Alles was dein Programm sich merken muss — Zahlen, Texte, Zustände — lebt in Variablen.
2.1 · let, const und var
| Schlüsselwort | Verwendung | Änderbar? |
|---|---|---|
| let | Standardwahl für veränderliche Werte | ✅ Ja |
| const | Für Werte die sich nicht ändern | ❌ Nein |
| var | Alt — bitte nicht mehr verwenden | ⚠️ Problematisch |
// ✅ let — kann geändert werden let punkte = 0; punkte = 10; // OK // ✅ const — unveränderlich const name = "Mikey"; // name = "Dante"; // ❌ Fehler! const kann nicht geändert werden // ❌ var — vermeide es var alt = "nicht mehr benutzen";
const — und wechsle nur zu let wenn du weisst dass sich der Wert ändern wird. var benutzt du nie.2.2 · Die 6 wichtigsten Datentypen
| Typ | Beispiel | Beschreibung |
|---|---|---|
| String | "Hallo" oder 'Welt' | Text, immer in Anführungszeichen |
| Number | 42 oder 3.14 | Zahlen (ganz oder mit Komma) |
| Boolean | true oder false | Wahr oder Falsch |
| null | null | Absichtlich leer |
| undefined | undefined | Noch nicht zugewiesen |
| Object | { name: 'Mikey' } | Sammlung von Daten |
const begruessung = "Hallo MyKeyZ!"; // String const punkte = 42; // Number const istEingeloggt = false; // Boolean const benutzer = null; // null — noch kein User let ergebnis; // undefined bis Wert zugewiesen const cave = { name: "Mikeys Center", punkte: 100 }; // Object console.log(typeof begruessung); // "string" console.log(typeof punkte); // "number" console.log(typeof null); // "object" ← bekannter JS-Bug!
"object" zurück — ein historischer Bug in JS der aus Kompatibilitätsgründen nie behoben wurde. null ist kein Object!2.3 · Template Literals — Strings mit Variablen
const name = "Mikey"; const punkte = 42; // ❌ Alte Methode — umständlich console.log("Hallo " + name + "! Du hast " + punkte + " Punkte."); // ✅ Template Literal — sauber und lesbar console.log(`Hallo ${name}! Du hast ${punkte} Punkte.`); // Auch Ausdrücke möglich console.log(`Doppelt: ${punkte * 2} Punkte`); // Doppelt: 84 Punkte
Shift+^ dann Leertaste.2.4 · Type Coercion
// Zahl + String = String (Verkettung!) console.log(1 + "2"); // "12" nicht 3! // Andere Operatoren zwingen zur Zahl console.log("5" - 2); // 3 console.log("5" * 2); // 10 // Explizit umwandeln — immer besser! const eingabe = "42"; const zahl = Number(eingabe); // 42 als Zahl const text = String(42); // "42" als Text
- Erstelle 5 Variablen in script.js — je eine für jeden Haupttyp
- Gib alle 5 mit
console.log()undtypeofaus - Baue einen Template Literal der deinen Namen und die Anzahl Tutorials zeigt
- Was gibt
console.log(typeof typeof 42)aus? Warum?
Kapitel 03
Operatoren & Bedingungen
Rechnen, vergleichen, entscheiden — die Werkzeuge des Logikers.
Eine Bedingung prüft etwas. Je nach Antwort läuft ein anderer Weg.
punkteifIst es wahr?ifelseImmer === statt ==. Drei Gleichzeichen prüfen Typ und Wert.
+ - * / %=== !== < >if else&& ||
3.1 · Arithmetische Operatoren
| Operator | Bedeutung | Beispiel | Ergebnis |
|---|---|---|---|
| + | Addition | 5 + 3 | 8 |
| - | Subtraktion | 10 - 4 | 6 |
| * | Multiplikation | 3 * 4 | 12 |
| / | Division | 15 / 3 | 5 |
| % | Modulo (Rest) | 10 % 3 | 1 |
| ** | Potenz | 2 ** 8 | 256 |
| ++ | Increment (+1) | i++ | i = i + 1 |
3.2 · Vergleichsoperatoren — == vs ===
== wandelt Typen automatisch um und kann zu unerwarteten Ergebnissen führen. === (drei Gleichzeichen) vergleicht Typ UND Wert — immer sicher.| Operator | Bedeutung | Beispiel | Ergebnis |
|---|---|---|---|
| == | Gleich (mit Typumwandlung) | "5" == 5 | true ⚠️ |
| === | Strikt gleich | "5" === 5 | false ✅ |
| !== | Strikt ungleich | "5" !== 5 | true |
| < | Kleiner als | 3 < 5 | true |
| >= | Grösser oder gleich | 5 >= 5 | true |
3.3 · Logische Operatoren
// && (UND) — beide müssen true sein const darfRein = alter >= 16 && hatAccount; // || (ODER) — mindestens eines muss true sein const hatZugriff = istAdmin || hatPremium; // ! (NICHT) — kehrt um const istGast = !istEingeloggt; // ?? (Nullish Coalescing) — falls null oder undefined const anzeigeName = benutzername ?? "Gast";
3.4 · if / else if / else
const punkte = 75; if (punkte >= 90) { console.log("Ausgezeichnet! 🏆"); } else if (punkte >= 70) { console.log("Gut gemacht! ✅"); } else if (punkte >= 50) { console.log("Bestanden 👍"); } else { console.log("Versuch es nochmal 💪"); } // Ausgabe: Gut gemacht! ✅
3.5 · Ternärer Operator
// Lange Form let status; if (istEingeloggt) { status = "Willkommen!"; } else { status = "Bitte einloggen"; } // Kurze Form (ternär) const status = istEingeloggt ? "Willkommen!" : "Bitte einloggen"; const rolle = hatPremium ? "Premium Member" : "Free Member";
- Schreibe eine if/else Kette die je nach Uhrzeit "Guten Morgen", "Guten Tag" oder "Gute Nacht" ausgibt
- Benutze
new Date().getHours()für die aktuelle Stunde - Wandle die if/else in einen ternären Operator um
- Was ist der Unterschied zwischen
0 == falseund0 === false? Teste es!
Kapitel 04
Schleifen & Arrays
Listen verwalten und Code wiederholen — das mächtigste Duo.
Ein Array ist eine Liste. Eine Schleife geht sie Element für Element durch.
for, forEachDas erste Element ist [0], nicht [1].
[ ]push pop lengthfor forEachmap filter
4.1 · Arrays
const tutorials = ["HTML 101", "CSS 101", "JS 101"]; // Zugriff über Index (beginnt bei 0!) console.log(tutorials[0]); // "HTML 101" console.log(tutorials.length); // 3 // Element hinzufügen / entfernen tutorials.push("Python 101"); // ans Ende const letztes = tutorials.pop(); // letztes entfernen
4.2 · Die wichtigsten Array-Methoden
| Methode | Was sie macht | Gibt zurück |
|---|---|---|
| push(x) | Fügt x ans Ende hinzu | Neue Länge |
| pop() | Entfernt letztes Element | Das Element |
| filter(fn) | Filtert nach Bedingung | Neues Array |
| map(fn) | Transformiert jedes Element | Neues Array |
| find(fn) | Findet erstes passendes Element | Das Element |
| includes(x) | Prüft ob x enthalten ist | true / false |
| join(sep) | Verbindet zu String | String |
const punkte = [45, 78, 92, 23, 88, 67]; // filter — nur Punkte über 70 const gute = punkte.filter(p => p > 70); console.log(gute); // [78, 92, 88] // map — alle verdoppeln const doppelt = punkte.map(p => p * 2); // find — erste Zahl über 80 const ersteBeste = punkte.find(p => p > 80); console.log(ersteBeste); // 92
4.3 · Schleifen
// Klassische for-Schleife for (let i = 0; i < 5; i++) { console.log(`Runde ${i}`); } // for...of — elegant durch Arrays const farben = ["Rot", "Grün", "Blau"]; for (const farbe of farben) { console.log(farbe); } // forEach — mit Index farben.forEach((farbe, index) => { console.log(`${index}: ${farbe}`); });
for...of oder forEach verwenden — die laufen automatisch durch.- Erstelle ein Array mit 5 Tutorial-Namen und gib jeden mit
for...ofaus - Filtere alle Tutorials heraus die "101" im Namen haben
- Schreibe eine Schleife die von 1–10 zählt und bei geraden Zahlen "gerade" ausgibt
- Was macht
[1, 2, 3].map(x => x ** 2)? Erst im Kopf berechnen, dann testen!
Kapitel 05
Funktionen
Code einmal schreiben — beliebig oft aufrufen.
Eine Funktion bekommt etwas hinein, arbeitet und gibt ein Ergebnis zurück.
namebegrüsse()der Code-Block"Hallo Mikey!"functionreturn() =>
Funktionen sind wiederverwendbare Code-Blöcke. CheckMate besteht aus Dutzenden von Funktionen — du lernst hier die Grundlage von allem.
5.1 · Deklarieren und aufrufen
function begrüsse(name) { return `Hallo ${name}! Willkommen im Center.`; } console.log(begrüsse("Mikey")); // Hallo Mikey! Willkommen im Center. function berechneScore(richtig, gesamt) { const prozent = (richtig / gesamt) * 100; return `${prozent.toFixed(1)}%`; } console.log(berechneScore(7, 10)); // "70.0%"
5.2 · Arrow Functions
// Klassische Funktion function verdopple(n) { return n * 2; } // Arrow Function — gleiche Funktion, kürzer const verdopple = (n) => { return n * 2; }; // Noch kürzer — bei einzeiligem return const verdopple = n => n * 2; // Alle drei machen das gleiche! console.log(verdopple(21)); // 42
return besteht, kannst du geschweifte Klammern und return weglassen. const quadrat = n => n * n; — sauber!5.3 · Default Parameter & Scope
// Default Parameter function begrüsse(name = 'Gast') { return `Hallo ${name}!`; } begrüsse('Mikey'); // 'Hallo Mikey!' begrüsse(); // 'Hallo Gast!' — Default greift // Scope — globale vs lokale Variable const appName = "MyKeyZ"; // global — überall sichtbar function zeigeApp() { const intern = 'nur hier'; // lokal — nur in dieser Funktion console.log(appName); // ✅ } // console.log(intern); // ❌ Fehler!
5.4 · Callbacks
function verarbeite(zahl, operation) { return operation(zahl); } const verdopple = n => n * 2; const quadrat = n => n * n; console.log(verarbeite(5, verdopple)); // 10 console.log(verarbeite(5, quadrat)); // 25 // Du kennst Callbacks schon! (aus Kapitel 4) [1,2,3].map(n => n * 10); // map nimmt eine Callback-Funktion
- Schreibe eine Funktion
berechneBMI(gewicht, groesse)die den BMI zurückgibt - Schreibe dieselbe Funktion als Arrow Function
- Baue eine Funktion
bewerteBMI(bmi)die "Untergewicht", "Normal" oder "Übergewicht" zurückgibt - Kombiniere beide:
bewerteBMI(berechneBMI(70, 1.75))— was kommt raus?
Kapitel 06
DOM Manipulation
JavaScript spricht mit deinem HTML — und kann alles verändern.
Das DOM ist die Brücke: Elemente finden, ändern, hinzufügen, ohne die Seite neu zu laden.
script.jsdein CodeFindet querySelector nichts, kommt null zurück. Selektor prüfen.
getElementById querySelectortextContent classListcreateElement
Das DOM (Document Object Model) ist die Brücke zwischen JS und HTML. Mit DOM Manipulation kannst du jedes Element lesen, ändern, hinzufügen oder löschen — ohne die Seite neu zu laden.
6.1 · Elemente finden
| Methode | Findet | Gibt zurück |
|---|---|---|
| getElementById('id') | Ein Element per ID | Element oder null |
| querySelector('css') | Erstes passendes Element | Element oder null |
| querySelectorAll('css') | Alle passenden Elemente | NodeList |
// Per ID — schnellste Methode const cave = document.getElementById('cave'); // Per CSS-Selektor — flexibelste Methode const titel = document.querySelector('.titel'); const erstLink = document.querySelector('nav a'); // Alle Elemente const alleButtons = document.querySelectorAll('button'); alleButtons.forEach(btn => console.log(btn.textContent));
6.2 · Inhalte lesen und ändern
const titel = document.querySelector('h1'); titel.textContent = 'Hallo Mikey!'; // Text ändern titel.innerHTML = '<em>Kursiv</em> und normal'; // HTML setzen // CSS direkt ändern titel.style.color = 'var(--coral)'; // Klassen steuern const card = document.querySelector('.card'); card.classList.add('aktiv'); card.classList.remove('versteckt'); card.classList.toggle('dunkelmodus'); // ein/aus
textContent für reinen Text — innerHTML nur für eigenen HTML-Code. Benutzereingaben niemals direkt als innerHTML setzen (XSS-Gefahr)!6.3 · Elemente erstellen und einfügen
const neuerEintrag = document.createElement('li'); neuerEintrag.textContent = 'Neues Tutorial'; neuerEintrag.classList.add('tutorial-item'); const liste = document.querySelector('#tutorial-liste'); liste.appendChild(neuerEintrag); // ans Ende liste.prepend(neuerEintrag); // an den Anfang neuerEintrag.remove(); // entfernen
- Füge einen Button hinzu:
<button id="magisch">Klick mich!</button> - Schreibe JS das beim Klick den Hintergrund auf eine Zufallsfarbe setzt
- Tipp:
document.body.style.backgroundundMath.random() - Zeige eine Meldung im HTML an (nicht alert!) — erstelle ein
<p id="meldung">
Kapitel 07
Events & Interaktivität
Auf Klicks, Tasten und Mausbewegungen reagieren.
Ein Ereignis passiert, ein Listener hört zu, eine Funktion antwortet.
click, input, keydownaddEventListenerhört zuonclick = überschreibt den vorherigen Handler. addEventListener nicht.
addEventListenerclick input submit keydowne.target
7.1 · addEventListener
const btn = document.querySelector('#meinButton'); // ❌ Nicht so — überschreibt vorherige Handler btn.onclick = () => console.log("Klick 1"); btn.onclick = () => console.log("Klick 2"); // überschreibt Klick 1! // ✅ So — mehrere Handler möglich btn.addEventListener('click', () => console.log("Klick 1")); btn.addEventListener('click', () => console.log("Klick 2")); // beide laufen!
7.2 · Die wichtigsten Events
| Event | Wann es feuert | Element |
|---|---|---|
| click | Mausklick | button, a, div |
| input | Bei jeder Eingabe | input, textarea |
| change | Wenn Feld verlassen | input, select |
| submit | Formular abschicken | form |
| keydown | Taste gedrückt | document, input |
| mouseover | Maus drüber | div, img |
| DOMContentLoaded | HTML fertig geladen | document |
7.3 · Das Event-Objekt & Praktisches Beispiel
const suchfeld = document.querySelector('#suche'); const liste = document.querySelectorAll('.tutorial-item'); suchfeld.addEventListener('input', (e) => { const suchtext = e.target.value.toLowerCase(); liste.forEach(item => { const text = item.textContent.toLowerCase(); item.style.display = text.includes(suchtext) ? '' : 'none'; }); }); // Tipp, Tipp → live gefiltert!
7.4 · Event Delegation
// ✅ Event Delegation — ein Listener auf dem Container document.querySelector('#container').addEventListener('click', (e) => { if (e.target.classList.contains('btn')) { handler(e.target); } }); // Funktioniert auch für dynamisch hinzugefügte Buttons!
- Baue einen Zeichen-Zähler: Zeige live an wie viele Zeichen in ein Textfeld eingegeben wurden
- Keyboard-Shortcut: Bei
Ctrl+Ksoll ein Alert erscheinen - Toggle: Ein Button schaltet ein
divzwischen sichtbar und unsichtbar um - 5 farbige Buttons — Klick ändert den Body-Hintergrund auf die jeweilige Farbe
Kapitel 08
Objekte & JSON
Die wichtigste Datenstruktur in JS — und das Format des Internets.
Ein Objekt sammelt zusammengehörige Werte. Als JSON-Text reist es zu Speichern und Servern.
{ name, punkte }daten.name{ }obj.key obj["key"]JSON.stringify JSON.parse
8.1 · Objekte erstellen
const benutzer = { name: "Mikey", punkte: 350, premium: true, cave: "Mikeys Creative Lab", }; // Punkt-Notation console.log(benutzer.name); // 'Mikey' // Bracket-Notation (für dynamische Keys) const feld = "name"; console.log(benutzer[feld]); // 'Mikey' // Property hinzufügen benutzer.abzeichen = ['HTML Master', 'CSS Pro'];
8.2 · Methoden, Destructuring & Spread
const cave = { name: "Mikeys Center", besucher: 0, betreten() { this.besucher++; return `Willkommen in ${this.name}!`; } }; // Destructuring — Properties auspacken const { name, punkte } = benutzer; // Spread — Objekt kopieren/erweitern const erweiterter = { ...benutzer, rolle: 'admin' };
8.3 · JSON
const benutzer = { name: 'Mikey', punkte: 350 }; // JS Objekt → JSON String const json = JSON.stringify(benutzer); // '{"name":"Mikey","punkte":350}' // JSON String → JS Objekt const daten = JSON.parse('{"name":"Mikey","punkte":350}'); console.log(daten.name); // 'Mikey' // Schön formatiert (für Debugging) console.log(JSON.stringify(benutzer, null, 2));
- Erstelle ein Objekt für dein Center mit name, punkte, abgeschlossene_tutorials (Array) und premium
- Füge zwei Methoden hinzu:
info()undtutorial_abschliessen(name) - Serialisiere mit
JSON.stringify()und parse es wieder zurück - Was passiert wenn du
JSON.stringify()auf ein Objekt mit Methode anwendest?
Kapitel 09
Fetch & Async ⏳
Daten von APIs laden — das Web lebt davon.
fetch fragt eine API an. await wartet auf die Antwort, die Seite läuft weiter.
fetch(url)response.json()Ohne Internet oder bei einem Fehler: try/catch fängt ihn ab.
async awaitfetchtry catch
Mit fetch() kannst du von APIs Daten laden — Wetter, Kurse, Benutzerinformationen. async/await macht das elegant möglich.
9.1 · Synchron vs. Asynchron
console.log('1'); setTimeout(() => console.log('2 (nach 1 Sekunde)'), 1000); console.log('3'); // läuft VOR der '2'! // Ausgabe: 1, 3, 2
9.2 · async / await — der saubere Weg
async function ladeWetter() { try { const response = await fetch( 'https://api.open-meteo.com/v1/forecast?latitude=47.42&longitude=9.37¤t_weather=true' ); const daten = await response.json(); console.log('Temperatur:', daten.current_weather.temperature); } catch (fehler) { console.error('Fehler:', fehler); } } ladeWetter();
Was macht await?
awaitpausiert die Ausführung innerhalb der async-Funktion und wartet auf das Promise- Der Rest der Seite läuft weiter — kein Einfrieren!
async-Funktionen geben immer ein Promise zurücktry/catchfängt Fehler ab — Netzwerkfehler, ungültige JSON-Antworten, etc.
9.3 · API-Daten auf der Seite anzeigen
async function zeigeWetter() { const url = 'https://api.open-meteo.com/v1/forecast?latitude=47.42&longitude=9.37¤t_weather=true'; const anzeige = document.querySelector('#wetter'); anzeige.textContent = 'Lädt...'; try { const res = await fetch(url); const data = await res.json(); anzeige.textContent = `St. Gallen: ${data.current_weather.temperature}°C`; } catch { anzeige.textContent = "Fehler beim Laden"; } } document.querySelector('#ladeBtn').addEventListener('click', zeigeWetter);
- Rufe die Open-Meteo API für St. Gallen ab und zeige die Temperatur in der Konsole
- Zeige das Ergebnis auf der Seite an — in einem
<div id="wetter"> - Füge einen "Lädt..."-Indikator hinzu während die Anfrage läuft
- Baue einen Fehlerfall nach — was passiert bei falscher URL?
Kapitel 10
localStorage & State
Daten dauerhaft speichern — auch nach dem Schliessen des Tabs.
localStorage speichert Text im Browser. Auch nach dem Schliessen ist er noch da.
cavelocalStoragenur in diesem Browser, nur TextlocalStorage speichert nur Strings. Objekte zuerst mit JSON umwandeln.
setItem getItem removeItemJSON.stringify JSON.parse
10.1 · localStorage Grundlagen
// Speichern — nur Strings! localStorage.setItem("benutzername", "Mikey"); // Lesen const name = localStorage.getItem("benutzername"); // Löschen localStorage.removeItem("benutzername"); // Objekte mit JSON const cave = { name: 'Mikeys Center', punkte: 350 }; localStorage.setItem('cave', JSON.stringify(cave)); const geladen = JSON.parse(localStorage.getItem("cave")); console.log(geladen.name); // 'Mikeys Center'
10.2 · State-Management Pattern
// State laden (oder Default) let state = { count: JSON.parse(localStorage.getItem("count")) || 0 }; function render() { document.querySelector("#anzeige").textContent = state.count; } function sichern() { localStorage.setItem("count", JSON.stringify(state.count)); } document.querySelector("#plus").addEventListener("click", () => { state.count++; render(); sichern(); }); render(); // Initial anzeigen
- Baue einen Besucher-Zähler: Jedes Mal wenn die Seite geladen wird steigt der Zähler
- Zeige den Zähler auf der Seite an
- Füge einen "Reset" Button hinzu
- Speichere zusätzlich das Datum des letzten Besuchs und zeige es an
Kapitel 11
JS in der Praxis
Alles zusammen — MyFirst Site wird richtig interaktiv.
Drei Funktionen machen deine MyFirst Site interaktiv.
script.jseine Datei für alle Seiten- Kapitel 1 bis 10
script.js
Jetzt bringen wir alles zusammen! In diesem Kapitel machst du deine MyFirst Site richtig interaktiv — mit allem was du in den Kapiteln 1–10 gelernt hast.
11.1 · Darkmode Toggle
// ── Darkmode ────────────────────────────────────── function initDarkmode() { const toggle = document.querySelector('#darkmode-toggle'); if (!toggle) return; const gespeichert = localStorage.getItem("darkmode") === "true"; document.body.classList.toggle('dark', gespeichert); toggle.addEventListener('click', () => { const istDark = document.body.classList.toggle('dark'); localStorage.setItem("darkmode", istDark); toggle.textContent = istDark ? '☀️ Lightmode' : '🌙 Darkmode'; }); } initDarkmode();
11.2 · Aktive Navigation
// ── Aktive Nav ──────────────────────────────────── function markiereAktiveNavigation() { const aktuelleSeite = window.location.pathname.split('/').pop() || 'index.html'; document.querySelectorAll('nav a').forEach(link => { const linkZiel = link.getAttribute('href'); link.classList.toggle('aktiv', linkZiel === aktuelleSeite); }); } markiereAktiveNavigation();
11.3 · Live Uhr & Smooth Scroll
// ── Live Uhr ────────────────────────────────────── function starteLiveUhr() { const anzeige = document.querySelector('#uhrzeit'); if (!anzeige) return; function aktualisiere() { anzeige.textContent = new Date().toLocaleTimeString("de-CH"); } aktualisiere(); setInterval(aktualisiere, 1000); } starteLiveUhr(); // ── Smooth Scroll ───────────────────────────────── document.querySelectorAll('a[href^="#"]').forEach(anker => { anker.addEventListener('click', (e) => { e.preventDefault(); const ziel = document.querySelector(anker.getAttribute('href')); if (ziel) ziel.scrollIntoView({ behavior: "smooth" }); }); });
if (!toggle) return;). So kann das gleiche script.js auf allen Seiten laufen ohne Fehler.- Baue alle vier Funktionen in deine MyFirst Site ein
- Füge zu index.html einen
<button id="darkmode-toggle">🌙 Darkmode</button>hinzu - Füge einen
<span id="uhrzeit">ein und teste die Live-Uhr - Lass den Darkmode-Button sein Emoji ändern (/) je nach aktuellem Modus
Kapitel 12
PWA Grundlagen
Das Abschluss-Kapitel — deine Site wird zur App.
Eine PWA ist eine Webseite, die man installieren kann und die auch offline läuft.
Dieses Kapitel wird freigeschaltet, wenn das Community Center startet.
Die Registrierung auf mykeyz.ch ist noch nicht offen. Sobald das Community Center startet, wird dieses Kapitel freigeschaltet.
Was dich in Kapitel 12 erwartet:
- Was eine PWA ist und was sie von einer normalen Website unterscheidet
- Web App Manifest — damit deine App installierbar wird
- Service Worker — Offline-Fähigkeit einbauen
- Push Notifications — Benutzer benachrichtigen
- Dein eigenes PWA-Projekt bauen — basierend auf CheckMate
Das ist keine Übung mehr — das ist echtes JavaScript!
- JavaScript in HTML einbinden — richtig!
- Variablen, Typen und Operatoren
- Arrays, Schleifen und Funktionen
- DOM Manipulation und Events
- Objekte, JSON und APIs
- localStorage und State-Management
- MyFirst Site komplett interaktiv gemacht
PWA 101 — baue deine erste echte installierbare App mit allem was du gelernt hast!
→ PWA 101 ist in Vorbereitung.