Mit JavaScript das DOM verändern
Auf DOM-Elemente zugreifen
Eines der häufigsten Anwendungszwecke von JavaScript ist es, mit Elementen auf einer Website zu interagieren.
Nehmen wir folgendes Code-schnipsel als Beispiel:
|
|
Mit JavaScript möchten wir, dass sich die Zahl im <span>
erhöht. In einem ersten Schritt versuchen wir, auf das <span>
-Element zuzugreifen und eine andere Zahl reinzuschreiben. Das probieren wir direkt in der Konsole des Browsers aus:
|
|
Du wirst sehen, dass sich die Zahl im <span>
tatsächlich verändert hat. Probieren wir aber zuerst, den Code zu verstehen!
Erläuterung (click to expand)
document
ist ein Objekt, das uns im Browser zur Verfügung steht. Dieses Objekt repräsentiert das DOM. Mit diesemdocument
-Objekt können wir auf die Elemente im Browser zugreifen.getElementById(...)
ist eine Methode auf diesemdocument
-Objekt. Diese Methode sucht auf der aktuellen Seite ein Element, das die übergebeneid
besitzt.- Das gefundene Element möchten wir in einer Variablen namens
span
zwischenspeichern. textContent
ist ein Feld (= ein Attribut) auf diesem Element, das den Inhalt des Elements (als Text) repräsentiert. Diesen Wert können wir einfach so kopieren.
Mit diesem Code konnten wir die Anzahl Likes auf eine andere Zahl setzen. Nun möchten wir aber, dass sich diese Anzahl um genau 1 erhöht. Dafür benötigen wir noch zwei Zwischenschritte:
- Die aktuelle Zahl auslesen
- Diese Zahl von einem String in eine Nummer konvertieren
- Und die erhöhte Zahl ins
<span>
schreiben.
Versuche dies zu implementieren, bevor du dir die Lösung ansiehst.
Lösung (click to expand)
Das könnte ungefähr so aussehen:
|
|
Neu dazugekommen ist
- der Aufruf von
parseInt(...)
. Diese Methode ist standartmässig Global verfügbar und kann somit ohne imports verwendet werden. Diese Methode versucht, den übergeben Wert in eine Ganzzahl (Integer) zu konvertieren. likes++
bedeutet gleich viel wielikes = likes + 1
. Damit erhöhen wir dielikes
-Variable also um 1.- Mit
span.textContent = likes
setzen wir den Text desspan
s neu. Eine Umwandlung in String ist nicht notwendig.
Versuche das ganze nun mal ohne die parseInt Methode. Du wirst sehen, dass es trotzdem funktioniert. Das liegt daran, dass JS keine “starke” typen (strong types) kennt. Sprich der JS-Interpreter versucht auch einen String als Zahl zu verwenden und wenn es sich wirklich um eine Zahl handelt, funktioniert das auch:
|
|
Dies ist aber sehr fragil, daher ist es good practice, die Variablen trotzdem in die korrekten typen umzuwandeln. Gut zu wissen, ist das sich JavaScript teilweise etwas unerwartet verhält.
Manipulation beim Button-Klick ausführen lassen
Nun wollen wir noch, dass das, was wir vorher programmiert haben, dann passiert, wenn der User auf den Button klickt. Ändere die HTML-Seite wie folgt ab:
|
|
Ein neues Element hinzufügen
Manchmal möchtest du ein neues Element auf der Website generieren lassen.
Im kommenden Beispiel möchten wir so viele Bilder von “Thumbs Ups” (also 👍) wie Likes anzeigen.
Um das zu erzielen, kannst du die onLikeClick
-Funktion wie folgt erweitern:
|
|
Dieser Code macht folgendes:
- für jedes Like, wird im
<div id="message-div">
folgendes Element/Bild hinzugefügt:<img src="https://upload.wikimedia.org/wikipedia/commons/c/ce/Emoji_u1f44d.svg" alt="like" height="25">
- Das HTML für dieses Bild haben wir zuerst in einer Konstante (
const
) gespeichert.const
ist das Gleiche wielet
mit dem Unterschied, dass sich dieser Wert nie verändern darf innerhalb dieser Methode. Wenn sich eine Variable nie im definierten Block verändert, so wird empfohlen,const
stattlet
zu verwenden. - Die String-Variable
insertHtml
brauchen wir als Zwischenspeicher, in welcher wir den HTML-String zusammensetzen, welche wir später im HTML/DOM haben möchten. - Die
for
-Schlaufe wird so oft durchlaufen, wie es Likes gab. Das bedeutet, dass pro Like ein Bild insinsertHtml
kopiert wird. - Anschliessend holen wir uns das
<div id="message-div">
via JavaScript. Wir hätten hier auchdocument.getElementById('message-div')
verwenden können. AberquerySelector
funktioniert hier auch. DiequerySelector
-Methode akzeptiert ein CSS-Selektor und gibt dann das Element zurück, das damit angesprochen wird. In diesem Beispiel wardiv#message-div
ein möglicher CSS-Selektor (wie#message-div
eigentlich auch), der das<div id="message-div"
anspricht. - Als letztes verändern wir das HTML dieses
<div>
s, indem wir dasinnerHTML
-Feld neu setzen.
Element können jedoch nicht nur mit querySelector
hinzugefügt werden, sondern auh mit document.createElement()
. Mit der document.createElement()
-Methode kann man neue HTML-Elemente dynamisch erstellen und diese im DOM hinzufügen.
|
|
|
|
Super, nun hast du schon ein paar Dinge auf deiner Seite mit JavaScript dynamisch verändert.
Bitte denke daran, dass das Verwenden von .innerHTML
als eine Art “Holzfäller-Methode” angesehen wird. JavaScript bietet hierfür bereits eine elegantere Möglichkeit, die aber oft viel zu umständlich ist. Bitte schaue dir diese trotzdem kurz an: https://www.w3schools.com/js/js_htmldom_nodes.asp