5. Interaktion mit dem Benutzer: Javascript im Browser
In diesem Kapitel gehen wir wieder komplett offline. Wir werden sehen, wie wir unseren HTML-Seiten ohne jede Netzwerk-Aktivität ausgefeiltes Verhalten verleihen. Dies geht mit Javascript, der Programmiersprache, die wir bereits serverseitig kennengelernt haben.
5.1 Die Javascript-Konsole in Ihrem Browser
Öffnen Sie die HTML-Seite 00-as-simple-as-possible.html in einem neuen Tab und auch in einem Text-Editor. Gehen Sie in das neue Tab und öffnen Sie die Javascript-Konsole. In Google-Chrome auf OSX geht das mit Alt+Cmd+J. Finden Sie heraus, wie es auf Ihrem Browser geht und prägen es sich ein. Bei mir sieht das dann so aus:
Die Konsole im rechten Teil können Sie auch ganz normal als REPL-Fenster für
Javascript verwenden, ähnlich dem Programm node
auf der
Rechner-Konsole. Der entscheidende Punkt ist,
dass Ihre HTML-Seite mit allen Elementen auch als Javascript-Objekt
unter dem Variablennamen
document
existiert. Stellen Sie sich das erstmal einfach
als großen Baum vor, der irgendwie alle HTML-Elemente hierarchisch strukturiert
enthält.
Es gibt mehrere Möglichkeiten, einzelne Elemente unserer HTML-Seite gezielt anzusprechen.
Die einfachste ist wohl, ihnen eine eindeutige id
zu verleihen.
Schauen wir in den Quelltext von
00-as-simple-as-possible.html:
<div class="container">
<p id="firstParagraph">
Dies ist ein Beispieltext. Es soll demonstrieren, wie Sie mit <code>Javascript</code>
ohne jede Serverinteraktion, ja ohne jede Netzwerkaktivität, Ihrer HTML-Seite
ausgefeiltes Verhalten verleihen können.
</p>
<p id="secondParagraph">
Hier kommt ein weiterer Absatz, damit wir etwas rumspielen können.
</p>
</div>
Die rot markierten Stellen legen für beide <p>
-Elemente
eine id
fest. Über diese id
bekommen wir sie
in der Javascript-Konsole zu fassen.
p1 = document.getElementById("firstParagraph");
Wenn Sie jetzt p1
in der Konsole tippen (und nicht Enter
drücken), dann sehen Sie vielleicht das entsprechende HTML-Element markiert.
Bei mir sieht das so aus:
Die Variable p1
enthält nun ein Javascript-Objekt, dass das
entsprechende HTML-Element darstellt. Wir können es jetzt auf der
Konsole etwas auskundschaften.
p1.id;
'firstParagraph'
p1.innerHTML;
'\n Dies ist ein Beispieltext. Es soll demonstrieren, wie Sie mit \n <code>Javascript</code>\n ohne jede Serverinteraktion, ja ohne jede Netzwerkaktivität, \n Ihrer HTML-Seite\n ausgefeiltes Verhalten verleihen können.\n '
p1.innerText;
'Dies ist ein Beispieltext. Es soll demonstrieren, wie Sie mit Javascript ohne jede Serverinteraktion, ja ohne jede Netzwerkaktivität, Ihrer HTML-Seite ausgefeiltes Verhalten verleihen können.'
Sie sehen: der Key innerHTML
enthält als String den
HTML-Quelltext, wie er in der Quelldatei angegeben ist, mit allem Whitespace und allen
weiteren HTML-Tags.
Der Key innerText
enthält als String den Text, wie er
dann im Browser angezeigt wird. Wir können die Werte auch ändern:
p1.innerHTML = 'Ich schreibe per Hand neuen Text rein.';
p1.style.color = 'red';
p1.style.background = 'lightgray';
Wenn Sie alles richtig gemacht haben, sollte jede Befehlszeile in dem Moment, wo Sie Enter drücken, die Seite im Browser verändern. Bei mir sieht sie am Ende so aus:
Lassen Sie uns die Baumstruktur der HTML-Dokuments erkunden.
Was ist der Elternknoten von p1
? Schauen Sie in den HTML-Quelltext.
Es ist ein div
-Element. Und in der Tat:
p1 = document.getElementById("firstParagraph");
parent = p1.parentNode;
parent.style.border = '1pt solid black';
das ändert das CSS-Attribut border
des Elternelements und
lässt uns somit graphisch erkennen, welches das Eltern-Element ist:
Machen wir weiter. Das Objekt parent
enthält einen
Zeiger auf eine Liste seiner Kinder-Elemente:
children = parent.childNodes;
NodeList(5) [text, p#firstParagraph, text, p#secondParagraph, text]
p2 = children[3];
p2.id;
'secondParagraph'
p2.style.color='blue';
Bei mir kommt dann das hier raus:
Wir können uns also mit element.parentNode
und
element.childNodes
durch den Dokumentbaum hangeln. Allerdings
müssen Sie vorsichtig sein:
element.childNodes
gibt Ihnen kein normales Javascript-Array zurück. Wenn Sie es wie ein normales Array behandeln wollen, müssen Sie es erst umwandeln:Array.from(element.childNodes)
.- In unserem Beispiel enthält
parent
mehr Kinder, als Sie vielleicht erwarten würden. Sehen Sie auf den Quelltext:<div class="container">
<p id="firstParagraph">
Dies ist ein Beispieltext. Es soll demonstrieren, wie Sie mit <code>Javascript</code>
ohne jede Serverinteraktion, ja ohne jede Netzwerkaktivität, Ihrer HTML-Seite
ausgefeiltes Verhalten verleihen können.
</p>
<p id="secondParagraph">
Hier kommt ein weiterer Absatz, damit wir etwas rumspielen können.
</p>
</div>
<div>
-Element zwei Kinder haben, nämlich die beiden<p>
-Elemente. Tatsälich hat es jedoch fünf:document.getElementById("firstParagraph").parentNode.childNodes;
NodeList(5) [text, p#firstParagraph, text, p#secondParagraph, text]
<p>
einfach roher Text stehen, auch zwischen den<p>
und nach dem letzten. Daher fünf Kind-Elemente.