Was sind die Unterschiede zwischen der JavaScript- window.onload
und der jQuery- $(document).ready()
Methode?
$().ready()
lässt es window.onload
manchmal feuern .
Was sind die Unterschiede zwischen der JavaScript- window.onload
und der jQuery- $(document).ready()
Methode?
$().ready()
lässt es window.onload
manchmal feuern .
Antworten:
Das ready
Ereignis tritt auf, nachdem das HTML-Dokument geladen wurde, während das onload
Ereignis später auftritt, wenn auch der gesamte Inhalt (z. B. Bilder) geladen wurde.
Das onload
Ereignis ist ein Standardereignis im DOM, während das ready
Ereignis für jQuery spezifisch ist. Der Zweck des ready
Ereignisses besteht darin, dass es so früh wie möglich nach dem Laden des Dokuments auftritt, damit der Code, der den Elementen auf der Seite Funktionen hinzufügt, nicht auf das Laden des gesamten Inhalts warten muss.
ready
Ereignis ist spezifisch für jQuery. Das DOMContentLoaded
Ereignis wird verwendet, wenn es im Browser verfügbar ist, andernfalls wird es emuliert. Es gibt keine genaue Entsprechung im DOM, da das DOMContentLoaded
Ereignis nicht in allen Browsern unterstützt wird.
onload
. onload
ist der Name einer Objekteigenschaft, in der eine Funktion gespeichert ist, die beim load
Auslösen des Ereignisses aufgerufen werden soll.
window.onload
ist das integrierte JavaScript-Ereignis, aber da die Implementierung in allen Browsern (Firefox, Internet Explorer 6, Internet Explorer 8 und Opera ) subtile Macken aufwies, bietet jQuery diese , die diese abstrahieren, und wird ausgelöst, sobald das DOM der Seite fertig ist (wartet nicht auf Bilder usw.).document.ready
$(document).ready
(Beachten Sie, dass dies nicht document.ready
der Fall ist. Dies ist eine jQuery-Funktion, die die folgenden Ereignisse umschließt und für Konsistenz sorgt:
document.ondomcontentready
/ document.ondomcontentloaded
- ein neues Ereignis, das ausgelöst wird, wenn das DOM des Dokuments geladen wird (dies kann einige Zeit dauern , bevor die Bilder usw. geladen werden); wieder etwas anders im Internet Explorer und im Rest der Weltwindow.onload
(die auch in alten Browsern implementiert ist), die ausgelöst wird, wenn die gesamte Seite geladen wird (Bilder, Stile usw.)load
Ereignis von window
wird in allen Browsern einigermaßen konsistent implementiert. Das Problem, das jQuery und andere Bibliotheken zu lösen versuchen, ist das von Ihnen erwähnte. Das load
Ereignis wird erst ausgelöst, wenn alle abhängigen Ressourcen wie Bilder und Stylesheets geladen wurden. Dies kann lange dauern, bis das DOM vollständig geladen ist. gerendert und bereit für die Interaktion. Das Ereignis, das in den meisten Browsern ausgelöst wird, wenn das DOM bereit ist DOMContentLoaded
, wird aufgerufen , nicht DOMContentReady
.
onload
bisschen Objektschnüffeln war früher notwendig, auch bei (es gibt Unterschiede zu FF / IE / Opera). Was das DOMContentLoaded
betrifft, sind Sie völlig richtig. Bearbeitung zur Verdeutlichung.
document.onload
war nutzbar). Was die window.onload angeht: window.onload = fn1;window.onload=fn2;
- Nur fn2 wird beim Laden aufgerufen. Einige kostenlose Webhosts fügen ihren eigenen Code in Dokumente ein, und manchmal hat dies den In-Page-Code überlastet.
$(document).ready()
ist ein jQuery-Ereignis. Die $(document).ready()
Methode von JQuery wird aufgerufen, sobald das DOM bereit ist (was bedeutet, dass der Browser den HTML-Code analysiert und den DOM-Baum erstellt hat). Auf diese Weise können Sie Code ausführen, sobald das Dokument zur Bearbeitung bereit ist.
Wenn ein Browser beispielsweise das Ereignis DOMContentLoaded unterstützt (wie es viele Nicht-IE-Browser tun), wird es bei diesem Ereignis ausgelöst. (Beachten Sie, dass das DOMContentLoaded-Ereignis nur in IE9 + zum IE hinzugefügt wurde.)
Hierfür können zwei Syntaxen verwendet werden:
$( document ).ready(function() {
console.log( "ready!" );
});
Oder die Kurzfassung:
$(function() {
console.log( "ready!" );
});
Hauptpunkte für $(document).ready()
:
$
durch, jQuery
wenn Sie "$ ist nicht definiert" erhalten.$(window).load()
stattdessen. window.onload()
ist eine native JavaScript-Funktion. Das window.onload()
Ereignis wird ausgelöst, wenn der gesamte Inhalt Ihrer Seite geladen wurde, einschließlich DOM (Dokumentobjektmodell), Bannerwerbung und Bilder. Ein weiterer Unterschied zwischen beiden besteht darin, dass wir zwar mehr als eine $(document).ready()
Funktion haben können, aber nur eine onload
Funktion.
Ein Windows-Ladeereignis wird ausgelöst, wenn der gesamte Inhalt Ihrer Seite vollständig geladen ist, einschließlich des DOM-Inhalts (Document Object Model) und des asynchronen JavaScript , der Frames und der Bilder . Sie können auch body onload = verwenden. Beide sind gleich; window.onload = function(){}
und <body onload="func();">
sind verschiedene Möglichkeiten, dasselbe Ereignis zu verwenden.
Das jQuery-$document.ready
Funktionsereignis wird etwas früher ausgeführt als window.onload
und wird aufgerufen, sobald das DOM (Document Object Model) auf Ihre Seite geladen wurde. Es wird nicht darauf warten, dass die Bilder und Frames vollständig geladen werden .
Entnommen aus folgendem Artikel:
Wie $document.ready()
unterscheidet sich vonwindow.onload()
$(document).ready(function() {
// Executes when the HTML document is loaded and the DOM is ready
alert("Document is ready");
});
// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {
// Executes when complete page is fully loaded, including
// all frames, objects and images
alert("Window is loaded");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
Ein Wort zur Vorsicht bei der Verwendung $(document).ready()
mit Internet Explorer. Wenn eine HTTP-Anforderung unterbrochen wird, bevor das gesamte Dokument geladen wird (z. B. während eine Seite zum Browser gestreamt wird, wird auf einen anderen Link geklickt), löst der IE das $(document).ready
Ereignis aus.
Wenn Code innerhalb des $(document).ready()
Ereignisses auf DOM-Objekte verweist, besteht die Möglichkeit, dass diese Objekte nicht gefunden werden, und es können Javascript-Fehler auftreten. Schützen Sie entweder Ihre Verweise auf diese Objekte oder verschieben Sie den Code, der diese Objekte auf das Ereignis window.load verweist.
Ich konnte dieses Problem in anderen Browsern (insbesondere Chrome und Firefox) nicht reproduzieren.
Verwenden Sie immer die window.addEventListener
Option, um dem Fenster ein Ereignis hinzuzufügen. Auf diese Weise können Sie den Code in verschiedenen Ereignishandlern ausführen.
Richtiger Code:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
Ungültiger Code:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
Dies liegt daran, dass Onload nur eine Eigenschaft des Objekts ist, die überschrieben wird.
In Analogie zu addEventListener
ist es besser, $(document).ready()
als Onload zu verwenden.
$(document).on('ready', handler)
bindet an das Ready-Ereignis von jQuery. Der Handler wird aufgerufen, wenn das DOM geladen wird . Assets wie Bilder fehlen möglicherweise noch . Es wird niemals aufgerufen, wenn das Dokument zum Zeitpunkt der Bindung fertig ist. jQuery verwendet dafür das DOMContentLoaded -Event und emuliert es, wenn es nicht verfügbar ist.
$(document).on('load', handler)
ist ein Ereignis, das ausgelöst wird, sobald alle Ressourcen vom Server geladen wurden . Bilder werden jetzt geladen. Während onload ein unformatiertes HTML-Ereignis ist, wird ready von jQuery erstellt.
$(document).ready(handler)
eigentlich ist ein versprechen . Der Handler wird sofort aufgerufen, wenn das Dokument zum Zeitpunkt des Aufrufs bereit ist. Andernfalls wird es an das ready
-Event gebunden.
Vor jQuery 1.8 , $(document).load(handler)
existierte als Alias zu $(document).on('load',handler)
.
$.fn.load
dass Sie sich nicht mehr als Ereignisordner verhalten. Tatsächlich ist es seit jquery 1.8 veraltet. Ich habe es entsprechend aktualisiert
Das $(document).ready()
ist ein jQuery Ereignis , das auftritt , wenn das HTML - Dokument vollständig geladen wurde, während das window.onload
Ereignis später eintritt, wenn alles , einschließlich der Bilder auf der Seite geladen.
Außerdem ist window.onload ein reines Javascript-Ereignis im DOM, während das $(document).ready()
Ereignis eine Methode in jQuery ist.
$(document).ready()
ist normalerweise der Wrapper für jQuery, um sicherzustellen, dass alle geladenen Elemente für die Verwendung in jQuery verwendet werden ...
Schauen Sie sich den jQuery-Quellcode an, um zu verstehen, wie er funktioniert:
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
// Catch cases where $(document).ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded
} else if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed, false );
// If IE event model is used
} else {
// Ensure firing before onload, maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", completed );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", completed );
// If IE and not a frame
// continually check to see if the document is ready
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll ) {
(function doScrollCheck() {
if ( !jQuery.isReady ) {
try {
// Use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
top.doScroll("left");
} catch(e) {
return setTimeout( doScrollCheck, 50 );
}
// detach all dom ready events
detach();
// and execute any waiting functions
jQuery.ready();
}
})();
}
}
}
return readyList.promise( obj );
};
jQuery.fn.ready = function( fn ) {
// Add the callback
jQuery.ready.promise().done( fn );
return this;
};
Außerdem habe ich das folgende Bild als Kurzreferenz für beide erstellt:
window.onload: Ein normales JavaScript-Ereignis.
document.ready: Ein bestimmtes jQuery-Ereignis, wenn der gesamte HTML-Code geladen wurde.
Eine Sache, an die Sie sich erinnern sollten (oder sollte ich mich erinnern), ist, dass Sie onload
s nicht so stapeln können, wie Sie es können ready
. Mit anderen Worten, jQuery Magic erlaubt mehrere ready
s auf derselben Seite, aber das können Sie nicht onload
.
Der letzte onload
überschreibt alle vorherigen onload
s.
Eine gute Möglichkeit, damit umzugehen, ist eine Funktion, die anscheinend von einem Simon Willison geschrieben und unter Verwenden mehrerer JavaScript-Onload-Funktionen beschrieben wurde .
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
// Example use:
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
/* More code to run on page load */
});
Document.ready
(ein jQuery-Ereignis) wird ausgelöst, wenn alle Elemente vorhanden sind, und sie können im JavaScript-Code referenziert werden, der Inhalt wird jedoch nicht unbedingt geladen. Document.ready
Wird ausgeführt, wenn das HTML-Dokument geladen wird.
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
Der window.load
wartet jedoch, bis die Seite vollständig geladen ist. Dies schließt innere Rahmen, Bilder usw. ein.
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
Das Ereignis document.ready tritt auf, wenn das HTML-Dokument geladen wurde, und das window.onload
Ereignis tritt immer später auf, wenn alle Inhalte (Bilder usw.) geladen wurden.
Sie können das document.ready
Ereignis verwenden, wenn Sie "früh" in den Renderprozess eingreifen möchten, ohne auf das Laden der Bilder warten zu müssen. Wenn Sie die Bilder (oder andere "Inhalte") benötigen, bevor Ihr Skript "etwas tut", müssen Sie warten, bis window.onload
.
Wenn Sie beispielsweise ein "Diashow" -Muster implementieren und Berechnungen basierend auf Bildgrößen durchführen müssen, möchten Sie möglicherweise warten, bis window.onload
. Andernfalls können zufällige Probleme auftreten, je nachdem, wie schnell die Bilder geladen werden. Ihr Skript wird gleichzeitig mit dem Thread ausgeführt, der Bilder lädt. Wenn Ihr Skript lang genug ist oder der Server schnell genug ist, bemerken Sie möglicherweise kein Problem, wenn Bilder rechtzeitig eintreffen. Am sichersten wäre es jedoch, Bilder laden zu lassen.
document.ready
Dies könnte ein schönes Ereignis für Sie sein, um Benutzern ein Zeichen für window.onload
"Laden ..." anzuzeigen. Anschließend können Sie alle Skripts ausführen, für die Ressourcen geladen werden müssen, und schließlich das Zeichen "Laden ..." entfernen.
Beispiele: -
// document ready events
$(document).ready(function(){
alert("document is ready..");
})
// using JQuery
$(function(){
alert("document is ready..");
})
// window on load event
function myFunction(){
alert("window is loaded..");
}
window.onload = myFunction;
window.onload
ist eine in JavaScript integrierte Funktion. window.onload
auslösen, wenn die HTML-Seite geladen wird. window.onload
kann nur einmal geschrieben werden.
document.ready
ist eine Funktion der jQuery-Bibliothek. document.ready
Wird ausgelöst, wenn HTML und der gesamte in der HTML-Datei enthaltene JavaScript-Code, CSS und Bilder vollständig geladen sind.
document.ready
kann je nach Bedarf mehrfach geschrieben werden.
Wenn Sie sagen $(document).ready(f)
, weisen Sie die Skript-Engine an, Folgendes zu tun:
$
und wählen Sie es aus, da es sich nicht im lokalen Bereich befindet. Es muss eine Hash-Tabellensuche durchführen, bei der möglicherweise Kollisionen auftreten oder nicht.ready
des ausgewählten Objekts, bei dem eine weitere Hash-Tabellensuche im ausgewählten Objekt durchgeführt wird, um die Methode zu finden und aufzurufen.Im besten Fall handelt es sich hierbei um 2 Hash-Tabellen-Lookups. Dabei wird jedoch die schwere Arbeit von jQuery ignoriert, bei $
der alle möglichen Eingaben in jQuery in der Küchenspüle vorgenommen werden. Daher wird wahrscheinlich eine andere Karte die Abfrage an den richtigen Handler senden.
Alternativ können Sie dies tun:
window.onload = function() {...}
welches wird
onload
es sich um eine Eigenschaft handelt oder nicht, indem Sie eine Hash-Tabellensuche durchführen, da diese wie eine Funktion aufgerufen wird.Im besten Fall kostet dies eine einzelne Hash-Tabellensuche, die notwendig ist, weil onload
sie abgerufen werden muss.
Im Idealfall kompiliert jQuery seine Abfragen zu Zeichenfolgen, die eingefügt werden können, um das zu tun, was Sie von jQuery wollten, jedoch ohne die Laufzeitausgabe von jQuery. Auf diese Weise haben Sie die Wahl zwischen beiden
eval
.window.onload wird von der DOM-API bereitgestellt und lautet "Das Ladeereignis wird ausgelöst, wenn eine bestimmte Ressource geladen wurde".
"Das Ladeereignis wird am Ende des Dokumentladevorgangs ausgelöst. Zu diesem Zeitpunkt befinden sich alle Objekte im Dokument im DOM, und alle Bilder, Skripte, Links und Unterrahmen wurden vollständig geladen." DOM-Onload
In jQuery wird $ (document) .ready () jedoch erst ausgeführt, wenn die Seite Document Object Model (DOM) für die Ausführung von JavaScript-Code bereit ist. Dies schließt keine Bilder, Skripte, Iframes usw. ein
Die jquery ready-Methode wird also früher als das dom onload-Ereignis ausgeführt.