← Projects/Tutorials/JS 101
MyKeyZ Tutorial · Programmieren

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.

Einsteiger12 Kapitelca. 6 bis 8 StundenVoraussetzung: CSS 101

Zuerst gestalten? CSS 101 kommt vor JS 101.

Kapitel 01

Einführung & Setup

Was ist JavaScript — und wie binden wir es ein?

BauplanWo JavaScript läuft

Der Browser hat eine eingebaute JS-Engine. Kein Server, keine Installation.

script.jsim MyFirst-Site-Ordner
<script>auf allen 4 Seiten, vor </body>
JS-Engine im Browserliest Zeile für Zeile, von oben nach unten
Konsoleconsole.log() zeigt, was drin steckt

HTML 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?

TechnologieAufgabeBeispiel
HTMLStruktur & Inhalt<button>Klick mich</button>
CSSAussehen & Layoutbutton { background: blue; }
JavaScriptVerhalten & Interaktionbutton.onclick = () => alert('Hallo!');
Direkt im Browser! JavaScript läuft direkt im Browser — kein Server, keine Installation. Jeder Browser hat eine eingebaute JS-Engine die deinen Code ausführt.

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.

JavaScript · Ausführungsreihenfolge
// 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!
console.log() ist dein bester Freund! Damit kannst du jederzeit schauen was in einer Variable steckt. Wie ein Röntgengerät für deinen Code.

1.3 · JavaScript einbinden — der richtige Weg

Es gibt drei Wege JS einzubinden — wir lernen alle drei, verwenden aber konsequent den besten.

❌ Weg 1 — Inline
HTML
<button onclick="alert('Hi')">Klick</button>
<!-- Funktioniert, aber schwer zu warten! -->
⚠️ Weg 2 — Im <head>
HTML
<head>
  <script src="script.js"></script>
  <!-- Problem: JS lädt bevor HTML fertig! -->
</head>
✅ IN DATEI EINFÜGEN — alle 4 HTML-Seiten · direkt vor </body>
  <!-- JS immer kurz vor </body> einbinden -->
  <script src="script.js" defer></script>
</body>
</html>
Was macht 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.
✅ NEUE DATEI erstellen — script.js im MyFirst Site Ordner
// ========================================
// 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.

BrowserTastenkürzelAlternativ
Chrome / EdgeF12 oder Ctrl+Shift+JRechtsklick → "Untersuchen" → Console
FirefoxF12 oder Ctrl+Shift+KRechtsklick → "Element untersuchen" → Console
SafariCmd+Option+CEntwickler-Menü → JavaScript-Konsole
Konsole · direkt eintippen und Enter drücken
> 2 + 2
< 4

> console.log("Hallo Welt!")
< Hallo Welt!

> console.error("Das ist ein Fehler!")
< ❌ Das ist ein Fehler!

> console.warn("Vorsicht!")
< ⚠️ Vorsicht!
⚠️ Nur für die Entwicklung! Bevor du eine Seite veröffentlichst, entferne alle console.log() Aufrufe. Besucher sollen deine Debug-Ausgaben nicht sehen.

1.5 · Deine ersten JS-Zeilen

✅ IN DATEI EINFÜGEN — script.js · unter dem ersten console.log
// 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 HTML
  • querySelectorAll("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!

Hausaufgabe — Kapitel 1
  • Binde script.js korrekt 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.

BauplanBehälter für Daten

Eine Variable ist ein beschrifteter Behälter. Darin liegt ein Wert von einem bestimmten Typ.

Behälterlet änderbar, const fest
Inhalt, zum Beispiel
Text"Mikey"
Zahl350
Wahr oder falschtrue

var ist alt. Nimm let oder const.

  • let const
  • typeof

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üsselwortVerwendungÄnderbar?
letStandardwahl für veränderliche Werte✅ Ja
constFür Werte die sich nicht ändern❌ Nein
varAlt — bitte nicht mehr verwenden⚠️ Problematisch
JavaScript · Variablen
// ✅ 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";
Faustregel: Benutze immer 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

TypBeispielBeschreibung
String"Hallo" oder 'Welt'Text, immer in Anführungszeichen
Number42 oder 3.14Zahlen (ganz oder mit Komma)
Booleantrue oder falseWahr oder Falsch
nullnullAbsichtlich leer
undefinedundefinedNoch nicht zugewiesen
Object{ name: 'Mikey' }Sammlung von Daten
JavaScript · Alle Typen in Aktion
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!
⚠️ typeof null gibt "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

JavaScript · Template Literals
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
Backticks! Template Literals verwenden Backticks ` (nicht normale Anführungszeichen). Auf CH-Tastatur: Shift+^ dann Leertaste.

2.4 · Type Coercion

JavaScript · Automatische Typumwandlung
// 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
Hausaufgabe — Kapitel 2
  • Erstelle 5 Variablen in script.js — je eine für jeden Haupttyp
  • Gib alle 5 mit console.log() und typeof aus
  • 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.

BauplanEntscheiden

Eine Bedingung prüft etwas. Je nach Antwort läuft ein anderer Weg.

Wertpunkte
ifIst es wahr?
Antwort
Jader Block in if
Neinelse

Immer === statt ==. Drei Gleichzeichen prüfen Typ und Wert.

  • + - * / %
  • === !== < >
  • if else
  • && ||

3.1 · Arithmetische Operatoren

OperatorBedeutungBeispielErgebnis
+Addition5 + 38
-Subtraktion10 - 46
*Multiplikation3 * 412
/Division15 / 35
%Modulo (Rest)10 % 31
**Potenz2 ** 8256
++Increment (+1)i++i = i + 1

3.2 · Vergleichsoperatoren — == vs ===

⚠️ Immer === verwenden! Das == wandelt Typen automatisch um und kann zu unerwarteten Ergebnissen führen. === (drei Gleichzeichen) vergleicht Typ UND Wert — immer sicher.
OperatorBedeutungBeispielErgebnis
==Gleich (mit Typumwandlung)"5" == 5true ⚠️
===Strikt gleich"5" === 5false ✅
!==Strikt ungleich"5" !== 5true
<Kleiner als3 < 5true
>=Grösser oder gleich5 >= 5true

3.3 · Logische Operatoren

JavaScript · &&, ||, !
// && (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

JavaScript · Bedingungen
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

JavaScript · Bedingung ? wennTrue : wennFalse
// 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";
Hausaufgabe — Kapitel 3
  • 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 == false und 0 === false? Teste es!

Kapitel 04

Schleifen & Arrays

Listen verwalten und Code wiederholen — das mächtigste Duo.

BauplanListe und Wiederholung

Ein Array ist eine Liste. Eine Schleife geht sie Element für Element durch.

ArrayIndex beginnt bei 0
Schleifefor, forEach
Pro Elementdein Code

Das erste Element ist [0], nicht [1].

  • [ ]
  • push pop length
  • for forEach
  • map filter

4.1 · Arrays

JavaScript · 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

MethodeWas sie machtGibt zurück
push(x)Fügt x ans Ende hinzuNeue Länge
pop()Entfernt letztes ElementDas Element
filter(fn)Filtert nach BedingungNeues Array
map(fn)Transformiert jedes ElementNeues Array
find(fn)Findet erstes passendes ElementDas Element
includes(x)Prüft ob x enthalten isttrue / false
join(sep)Verbindet zu StringString
JavaScript · filter, map, find
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

JavaScript · for, for...of, forEach
// 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}`);
});
⚠️ Endlosschleifen! Stelle immer sicher dass deine Schleife irgendwann aufhört. Im Zweifel for...of oder forEach verwenden — die laufen automatisch durch.
Hausaufgabe — Kapitel 4
  • Erstelle ein Array mit 5 Tutorial-Namen und gib jeden mit for...of aus
  • 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.

BauplanEinmal schreiben, oft aufrufen

Eine Funktion bekommt etwas hinein, arbeitet und gibt ein Ergebnis zurück.

HineinParameter: name
begrüsse()der Code-Block
Heraus"Hallo Mikey!"
  • function
  • return
  • () =>

Funktionen sind wiederverwendbare Code-Blöcke. CheckMate besteht aus Dutzenden von Funktionen — du lernst hier die Grundlage von allem.

5.1 · Deklarieren und aufrufen

JavaScript · Klassische Funktion
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

JavaScript · 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
Arrow Kurzform: Wenn der Funktionskörper nur aus einem return besteht, kannst du geschweifte Klammern und return weglassen. const quadrat = n => n * n; — sauber!

5.3 · Default Parameter & Scope

JavaScript · Default-Werte und Sichtbarkeit
// 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

JavaScript · Funktionen als Parameter
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
Hausaufgabe — Kapitel 5
  • 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.

BauplanJS spricht mit dem HTML

Das DOM ist die Brücke: Elemente finden, ändern, hinzufügen, ohne die Seite neu zu laden.

script.jsdein Code
DOMdie Seite als Baum
Sichtbare Seiteändert sich sofort

Findet querySelector nichts, kommt null zurück. Selektor prüfen.

  • getElementById querySelector
  • textContent classList
  • createElement

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

MethodeFindetGibt zurück
getElementById('id')Ein Element per IDElement oder null
querySelector('css')Erstes passendes ElementElement oder null
querySelectorAll('css')Alle passenden ElementeNodeList
JavaScript · Elemente finden
// 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

JavaScript · DOM Manipulation
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
⚠️ innerHTML mit Vorsicht! Benutze 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

JavaScript · createElement
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
Hausaufgabe — Kapitel 6
  • 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.background und Math.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.

BauplanReagieren

Ein Ereignis passiert, ein Listener hört zu, eine Funktion antwortet.

Ereignisclick, input, keydown
addEventListenerhört zu
Deine Funktionbekommt das Event-Objekt
Seite ändert sichüber das DOM

onclick = überschreibt den vorherigen Handler. addEventListener nicht.

  • addEventListener
  • click input submit keydown
  • e.target

7.1 · addEventListener

JavaScript · Events richtig binden
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

EventWann es feuertElement
clickMausklickbutton, a, div
inputBei jeder Eingabeinput, textarea
changeWenn Feld verlasseninput, select
submitFormular abschickenform
keydownTaste gedrücktdocument, input
mouseoverMaus drüberdiv, img
DOMContentLoadedHTML fertig geladendocument

7.3 · Das Event-Objekt & Praktisches Beispiel

JavaScript · Live-Suche mit input Event
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

JavaScript · Ein Listener für alle
// ✅ 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!
Hausaufgabe — Kapitel 7
  • Baue einen Zeichen-Zähler: Zeige live an wie viele Zeichen in ein Textfeld eingegeben wurden
  • Keyboard-Shortcut: Bei Ctrl+K soll ein Alert erscheinen
  • Toggle: Ein Button schaltet ein div zwischen 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.

BauplanObjekt und JSON

Ein Objekt sammelt zusammengehörige Werte. Als JSON-Text reist es zu Speichern und Servern.

Objekt{ name, punkte }
JSON-Textnur Text, überall lesbar
wieder ein Objektdaten.name
  • { }
  • obj.key obj["key"]
  • JSON.stringify JSON.parse

8.1 · Objekte erstellen

JavaScript · Objekte
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

JavaScript · Methoden & Destructuring
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

JSON = JavaScript Object Notation. Ein Text-Format für den Datenaustausch. Keys müssen in doppelten Anführungszeichen stehen, Methoden sind nicht erlaubt.
JavaScript · JSON.stringify & JSON.parse
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));
Hausaufgabe — Kapitel 8
  • Erstelle ein Objekt für dein Center mit name, punkte, abgeschlossene_tutorials (Array) und premium
  • Füge zwei Methoden hinzu: info() und tutorial_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.

BauplanDaten von einem fremden Server

fetch fragt eine API an. await wartet auf die Antwort, die Seite läuft weiter.

Deine Seitefetch(url)
InternetAnfrage geht hinaus
API-Serverzum Beispiel Wetterdaten
Antwort als JSONresponse.json()

Ohne Internet oder bei einem Fehler: try/catch fängt ihn ab.

  • async await
  • fetch
  • try catch

Mit fetch() kannst du von APIs Daten laden — Wetter, Kurse, Benutzerinformationen. async/await macht das elegant möglich.

9.1 · Synchron vs. Asynchron

JavaScript · Asynchroner Code
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

JavaScript · fetch mit async/await
async function ladeWetter() {
  try {
    const response = await fetch(
      'https://api.open-meteo.com/v1/forecast?latitude=47.42&longitude=9.37&current_weather=true'
    );
    const daten = await response.json();
    console.log('Temperatur:', daten.current_weather.temperature);
  } catch (fehler) {
    console.error('Fehler:', fehler);
  }
}

ladeWetter();

Was macht await?

  • await pausiert 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ück
  • try/catch fängt Fehler ab — Netzwerkfehler, ungültige JSON-Antworten, etc.

9.3 · API-Daten auf der Seite anzeigen

✅ Beispiel — Wetter für St. Gallen anzeigen
async function zeigeWetter() {
  const url = 'https://api.open-meteo.com/v1/forecast?latitude=47.42&longitude=9.37&current_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);
Hausaufgabe — Kapitel 9
  • 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.

BauplanMerken über den Tab hinaus

localStorage speichert Text im Browser. Auch nach dem Schliessen ist er noch da.

Objektcave
localStoragenur in diesem Browser, nur Text
beim nächsten Besuchwieder ein Objekt

localStorage speichert nur Strings. Objekte zuerst mit JSON umwandeln.

  • setItem getItem removeItem
  • JSON.stringify JSON.parse

10.1 · localStorage Grundlagen

JavaScript · localStorage
// 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

JavaScript · Persistenter Zähler — komplettes Muster
// 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
Single Source of Truth: Dein State ist die einzige Wahrheit. Die UI spiegelt den State — niemals umgekehrt. State ändert → neu rendern. So bleiben State und UI immer synchron.
⚠️ localStorage-Grenzen: Nur ~5MB pro Domain. Nur Strings. Kein Passwort speichern! Synchron — blockiert bei grossen Daten. Für komplexe Apps: Supabase.
Hausaufgabe — Kapitel 10
  • 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.

BauplanAlles zusammen in script.js

Drei Funktionen machen deine MyFirst Site interaktiv.

script.jseine Datei für alle Seiten
Funktionen
Darkmodemerkt sich die Wahl mit localStorage
Aktive Navigationzeigt, wo du bist
Live-Uhr und Smooth Scrollläuft im Hintergrund
  • 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

✅ IN DATEI EINFÜGEN — script.js
// ── 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

✅ IN DATEI EINFÜGEN — script.js
// ── 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

✅ IN DATEI EINFÜGEN — script.js
// ── 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" });
  });
});
Init-Funktion Pattern: Jede Funktion prüft zuerst ob das Element existiert (if (!toggle) return;). So kann das gleiche script.js auf allen Seiten laufen ohne Fehler.
Hausaufgabe — Kapitel 11
  • 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.

BauplanVon der Seite zur App (Ausblick)

Eine PWA ist eine Webseite, die man installieren kann und die auch offline läuft.

Deine Sitewie bisher
Manifestmacht sie installierbar
Service Workeroffline-fähig
Appauf dem Startbildschirm

Dieses Kapitel wird freigeschaltet, wenn das Community Center startet.

🔒
Dieses Kapitel ist für Center Members

Die Registrierung auf mykeyz.ch ist noch nicht offen. Sobald das Community Center startet, wird dieses Kapitel freigeschaltet.

Was dich in Kapitel 12 erwartet:

Warum PWA? PWAs sind die Zukunft des mobilen Webs. Installierbar wie Apps, offline-fähig, Push-Nachrichten — alles ohne App Store. CheckMate, WeeklyPlan, OffGrid PowerOn — alles PWAs!
JS 101 — Komplett abgeschlossen!

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
Was kommt als nächstes?
PWA 101 — baue deine erste echte installierbare App mit allem was du gelernt hast!

→ PWA 101 ist in Vorbereitung.