JavaScript

Objekte, Events und Asynchronität

Informatik – 3. Semester

Software- und Web-Engineering I · TH Lübeck
Kleine Korrektur
Fehler
  • <script> elements sind nicht standardmäßig async
Realität
  • Eingefügte <script> Elemente sind standardmäßig async
    • … in Firefox
    • Das Verhalten variiert von Browser zu browser
Software- und Web-Engineering I · TH Lübeck

JavaScript

Objekte, Events und Asynchronität

Informatik – 3. Semester

Software- und Web-Engineering I · TH Lübeck
1 Objekte
2 Events
3 Asynchronität

Objekte, Funktionen, Prototypen, Klassen und die DOM

Software- und Web-Engineering I · TH Lübeck
Objekte
  • Java-Script Objekte sind ungeordnete Sammlungen von Werten, hier genannt „Properties“.
    • Objekte werden mit dem new-Operator erzeugt.
    • Properties können anschließend hinzugefügt werden.
// obj ist ein leeres Objekt
var obj = new Object();
// obj erhält neue Properties
obj.p = 2; // p mit Wert 2
obj.q = "x"; // q mit Wert "x"
// alternative Schreibweise
obj["p"] = 2;
obj["q"] = "x";
Software- und Web-Engineering I · TH Lübeck
Objekte – Zuweisung
  • Bei der Zuweisung werden nur Referenzen auf die Objekte übergeben.
  • Es wird keine Kopie angelegt.
var a = new Object();
var b = new Object();
a.p = 2;
b.q = 3;
a = b;
b.p = 4;
document.write("a.p: "+ a.p + " / a.q: "+ a.q);
Ausgabe: a.p: 4 / a.q: 3
Software- und Web-Engineering I · TH Lübeck
Funktionen

Funktionen werden mit function deklariert und können Parameter, lokale Variablen und Rückgabewerte haben. Innerhalb einer Funktion können auch andere Funktionen aufgerufen werden.

function abstand( x1, y1, x2, y2 ) {
  var dx = x1 - x2;
  var dy = y1 - y2;
  return Math.sqrt(dx*dx + dy*dy);
}
var d = abstand(1,4,2,3); // d hat den Wert 1.4142…
Software- und Web-Engineering I · TH Lübeck
Funktionen

Auch rekursive Funktionen sind erlaubt.

function fakultaet(x) {
  if( x <= 1 ) {
    return 1;
  } else {
    return x * fakultaet(x-1);
  }
}
var d = fakultaet(5); // d hat den Wert 120
Software- und Web-Engineering I · TH Lübeck
Funktionen

Als Parameter können auch Objekte übergeben werden.

function abstand( p1, p2 ) {
  var dx = p1.x - p2.x;
  var dy = p1.y - p2.y;
  return Math.sqrt(dx*dx + dy*dy);
}
var p1 = new Object();
p1.x = 1;
p1.y = 4;
var p2 = new Object();
p2.x = 2;
p2.y = 3;
document.write( abstand(p1, p2) );
Software- und Web-Engineering I · TH Lübeck
Funktionen

Mit Hilfe von Funktionen können Objekt-Konstruktoren definiert werden.

Punkt = function( x, y ) {
  this.x = x; // "this" bezieht sich auf das neu
  this.y = y; // erzeugte Objekt
}
var p1 = new Punkt(1, 4); // p1.x = 1 und p1.y = 4
var p2 = new Punkt(2, 3); // p2.x = 2 und p2.y = 3
Software- und Web-Engineering I · TH Lübeck
Funktionen

Ein Konstruktor kann auch Funktionen definieren:

Punkt = function ( x, y ) {
  this.x = x; this.y = y;
  this.abstand = function(p) {
    var dx = x - p.x;
    var dy = y - p.y;
    return Math.sqrt(dx*dx + dy*dy);
  }
}

var p1 = new Punkt(1, 4);
var p2 = new Punkt(2, 3);
var d = p1.abstand(p2); // d = 1.414213...
Software- und Web-Engineering I · TH Lübeck
Prototypen – Protoype Chain
  • Object ist der Grundprototyp in JavaScript
s1
ist ein →
Student
ist ein →
Object
Software- und Web-Engineering I · TH Lübeck
Prototypen

Alle JavaScript Objekte erben von einem Prototyp:

Student = function( firstName, lastName ) {
  this.firstName = firstName;
  this.lastName  = lastName;
}

var s1 = new Student("Lena","Müller");
Student.prototype.identificationNumber = 1234;

console.log(s1.identificationNumber);

Über den Zugriff auf den Prototyp kann Vererbung realisiert werden.

Software- und Web-Engineering I · TH Lübeck
2.3 Client : Javascript
ExchangeStudent = function(firstName, lastName, homeInstitution) {
  Student.call(this, firstName, lastName);
  this.homeInstitution = homeInstitution;
}

ExchangeStudent.prototype= new Student();
var eS1 = new ExchangeStundent(“Lin",“Vu“, “East China University“);

console.log(eS1.firstName);
  • Mit der Methode call kann man einen Konstruktor aufrufen.
  • Hier den Konstruktor von Student
Software- und Web-Engineering I · TH Lübeck
Klassen
  • Seit ES6 gibt es in JavaScript das Schlüsselwort class. Damit können Sie objektorientiert programmieren, wie es z.B. aus Java gewöhnt sind. Das neue Klassenmodell ist allerdings nur syntactic sugar, es wird keine neue Funktionalität ermöglicht. Implementiert ist weiterhin das prototypenbasierte Modell.
  • Vererbung mit extends und Methodenaufrufe mit super() sind seit ES6 auch möglich.
Software- und Web-Engineering I · TH Lübeck
Klassen
class Tier {
    constructor(name) {
        this.name = name;
    }
    sprich() {
        console.log(this.name + ' macht ein Geräusch.');
    }
}

Für Konstruktoren benutzt man das Schlüsselwort constructor.

Software- und Web-Engineering I · TH Lübeck
Klassen
class Katze extends Tier {
    sprich() {
        super.sprich();
        console.log(this.name + ' miaut.');
    }
}

Für Vererbung benutzt man das Schlüsselwort extends.

Software- und Web-Engineering I · TH Lübeck
Objekte – DOM Objekte
  • Knoten (nodes) sind Objekte im DOM-Baum und bieten eine bestimmte Schnittstelle, z.B.
    • parentNode
    • firstChild
    • nextSibling
  • Einige Knotentypen können Kinder haben, andere sind immer Blätter.
Software- und Web-Engineering I · TH Lübeck
Objekte – Node Typen
Konstante Wert Beispiel
Node.ELEMENT_NODE 1 An Element node like <p> or <div>.
Node.TEXT_NODE 3 The actual Text inside an Element or Attr.
Node.PROCESSING_INSTRUCTION_NODE 7 A ProcessingInstruction of an XML document, such as <?xml-stylesheet … ?>.
Node.COMMENT_NODE 8 A Comment node, such as <!-- … -->.
Node.DOCUMENT_NODE 9 A Document node.
Node.DOCUMENT_TYPE_NODE 10 A DocumentType node, such as <!doctype html>.
Node.DOCUMENT_FRAGMENT_NODE 11 A DocumentFragment node.
Software- und Web-Engineering I · TH Lübeck
Objekte – DOM Objekte

Die DOM lässt sich wie alle Bäume traversieren

// DOM Traversal
function walkTheDOM(node, func) {
  func(node);
  node = node.firstElementChild;
  while (node) {
    walkTheDOM(node, func);
    node = node.nextElementSibling;
  }
}
Software- und Web-Engineering I · TH Lübeck
Objekte – DOM-Objekte

Zu DOM gehören (u.a.) die folgenden Funktionen:

document.getElementById( value )
Liefert eine Referenz auf den Elementknoten, der ein id-Attribut mit dem angegebenen Wert besitzt. Dadurch ist es möglich, direkt auf einen Elementknoten zuzugreifen, ohne eine Kette von Referenzen angeben zu müssen. Da die Werte von id-Attributen innerhalb eines Dokuments eindeutig sein müssen, kann es immer nur einen passenden Elementknoten geben.

document.getElementsByTagName( tagName )
Liefert ein Array mit Referenzen auf alle Elementknoten mit dem ange-gebenen Tag-Namen (z.B. „form“, „input“, „h1“, „p“, usw.) in der Reihenfolge einer Pre-Order-Traversierung des Objektbaums.

Software- und Web-Engineering I · TH Lübeck
Objekte – DOM Objekte

Die zuvor besprochenen Selektoren werden wie folgt verwendet:

document.querySelector( Selector )
Liefert eine Referenz auf den ersten Elementknoten, der dem Selektor entspricht

document.querySelectorAll( Selector )
Liefert ein Array mit Referenzen auf alle Elementknoten, die dem Selektor entsprechen.

Software- und Web-Engineering I · TH Lübeck
Objekte – DOM Objekte

document.createElement( tagName )
Liefert eine Referenz auf einen neuen Elementknoten vom angegebenen Typ (z.B. „form“, „input“, „h1“, „p“, usw.). Dieser Elementknoten gehört jedoch noch nicht zum Objektbaum. Dazu muss er erst eingefügt werden.

node.appendChild( newChild )
Fügt den Elementknoten newChild als neuen Kindknoten des Knotens node ein (ggf. hinter den letzten bereits bestehenden).

node.removeChild( oldChild )
Entfernt den Elementknoten oldChild des Knotens node.

Software- und Web-Engineering I · TH Lübeck
Objekte – DOM Objekte

node.setAttribute(name, wert)
Haben Sie einen Node als Variable können Sie mit setAttribute Werte setzen, wie z.B. die Id.

node.innerHTML = text
Sie können den Text auch direkt mit dem Befehl innerHTML setzen.

node.getAttribute(name)
Analog zu setAttribute können Sie mit getAttribute den Wert eines Attributes auslesen.

Software- und Web-Engineering I · TH Lübeck
Objekte – Vordefinierte Objekte

Eine Reihe nützlicher, browserunabhängiger Objekte sind in ECMAScript bereits vordefiniert. Unter anderem gibt es:

Array – Erzeugung
new Array()
new Array(n)
new Array(Element1, …, Elementn)

Anzahl der Elemente: a.length

Array – Zugriff (auf ein Array a)
a.push(Element) Fügt ein neues Element am Ende ein
a.pop() Löscht das letzte Element
a.unshift(Element) Fügt ein neues Element am Anfang ein
a.shift() Löscht das erste Element
a[i] Zugriff auf das i-te Element (beginnend bei 0)
Software- und Web-Engineering I · TH Lübeck
Objekte – Vordefinierte Objekte

Vordefinierte Objekte: (Fortsetzung)

Math – Braucht nicht instanziiert zu werden. Funktionen (u.a.):

random() Liefert eine Zufallszahl r, wobei 0 ≤ r < 1
round(r) Rundet die Zahl r auf eine ganze Zahl
ceil(r) Liefert die kleinste ganze Zahl, die nicht kleiner als r ist
floor(r) Liefert die größte ganze Zahl, die nicht größer als r ist
sqrt(r) Berechnet die Quadratwurzel von r
exp(r) Berechnet er
log(r) Berechnet den natürlichen Logarithmus von r
Software- und Web-Engineering I · TH Lübeck
Objekte – Vordefinierte Objekte

Vordefinierte Objekte: (Fortsetzung)

Date – Erzeugung:

  • new Date()
    Erzeugt ein Datumsobjekt mit dem aktuellen Client-Datum und der aktuellen Client-Uhrzeit
  • new Date( 2006, 11, 15 )
    Erzeugt ein Datumsobjekt, das als Datum den 15. Dezember 2006 und als Zeit 0:00:00 Uhr enthält (die Monatszählung beginnt bei 0!)
  • new Date( 2006, 11, 12, 15, 30, 10 )
    Erzeugt ein Datumsobjekt, das als Datum den 12. Dezember 2006 und als Zeit 15:30:10 Uhr enthält

Intern enthält ein Datumsobjekt lediglich eine Zahl, welche die seit dem 1.1.1970 vergangenen Millisekunden angibt (bzgl. UTC).

Software- und Web-Engineering I · TH Lübeck
Objekte – Vordefinierte Objekte

Vordefinierte Objekte: (Fortsetzung)

Date – Zugriff auf die Komponenten:

getDate(), setDate() Liefert bzw. setzt den Tag
getMonth(), setMonth() Liefert bzw. setzt den Monat
getFullYear(), setFullYear() Liefert bzw. setzt das Jahr
getHours(), setHours() Liefert bzw. setzt die Stunde
getMinutes(), setMinutes() Liefert bzw. setzt die Minute
getSeconds(), setSeconds() Liefert bzw. setzt die Sekunde

Ausgabe:

d.toDateString() Liefert das Datum von d als Zeichenfolge
d.toTimeString() Liefert die Uhrzeit von d als Zeichenfolge
d.toLocaleString() Liefert Datum und Uhrzeit von d als Zeichenfolge, z.B. „Dienstag, 5. Dezember 2006 15:20:00“
Software- und Web-Engineering I · TH Lübeck
1 Objekte
2 Events
3 Asynchronität

Auf Interaktionen reagieren

Software- und Web-Engineering I · TH Lübeck
Events
  • Sie benutzen JavaScript im Client besonders, um Ihre Webanwendung interaktiv zu gestalten. Dazu müssen Sie auf Events reagieren. Es gibt folgende Eventtypen in JavaScript:
  • UI events (Klick, Touch, Mausbewegung, ...)
  • UI logical events (Änderung des Fokus, ...)
  • Mutation events / mutation observers (Einfügen oder Entfernen von Knoten, Ändern von Attributen,...)
  • Custom events (selbstdefinierte Events)
Software- und Web-Engineering I · TH Lübeck
Events
  • Typischerweise wird ein Event vom User Agent (Browser) geworfen
  • Alle DOM Events implementieren das Interface Event
  • Man kann listener auf Events anmelden
  • Das Event bewegt sich durch das DOM (capturing bzw. bubbling) und benachrichtigt auf diesem Weg alle listener
Software- und Web-Engineering I · TH Lübeck
Events
  • Um auf Events zu reagieren, meldet man einen EventListener an. Die Methoden sind im Interface EventTarget definiert
  • Zum Beispiel:
element.addEventListener("someEventType",
    function(e) {
      //do something
    })
Optionen möglich
Software- und Web-Engineering I · TH Lübeck
Events – DOM Mutationen
  • Unter DOM Mutations versteht man das Ändern von Attributen der DOM-Elemente. Dazu zählt das Hinzufügen oder Entfernen von Kindern. Die Methoden document.createElement( tagName ), node.appendChild( newChild ) und node.removeChild( oldChild ) haben wir bereits besprochen.
  • Neuere Browser unterstützen den MutationObserver. Damit können Sie z.B. mit obj.addEventListener('DOMNodeInserted', callback, false); arbeiten.
Software- und Web-Engineering I · TH Lübeck
Objekte – JSON
  • JSON (JavaScript Object Notation) ist ein menschenlesbares Format zum Austausch von Daten. Es ist an JavaScript orientiert. Sie können JSON als Alternative zu XML verwenden, um z.B. Daten vom Server zu laden.
  • Sie kennen folgenden Weg, um in JavaScript Objekte anzulegen:
let p1 = new Object();
p1.x = 1;
  • Sie können ein Objekt aber auch als Literal erzeugen.
let p1 = {x: 1, y: 42, c: {}};
Software- und Web-Engineering I · TH Lübeck
Objekte – JSON
{
  "Titel": "JavaScript: The Good Parts: Working with…",
  "Autor": "Douglas Crockford",
  "ISBN-10": "0596517742",
  "Verlag": "O'Reilly and Associates",
  "Rezensionen": [
    {
      "Autor": "Algorithmenfreund",
      "Text": "Der Autor..."
    },
    {
      "Autor": "Moaaz Ashour",
      "Text": "One of my teachers..."
    }
  ]
}
  • Eine dem Literal ähnliche Form können Sie auch in einem JSON-Dokument verwenden
  • Mit den Funktionen JSON.parse() und JSON.stringify() können Sie Strings in JSON-Objekte umwandeln (und umgekehrt).
Software- und Web-Engineering I · TH Lübeck
1 Objekte
2 Events
3 Asynchronität

Daten nachladen mit Callbacks, Promises und fetch()

Software- und Web-Engineering I · TH Lübeck
Asynchronität
  • In JavaScript arbeiten Sie oft asynchron
  • Sie möchten z.B. Daten im JSON Format vom Server nachladen, um die Seite zu aktualisieren (Client-Side Rendering, AJAX)
  • Beispiel: Single-Page Applications
    • Es wird nur ein HTML-Dokument initial geladen
    • alle Inhalte werden nachgeladen
  • Damit Website reaktiv bleibt, sollteNachladen im Hintergrund passieren
    • nach der Fertigstellung werden bestimmte Funktionen ausgelöst (asynchroner Callback)
  • Sie können Daten vom Server laden und dann Events und Callbacks benutzen, um asynchron zu arbeiten.
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Introducing
Software- und Web-Engineering I · TH Lübeck
Asynchronität
  • Die Fetch-API ermöglich es, Daten vom Server zu laden.
  • fetch() bekommt eine URL übergeben und gibt ein Promise zurück (folgt). Diese API wird momentan oft verwendet.
  • Alternativ kann die XMLHttpRequest API verwendet werden. Diese findet man eher in älterem Codeund werden häufig mit den bekannten EventListeners verwendet.
const request = new XMLHttpRequest();
try {
  request.open("GET", "https://.../products.json");
  request.responseType = "json";
  request.addEventListener(
    "load", () => initialize(request.response)
  );
  request.addEventListener(
    "error", () => console.error("XHR error")
  );
  request.send();
} catch (error) {
    console.error(`XHR error ${request.status}`);
}
Software- und Web-Engineering I · TH Lübeck
Asynchronität
  • Um asynchrone Programmierung zu erleichtern, gibt es Mechanismen, z.B. Promises
  • Eine asynchrone Funktion gibt ein Objekt vom Typ Promise zurück. Dies repräsentiert den Status der Operation
  • Die then() Methode eines Promises wird aufgerufen, wenn eine erfolgreiche Antwort der asynchronen Funktion kommt. Fehler können Sie mit catch() abfangen
  • Der Einfachheit halber arbeiten Sie oft mit async, um asynchrone Funktionen zu kennzeichnen. In der Funktion nutzen Sie await um eine Funktion aufzurufen, die ein Promise zurück gibt.
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Introducing
Software- und Web-Engineering I · TH Lübeck
Asynchronität

fetch() lädt Ressourcen vom Netzwerk und gibt ein Promie zurück

sync function fetchProducts() {
  try {
    const response = await fetch(
      "https://.../products.json"
    );
    if (!response.ok) {
      throw new Error(`HTTP error: ${response.status}`);
    } const data = await response.json(); return data;
  } catch (error) {
    console.error(`Could not get products: ${error}`);
  }
}
const promise = fetchProducts();
promise.then((data) => console.log(data[0].name));
Software- und Web-Engineering I · TH Lübeck
Asynchronität
const fetchPromise = fetch(
  "https://mdn.github.io/learning-area/javascript/apis/fetching-data/can-store/products.json",
);

fetchPromise.then((response) => {
  const jsonPromise = response.json();
  jsonPromise.then((data) => {
    console.log(data[0].name);
  });
});
  • Sie können Promises verketten (chaining), wenn Sie mit dem Ergebnis einer asynchronen Funktion die nächste aufrufen wollen. Das funktioniert mit Verschachtelung (nesting).
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Promises
Software- und Web-Engineering I · TH Lübeck
Asynchronität
const fetchPromise = fetch(
  "https://mdn.github.io/learning-area/javascript/apis/fetching-data/can-store/products.json",
);

fetchPromise
  .then((response) => response.json())
  .then((data) => {
    console.log(data[0].name);
  });
  • …oder dadurch das Promise einfach weiter zu geben.
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Promises
Software- und Web-Engineering I · TH Lübeck
Asynchronität

Probleme mit Promises

Es gibt verschiedene Probleme, die bei der Benutzung von Promises auftreten können, z.B. sind einfache Loops manchmal problematisch. Die Benutzung von Promise.all() ist vorzuziehen.

// I want to remove() all docs
db.allDocs({include_docs: true}).then(function (result) {
  result.rows.forEach(function (row) {
    db.remove(row.doc);
  });
}).then(function () {
  // I naively believe all docs have been removed() now!
});
Returned undefined, es wird nicht gewartet
https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
Software- und Web-Engineering I · TH Lübeck
Asynchronität

Probleme mit Promises

Die Fehlerbehandlung ist teilweise schwierig.

const handleSave = rawUserData => {
  saveUser(rawUserData)
    .then(user => createToast(`User ${displayName(user)} has been created`))
    .catch(err => createToast(`User could not be saved`));
};
Catch bezieht sich auch auf den Erfolgsfall. Wenn es z.B. bei displayName enen Fehler gibt, springt er dann in den catch() Block
https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
Software- und Web-Engineering I · TH Lübeck

- Fortsetzung von JavaScript Teil 1 (web-04) - Titelfolie ergaenzt: Quelle V4.pptx beginnt ohne Titel (Fortsetzungsdeck)

- Korrektur zur letzten Vorlesung (Script Parsing): dynamisch eingefuegte Skripte - Nur eingefuegte script-Elemente sind standardmaessig async, und das browserabhaengig

- Einstieg: zweiter JavaScript-Teil, heute Objekte, Events und Asynchronitaet - Nicht auf dem Titel verweilen

- Drei Bloecke heute: Objekte (inkl. Funktionen, Prototypen, DOM), Events, Asynchronitaet - Roadmap kurz zeigen

- Properties koennen jederzeit nachtraeglich ergaenzt werden, beide Schreibweisen zeigen - Achtung: Zuweisung ohne Schluesselwort erzeugt eine globale Variable

- Zeile fuer Zeile durchgehen: a = b laesst a auf dasselbe Objekt zeigen - Kernaussage: Referenzsemantik, keine Kopien

- Grundform einer Funktion zeigen: Parameter, lokale Variablen, return

- Klassisches Rekursionsbeispiel Fakultaet, kurz durchrechnen lassen

- Gleiches Beispiel wie zuvor, jetzt mit Punkt-Objekten statt vier Zahlen - Objekte als Parameter werden per Referenz uebergeben

- Konstruktorfunktion: mit new aufgerufen, this zeigt auf das neue Objekt

- Methoden entstehen, indem der Konstruktor Funktionen an this haengt - abstand ist jetzt an jedem Punkt-Objekt verfuegbar

- Prototypen-System basiert auf Referenzen: alle Instanzen zeigen auf denselben Prototyp - Prototype Chain: Anfrage wird erst am Objekt, dann am Prototyp, dann an dessen Prototyp gesucht - Wird am Prototyp etwas geloescht, verlieren es alle, die auf ihn zeigen

- identificationNumber wird nachtraeglich am Prototyp ergaenzt und ist sofort an s1 sichtbar - Hoisting: Funktionsdeklarationen werden an den Anfang gehoben, Klassen nicht

- call ruft den Student-Konstruktor im Kontext des neuen Objekts auf - prototype-Zuweisung stellt die Kette ExchangeStudent -> Student her

- ES = ECMAScript; class ist nur syntactic sugar ueber dem Prototypen-Modell - Syntactic sugar: Sprachfeature, das Code lesbarer macht, ohne neue Funktionalitaet

- Java-aehnliche Syntax, constructor statt Klassennamen

- super.sprich() ruft die Basisklassen-Methode auf - Beispiel-Lauf: new Katze("Katjes").sprich() gibt beide Zeilen aus

- Knoten mit Kindern: z.B. body, section; Blaetter: z.B. Textknoten in einem p - Baum: gewurzelter, gerichteter Graph ohne Zyklen, genau ein Weg von der Wurzel zu jedem Knoten

- Alle Nodes sind Interfaces mit eigenen Methoden und Eigenschaften (z.B. getAttribute) - Fehlende Werte 4, 5 usw. sind deprecated

- Rekursive Tiefensuche ueber firstElementChild und nextElementSibling - firstElementChild ist neuer als firstChild, in modernen Browsern aber ok

- getElementById: direkter Zugriff, ids sind eindeutig - getElementsByTagName: alle Treffer in Pre-Order-Reihenfolge

- Anknuepfen an CSS-Selektoren aus der CSS-Vorlesung - querySelector: erster Treffer, querySelectorAll: alle Treffer

- createElement erzeugt Knoten ausserhalb des Baums, erst appendChild fuegt ihn ein

- setAttribute/getAttribute fuer Attribute, innerHTML fuer den Inhalt

- Array als erstes vordefiniertes Objekt: Erzeugung, push/pop, unshift/shift, Indexzugriff

- Math ist statisch, keine Instanz noetig - random liefert Werte in [0, 1), fuer Wuerfel o.ae. skalieren und runden

- Monatszaehlung beginnt bei 0, beliebte Fehlerquelle - Intern nur Millisekunden seit 1.1.1970 (UTC)

- Getter/Setter fuer alle Komponenten, toLocaleString fuer lesbare Ausgabe

- Zweiter Block: Events, damit die Webanwendung interaktiv wird

- Vier Eventtyp-Kategorien einmal aufzaehlen - Mutation observers haben die mutation events in DOM 4 abgeloest

- target = Objekt, an das das Event dispatched wird; currentTarget = Objekt, dessen Listener gerade laeuft - Mit onload und submit haben wir quasi schon mit Events gearbeitet

- Demo-Idee: hamburger.js mit querySelector('#hamburger').addEventListener('click', ...) - Im Debugger zeigen, kurz auch die Mutation/Manipulation erklaeren

- Brueckenschlag zu den DOM-Methoden von vorhin - MutationObserver als moderner Weg, auf DOM-Aenderungen zu reagieren

- Demo-Idee: auf tagesschau.de im Inspektor zeigen, wie JSON geholt wird - Literal-Schreibweise als Ueberleitung zum JSON-Format

- JSON-Dokument sieht fast wie ein JS-Literal aus, aber Keys in Anfuehrungszeichen - parse und stringify als Umwandlungsfunktionen nennen

- Dritter Block: Asynchronitaet, im Original eine eigene Kapitel-Folie

- Motivation ueber Single-Page Applications: nur ein initiales HTML, Rest wird nachgeladen - Nachladen im Hintergrund haelt die Seite reaktiv

- fetch als moderner Standard, XMLHttpRequest als Altbestand - XHR-Beispiel arbeitet mit den bekannten EventListeners (load, error)

- Promise = Statusobjekt der Operation; then fuer Erfolg, catch fuer Fehler - async/await als bequemere Schreibweise darueber

- await auf fetch und auf response.json(), Fehler ueber try/catch - Rueckgabe der async Funktion ist selbst ein Promise (promise.then am Ende)

- Nesting: then im then, funktioniert, wird aber schnell unuebersichtlich

- Flaches Chaining: jedes then gibt das naechste Promise weiter, besser lesbar

- forEach wartet nicht auf die remove-Promises, das zweite then feuert zu frueh - Promise.all() als richtige Loesung nennen

- catch faengt auch Fehler aus dem then-Erfolgszweig (z.B. displayName) - Nutzer sieht dann faelschlich "could not be saved"