# Mootools: Events vs. domready



## Ramix (25. Mai 2008)

Hallo zusammen.

Ich habe eine kleine Frage zu mootools. Ich hab erst gerade mit dem Mootoolsframework angefange zu arbeiten und da stösst man jedoch recht schnell auf:


```
window.onDomReady (function(){});
```

Kann mir villeicht jemand die  Vor und Nachteile zwischen "normalen Events" wie onClick und  der DomReady funktion erklären?
Bei mir blockiert sich mit DomReady der code selbst.....darum frage ich mal!?

Gruss Binz


----------



## Sven Mintel (26. Mai 2008)

onDomReady ist zu vergleichen mit onload, nur mit dem Unterschied, dass onload feuert, wenn das komplette Dokument inklusive aller "externen" Objekte wie Bilder, Stylesheets, Skripte, <object>'s etc. geladen wurde.

onDomReady feuert, wenn die DOM-Struktur des Dokumentes gelesen wurde, also das, was man im Quelltext sieht...ohne die externen Quellen.


----------



## FipsTheThief (27. Mai 2008)

Ich will auch gleich mal eine Frage bezüglich domready stellen , einen neuen Thread wollte ich nun nicht extra aufmachen da es ja das selbe Thema ist in gewisser Weise man verzeihe mir.

Also ich hab mir damals ein JS Import Script gebastelt welches auf die selbe Funktionsweise ging , wenn der Inhalt geladen ist führe es aus.

Nun aber der feine Unterschied , alle Browser ausser dem IE haben den Event DOMContentLoaded gut beim Safari bin ich mir nun nicht sicher.

Also hab ich mich nun mal umgeschaut und Dean Edwards selber nutzt conditional compilation , das bekommt nur der IE auf die Reihe und dort steht ein document.write('<script ...></script>'); Das Script selber bekommt den Event Handler onreadystatechange und das klappt im IE prima , der DOM ist dann tatsächlich geladen.

Soweit ich weiß schreibt document.write() etwas in das Document sagt ja schon der Name , aber sollte dann a) nicht der Inhalt vom alten Dokument überschrieben worden sein (passiert hierbei nur  wenn der Inhalt bereits komplett geladen wurde) und b) woher weiß der IE das nun der DOM geladen wurde ? 

Man könnte sich das ja so erklären das document.write() im dem Falle wo das Dokument noch nicht geladen wurde einfach den hinzugefügen Inhalt , im dem Falle das Scripttag,  unten ran hängt , und wenn dieses Script dann da ist muss auch der DOM da sein.

document.getElementsByTagName("body")[0].innerHTML gibt darüber leider keine Auskunft :/

Hier mal der Code den ich nun genommen habe  , ob man die conditional compilation da unbedingt benötigt mhm fragwürdig , kann man sicher auch über navigator.userAgent abfangen.


```
<html>
    <head>
        <script type="text/javascript">
            /*@cc_on
                /*@if (@_win32) {
                    var dummy = "javascript:void(0)";
                    document.write("<script id=__ie_onload defer src='" + dummy + "'><\/script>");
                    document.getElementById("__ie_onload").onreadystatechange = function() {
                        if(this.readyState == "complete") {
                            alert(document.getElementById('check'));
                        }
                    };
                }
            @*/
           /*@end @*/
        </script>
    <head>
    <body>
        <img src="http://www.codemasters.de/images/microsites/rfo/RFO_Art_planet.jpg"></img>
        <div id="check">
            körperklaus
        </div>
    </body>
</html>
```


----------



## Sven Mintel (27. Mai 2008)

FipsTheThief hat gesagt.:


> Soweit ich weiß schreibt document.write() etwas in das Document sagt ja schon der Name , aber sollte dann a) nicht der Inhalt vom alten Dokument überschrieben worden sein (passiert hierbei nur  wenn der Inhalt bereits komplett geladen wurde) und b) woher weiß der IE das nun der DOM geladen wurde ?



Moin,

die normale Reihefolge sieht ja so aus... der Browser liest die Dokumentstruktur als erstes.... von oben nach unten.
Javascript-Code muss er dabei auch sofort einlesen, da dieser Anweisungen enthalten kann, welche die Dokumentstruktur beeinflussen(bspw. ein Element, welches per write() hineingeschrieben wird).
Das Attribut defer ändert dieses Verhalten, durch dieses sagst du dem Browser, dass dort nichts drinnen ist, was die Dokumentstruktur beinhaltet(selbst wenn dort etwas drinnen ist)...er kann also das Dokument einlesen, und überspringt dabei erstmal das Skript.

Um das Skript kümmert er sich dann, wenn die Dokumentstruktur eingelesen ist...was Quasi den Effekt hat, dass es am Ende des Dokumentes eingefügt wird...und da ist die Dokumentstruktur komplett gelesen.

Man könnte natürlich auch einfach gleich browserübergreifend ein Skript  am Ende des Dokumente einfügen, welches dann bescheidsagt, dass die Dokumentstruktur gelesen ist, aber das ginge dann eben nicht  mehr dynamisch, weil man dazu wissen müsste, wo das Ende des Dokumentes ist, und das weiss man erst, wenn die Dokumentstruktur geladen ist :suspekt:


----------



## FipsTheThief (27. Mai 2008)

Achso bei MSN (oder wie deren Api sich da schimpft) stand unter defer das es angibt das nun nix kommen kann was in irgend einer Form den DOM verändert das es somit erst am Ende rangenommen wird erklärt natürlich alles.

Danke für die erneute flotte Hilfe.

MfG


----------

