Unterschied zwischen DOMContentLoaded- und Ladeereignissen

Antworten:

191

Aus dem Mozilla Developer Center :

Das DOMContentLoaded-Ereignis wird ausgelöst, wenn das Dokument vollständig geladen und analysiert wurde, ohne darauf zu warten, dass Stylesheets, Bilder und Unterrahmen vollständig geladen sind (das Ladeereignis kann zum Erkennen einer vollständig geladenen Seite verwendet werden).

Simon Lieschke
quelle
27
Zu Ihrer Information, derselbe MDN-Link [jetzt] sagt auch: "Hinweis: Stylesheet lädt die Block-Skript-Ausführung. Wenn Sie also nach einem <link rel =" Stylesheet "...> ein <script> haben, wird die Analyse der Seite nicht beendet - und DOMContentLoaded wird nicht ausgelöst - bis das Stylesheet geladen ist. "
Nick
10
@ Nick Diese Seite gibt den Grund an. html5rocks.com/de/tutorials/internals/howbrowserswork Ich würde jedoch empfehlen, das Video auf der Seite anzusehen .
Abhisekp
1
@abhisekp schönes Tutorial, obwohl dieser
Videolink
Der Renderbaum wird also erstellt, nachdem DOMContentLoaded ausgelöst wurde. DOMContentLoaded wartet jedoch nicht darauf, dass Bilder / Unterressourcen / Unterrahmen laut developer.mozilla.org/en-US/docs/Web/API/Window/… vollständig geladen werden . Wissen Sie, ob diese Bilder / Subframes / Subressourcen vom Renderbaum nach dem Erstellen aufgerufen werden oder ob sie bereits vom DOM-Baum aufgerufen wurden, während der Renderbaum noch erstellt wurde? Mit anderen Worten, löst der Renderbaum eine Reihe von Verbindungen aus, um diese Bilder / Subframes / Subressourcen herunterzuladen, oder wurden ihre Downloads bereits zuvor ausgeführt?
weefwefwqg3
83

Das DOMContentLoadedEreignis wird ausgelöst, sobald die DOM-Hierarchie vollständig erstellt wurde. Das loadEreignis führt dies aus, wenn alle Bilder und Unterrahmen vollständig geladen wurden.

DOMContentLoadedfunktioniert auf den meisten modernen Browsern, jedoch nicht auf IE einschließlich IE9 und höher. Es gibt einige Problemumgehungen , um dieses Ereignis in älteren IE-Versionen nachzuahmen, wie die in der jQuery-Bibliothek verwendeten, die das IE-spezifische onreadystatechange Ereignis anhängen .

CMS
quelle
7
Auf welches Ereignis beziehen Sie sich, wenn Sie "Dieses Ereignis" sagen?
Tom Hubbard
2
"Dieses Ereignis" = DOMContentLoaded. In IE8 funktioniert es nicht. Wenn Sie es unterstützen müssen, verwenden Sie die Problemumgehung, auf die CMS verweist
Jan Derk
53

Sehen Sie den Unterschied selbst:

DEMO

Von Microsoft IE

Das Ereignis DOMContentLoaded wird ausgelöst, wenn das Parsen der aktuellen Seite abgeschlossen ist. Das Ladeereignis wird ausgelöst, wenn alle Dateien aus allen Ressourcen, einschließlich Anzeigen und Bildern, vollständig geladen wurden. DOMContentLoaded ist ein großartiges Ereignis, um die UI-Funktionalität mit komplexen Webseiten zu verbinden.

Aus dem Mozilla Developer Network

Das DOMContentLoaded-Ereignis wird ausgelöst, wenn das Dokument vollständig geladen und analysiert wurde, ohne darauf zu warten, dass Stylesheets, Bilder und Unterrahmen vollständig geladen sind (das Ladeereignis kann zum Erkennen einer vollständig geladenen Seite verwendet werden).

Mehrad Sadegh
quelle
Ist DOMContentLoadedgewährleistet , dass alle Skripte (einschließlich defer / async) geladen worden sind ? Über Skripte wird hier nichts gesagt: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey
@ Sergey Nein. Asynchrone Ressourcen - dh <script async src = app.js /> - werden unabhängig vom Rest der Seite geladen, daher wird DOMContentLoaded möglicherweise ausgelöst, bevor die Ressource vom Server abgerufen wird
Mehrad Sadegh,
1
@ MehradSadegh Ich denke du liegst falsch! Aus der MDN-Dokumentation : Skripte mit dem Attribut defer verhindern, dass das Ereignis DOMContentLoaded ausgelöst wird, bis das Skript geladen und die Auswertung abgeschlossen ist. Sie können einen Blick auf diese SO-Frage werfen, die es bestätigt: stackoverflow.com/questions/42950574/…
radzak
1
@Jatimir Ich denke, dass verzögerte und asynchrone Attribute ein unterschiedliches Verhalten haben.
Mehrad Sadegh
1
@Jatimir Ich bin froh, dass du trotzdem gepostet hast, denn dein Beitrag war genau das, wonach ich gesucht habe! Danke dir!
Robert Wildling
29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Eine Seite kann erst sicher bearbeitet werden, wenn das Dokument "fertig" ist. jQuery erkennt diesen Bereitschaftszustand für Sie. In $ (document) .ready () enthaltener Code wird erst ausgeführt, wenn die Seite Document Object Model (DOM) für die Ausführung von JavaScript-Code bereit ist. Der in $ (window) .load (function () {...}) enthaltene Code wird ausgeführt, sobald die gesamte Seite (Bilder oder Iframes) und nicht nur das DOM fertig ist.

Siehe: http://learn.jquery.com/using-jquery-core/document-ready/

Anderson
quelle
1
Die Frage bezieht sich nicht auf jQuery.
user34660
4
@ user34660 Nicht, aber hilfreich zu verstehen.
Anderson
16
  • domContentLoaded : Markiert den Punkt, an dem sowohl das DOM bereit ist als auch keine Stylesheets vorhanden sind, die die JavaScript-Ausführung blockieren. Dies bedeutet, dass wir jetzt (möglicherweise) den Renderbaum erstellen können. Viele JavaScript-Frameworks warten auf dieses Ereignis, bevor sie ihre eigene Logik ausführen. Aus diesem Grund erfasst der Browser die Zeitstempel EventStart und EventEnd, damit wir verfolgen können, wie lange diese Ausführung gedauert hat.

  • loadEvent : Als letzten Schritt beim Laden jeder Seite löst der Browser ein "Onload" -Ereignis aus, das zusätzliche Anwendungslogik auslösen kann.

Quelle

Skube
quelle
Wenn ich Skript-Tags mit URL zu JS habe, würden sie vor oder nach domContentLoaded geladen?
Pavan
0

Hier ist ein Code, der für uns funktioniert. Wir haben festgestellt, dass MSIE ein Hit und Miss DomContentLoadedist. Es scheint eine gewisse Verzögerung zu geben, wenn keine zusätzlichen Ressourcen zwischengespeichert werden (bis zu 300 ms basierend auf unserer Konsolenprotokollierung), und es wird zu schnell ausgelöst, wenn sie zwischengespeichert werden. Also haben wir auf einen Fallback für MISE zurückgegriffen. Sie möchten die doStuff()Funktion auch auslösen , unabhängig davon, ob sie DomContentLoadedvor oder nach Ihren externen JS-Dateien ausgelöst wird .

// detect MSIE 9,10,11, but not Edge
ua=navigator.userAgent.toLowerCase();isIE=/msie/.test(ua);

function doStuff(){
    //
}
if(isIE){
    // play it safe, very few users, exec ur JS when all resources are loaded
    window.onload=function(){doStuff();}
} else {
    // add event listener to trigger your function when DOMContentLoaded
    if(document.readyState==='loading'){
        document.addEventListener('DOMContentLoaded',doStuff);
    } else {
        // DOMContentLoaded already loaded, so better trigger your function
        doStuff();
    }
}
YK
quelle