studyklar
IProg · Klausur 1 · Aufgabe 2

Drei Klicks verändern die Seite: DOM mit JavaScript

Drei Zeilen, drei Klicks, drei Änderungen an der Seite. Rechts steht der Code, darunter die Seite, wie der Browser sie nach dem Klick des aktuellen Schritts zeigt. Mit Weiter geht es Klick für Klick voran.

Die Aufgabe

Aufgabe 2: JavaScript

Gegeben ist eine Seite mit drei Zeilen. Jede Zeile hat ihren eigenen onclick-Handler. Der Text jeder Zeile ist zunächst „Hier passiert etwas“. Die Zeilen werden nacheinander angeklickt: Zeile 1, dann Zeile 2, dann Zeile 3. Geben Sie nach jedem Klick an, was passiert.

  1. Klick auf Zeile 1: über alle Zeilen iterieren (getElementsByTagName), das Element mit Index 2 (das dritte) auswählen und seinen Text durch XXX ersetzen.
  2. Klick auf Zeile 2: den Text des zweiten Elements auf YYY setzen.
  3. Klick auf Zeile 3: ein neues Text-Objekt mit dem Inhalt „NEU“ erstellen, es einem ebenfalls neu erstellten Überschrift-Objekt als Kind zuweisen und dann beides an das dritte Listenelement anhängen.
<script>  function klick1() {    let zeilen = document.getElementsByTagName("li");    for (let i = 0; i < zeilen.length; i++) {      if (i == 2) {        zeilen[i].innerText = "XXX";      }    }  }  function klick2() {    document.getElementsByTagName("li")[1].innerText = "YYY";  }  function klick3() {    let text = document.createTextNode("NEU");    let ueberschrift = document.createElement("h2");    ueberschrift.appendChild(text);    document.getElementsByTagName("li")[2].appendChild(ueberschrift);  }</script> <body><ul>  <li onclick="klick1()">Hier passiert etwas</li>  <li onclick="klick2()">Hier passiert etwas</li>  <li onclick="klick3()">Hier passiert etwas</li></ul></body>

Die Aufgabe ist aus dem Gedächtnisprotokoll nachgebaut. Das Protokoll beschreibt nur, was die drei Handler tun; HTML und Code fehlen. Wir haben beides festgelegt: eine Liste mit drei Zeilen (<li>). Das Protokoll nennt einmal "p" und einmal „Listenelement“. Wir nehmen Listenelemente, denn in einem Absatz <p> darf keine Überschrift stehen, in einem <li> schon. Punkte nennt das Protokoll nicht.

Das Protokoll schreibt getElementByName("p"). Diese Methode gibt es so nicht; getElementsByName sucht nach dem Attribut name. Gemeint ist das Suchen nach dem Tag-Namen: getElementsByTagName.

In eigenen Worten: Jede Zeile ruft beim Anklicken ihre eigene Funktion auf. Gefragt ist je Klick: Was macht die Funktion, und was sieht der Benutzer danach?

Das DOM (Document Object Model) ist die Seite als Baum aus Knoten: Elemente wie <li> und darin Textknoten. JavaScript kann diesen Baum lesen und ändern; der Browser zeigt sofort den neuen Stand.

Aus Klausur 2, Aufgabe 2 („JavaScript und DOM: Namen ausblenden und Farbe per Klick wechseln“): Auch dort ändert JavaScript eine Liste über das DOM: Namen ausblenden mit style.display, Farbe wechseln beim Klick.
Merke: createElement und createTextNode erzeugen nur Knoten. Sichtbar werden sie erst, wenn appendChild sie in den Baum der Seite hängt.
  1. Die Seite vor dem ersten Klick ansehen.
  2. Klick auf Zeile 1: Schleife und Index 2.
  3. Klick auf Zeile 2: Index 1.
  4. Klick auf Zeile 3: neue Knoten bauen und anhängen.
  5. Ergänzung: was weitere Klicks bewirken.

Die Seite vor dem ersten Klick

Die Liste <ul> hat drei Zeilen <li>. Jede trägt ein Attribut onclick: Beim Anklicken ruft der Browser die genannte Funktion auf, Zeile 1 also klick1().

Die drei Funktionen stehen oben im <script>. Bis zum ersten Klick läuft keine davon. Der Benutzer sieht dreimal „Hier passiert etwas“.

Klick auf Zeile 1

getElementsByTagName("li") liefert alle <li> der Seite als Liste, in der Reihenfolge im Dokument. Gezählt wird ab 0: Index 0 ist Zeile 1, Index 2 ist Zeile 3.

Die Schleife geht i = 0, 1, 2 durch. Nur bei i == 2 greift das if: innerText = "XXX" ersetzt den ganzen Inhalt der dritten Zeile durch XXX.

Antwort 1: Die dritte Zeile zeigt „XXX“; die angeklickte erste Zeile bleibt gleich.

Aus Skript 02, Folie 8: document.getElementsByTagName("TagName")[i] liefert ein Array, da die meisten Tags mehrfach vorkommen.
Noch 4 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

<script>  function klick1() {    let zeilen = document.getElementsByTagName("li");    for (let i = 0; i < zeilen.length; i++) {      if (i == 2) {        zeilen[i].innerText = "XXX";      }    }  }  function klick2() {    document.getElementsByTagName("li")[1].innerText = "YYY";  }  function klick3() {    let text = document.createTextNode("NEU");    let ueberschrift = document.createElement("h2");    ueberschrift.appendChild(text);    document.getElementsByTagName("li")[2].appendChild(ueberschrift);  }</script> <body><ul>  <li onclick="klick1()">Hier passiert etwas</li>  <li onclick="klick2()">Hier passiert etwas</li>  <li onclick="klick3()">Hier passiert etwas</li></ul></body>

Browser, vor dem ersten Klick

  • Hier passiert etwas
  • Hier passiert etwas
  • Hier passiert etwas
LegendeDie Seite: drei Zeilen, jede ruft beim Klick ihre eigene Funktion auf.