DOM-Scripting - Probleme
1. Auslagerung
Dies ist immer der allererste Schritt. Über <script type="text/javascript" src="...">
bindet man die JavaScript-Datei(en)
in das HTML-Dokument ein. Aber wo? Nun da gibt es ein kleines Problem. Oder genauer gesagt, deren zwei. Und das hat (mal wieder)
mit dem Internet Explorer zu tun.
Oben, unten oder wo?
Die Wurzel allen Übels liegt darin begründet, dass man auf ein HTML-Element erst dann zugreifen kann, wenn es verfügbar ist. Bindet man
also eine JavaScript-Datei im <head>
-Bereich einer Seite ein, so kann man beim DOM-Scripting nicht direkt(!) auf ein
Element zugreifen, da es zu diesem Zeitpunkt schlichtweg noch nicht existiert. Besonders der Internet Explorer ist dafür gefürchtet.
2. Lösungen
Hier gibt es einige, die alle ihre Vor- und Nachteile haben.
onload
Man weist den entsprechenden Elementen einen Event-Handler in obiger Methode des window
-Objektes zu (dazu gleich mehr).
Der Vorteil ist, dass man hier ganz sicher sein kann, dass alle Dateien komplett geladen worden sind. Und das ist leider auch der Nachteil.
Denn das bezieht wirklich alles mit ein, Bilder, externe Daten oder auch Flash-Filme (glaub ich zumindest). Und das kann schon mal ein wenig
dauern, bis das onload
ausgelöst wird. Und es gibt bekanntlicherweise nichts Schlimmeres als wild drauflosklickende User.
onreadystatechange
Ja, ihr habt richtig gehört. Denn das gibt es nicht nur bei einem Ajax-Request. Soweit zur guten Nachricht. Kommen wir nun zur schlechten. Denn leider kann man damit nicht viel anfangen, da der Internet Explorer (zumindest bei meinen Tests) nur beim vollständigen Laden der Seite darauf reagierte. Und das beinhaltet natürlich mal wieder auch alle Bilder und so weiter.
DOMContentLoaded
Das ist zwar Teil der JavaScript-Spezifikation, wird aber leider von diesem Monster aus Redmond erst ab der Version 9 unterstützt. Dieses Event greift, sobald die HTML-Datei(!) geladen
wurde und wäre somit ideal. Wenn nicht ... siehe oben. Stattdessen gibt es für diesen Quasimodo unter den Browsern die Möglichkeit
mittels der Microsoft-spezifischen Methode doScroll
zu ermitteln, wann zumindest der HTML-Code geladen wurde. Da das Thema
recht komplex ist, werde ich darauf in einem schon geplanten Tutorial eingehen (siehe Roadmap).
Ein Tipp
Wenn ihr kein Framework benutzt und wirklich was lernen wollt, arbeitet erst mal mit window.onload
. Oder bindet den Code
an Ende ein (siehe unten).
3. Einbindungsmöglichkeiten
All-in-one
Ihr packt den gesamten JavaScript-Code in eine oder mehrere Dateien. In diesem Fall bindet
ihr die JavaScript-Dateien als letzte Elemente oberhalb des schließenden </body>
-Tags ein, also so.
<html>
<head>
...
</head>
<body>
...
<!-- Hier Dateien einbinden! -->
</body>
</html>
Aufgeteilt
Wenn ihr dagegen euren Code der Übersichtlichkeit halber nach den Funktionalitäten aufteilt, so kann man durchaus die entsprechende JavaScript-Datei direkt unterhalb des entsprechenden HTML-Elements einbinden. Nehmen wir als Beispiel mal an, ihr habt ein Formular, das ihr mit JavaScript manipulieren möchtet. Und der entsprechende Code steht in einer JS-Datei. Dann könnt ihr so vorgehen.
<body>
... Irgendein Code ...
<form ...>
<!-- euer Formular -->
</form>
<!-- Hier Datei einbinden! -->
... Weiterer Code ...
</body>
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt