Update April 2023
Hier geht es um vorbereitenden Code für JavaScript-Anwendungen. Es wird empfohlen, eigenen JavaScript-Code
nicht im HTML-Code zu verteilen, sondern konzentriert in JavaScript-Bibliotheken, die in den Header der Webseite
eingebunden werden. Zugriffe auf Elemente des HTML-Codes erfolgen per Events.
Kapseln des JavaScript-Codes
(function(myparm)
{
// ... Hier kommt der eigene JavaScript-Code rein ...
alert(myparm);
} )('soso');
Der etwas kryptische Code ()();
ist der Call-Operator für Funktionen.
In der ersten Klammer wird eine namenlose Funktion notiert, die der Call-Operator zur Laufzeit sofort ausführt.
Man könnte auch sagen: Der Call-Operator macht aus einer Funktions-Definition eine Anweisung.
In diesem Beispiel hat die namenlose Funktion noch einen Parameter (myparm
).
Dieser Parameter steht dann innerhalb der Funktion als interne Variable zur Verfügung und kann beliebig verwendet werden.
Im Beispiel wird er per alert()
einfach ausgegeben.
Aber woher erhält der Parameter seinen Wert? - Aus der zweiten Klammer!
Im Beispiel ist es nur die Zeichenkette 'soso'
.
Parameter und Argument werden in den meisten Anwendungen nicht benötigt.
Zusammen mit der alert-Anweisung dienen sie hier nur zur Demonstration, anhand derer man die genannte
Funktionalität überprüfen kann.
Das ganze Konstrukt ist insofern sinnvoll, als das man innerhalb der namenlosen Funktion das eigentliche
Programm notieren kann, das man benötigt, also alle Objekte, Definitionen und Anweisungen.
Das ganze Programm läuft dann wie erwartet ab. Der Unterschied: die eigene Applikation befindet sich nicht
im lokalen Raum, kann also nicht in Konflikte mit weiteren JavaScript-Frameworks kommen, die man auf derselben HTML-Seite
einbinden möchte.
JavaScript-Anwendung erst starten, wenn HTML-Code vollständig geladen ist.
Notiert man JavaScript man Ende einer HTML-Seite, dann ist man sicher, dass der ganze HTML-Code, auf den JavaScript
zugreifen soll, auch im Browser geladen ist.
Aus Gründen der leichteren Wartbarkeit einer HTML-Seite ist es günstig, möglichst nur eine einzige Stelle zum Einbinden
von JavaScript-Code zu haben; und das ist üblicherweise die Einbindung einer JavaScript-Datei im Header und sonst
nirgends.
Das erfordert für unsere Applikation einen zusätzlichen Code, der bewirkt, dass das Programm auf das Ende des Ladens der
HTML-Seite wartet, bevor Zugriffe auf HTML-Elemente stattfinden.
document.onreadystatechange = function () {
if (document.readyState == "complete") {
// ... unsere eigentliche JavaScript-Anwendung hier notieren ...
}
}
document.onreadystatechange
startet die Funktion, die ihr zugewiesen wurde, jedoch erst, wenn die Seite geladen ist.
Dabei gibt es mehrere Phasen. Die if
-Anweisung fragt document.readyState
ob "complete"
erreicht ist. Dann wissen wir, dass das HTML-Dokument vollständig geladen wurde und erst dann wird der Code innerhalb von if
ausgeführt.
Zusammenspiel
Die document.onreadystatechange
-Konstruktion kann nur einmal vorkommen
und muss daher die äußerste Hülle unseres Codes sein. Darin können aber mehrere Call-Operatoren untergebracht werden, jeder mit seiner gekapselten Teilapplikation.
document.onreadystatechange = function () {
if (document.readyState == "complete") {
(function() {
// ... Teilapplikation 1 ...
} )();
(function() {
// ... Teilapplikation 2 ...
} )();
// ...
}
}
Damit haben wir eine Möglichkeit, verschiedenen JavaScript-Code komplett im Header einzubinden.
Eine gern verwendete Alternative
Anstatt der document.onreadystatechange
-Konstruktion
wird gern diese verwendet:
document.addEventListener('DOMContentLoaded', function () {
... eigene Applikationen ...
}
Der Scriptcode wird ausgelöst, wenn der DOM-Baum komplett steht, aber
Stylesheets, Bildinhalte u.a Ressourcen eventuell noch geladen werden.
Das entspricht der document.onreadystatechange
-Konstruktion,
wenn diese statt 'complete'
den Wert 'interactive'
verwenden würde.