2010-03-07 19 views

Antwort

13

Ja, es warten muss. Insbesondere können Sie sich nicht darauf verlassen, dass jQuery(document).ready() ausgelöst wird, bevor andere Skripts ausgeführt werden können. ready bindet an DOMContentReady, readystatechanged oder onload, je nachdem, was verfügbar ist.

Die Dokumentation besagt, dass "in den meisten Fällen das Skript ausgeführt werden kann, sobald die DOM-Hierarchie vollständig erstellt wurde". Beachten Sie, dass die einzige Garantie ist, dass das DOM bereit ist, wenn dieses Ereignis ausgelöst wird. Es garantiert Ihnen nichts anderes - weil es einfach nicht kann.

Dies ist zum Beispiel nicht in IE, Firefox oder Chrom arbeitet, ist brilliant.jsimmer vor dem ready() Handler aufgerufen hat eine Chance, egal auszuführen, wie Sie das Script-Tags mischen:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Test</title> 
    <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.js" charset="utf-8" type="text/javascript" ></script> 
</head> 
<body> 
    <script type="text/javascript" > 
    // <![CDATA[ 
     alert("attaching event"); 
     $(document).ready(function() { alert("fired"); }); 
    // ]]> 
    </script> 
    <script type="text/javascript" src="brilliant.js" ></script> 
</body> 
</html> 

FYI, hier ist der entsprechende Code von jquery-1.4.2:

bindReady: function() { 
    if (readyBound) { 
     return; 
    } 

    readyBound = true; 

    // Catch cases where $(document).ready() is called after the 
    // browser event has already occurred. 
    if (document.readyState === "complete") { 
     return jQuery.ready(); 
    } 

    // Mozilla, Opera and webkit nightlies currently support this event 
    if (document.addEventListener) { 
     // Use the handy event callback 
     document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); 

     // A fallback to window.onload, that will always work 
     window.addEventListener("load", jQuery.ready, false); 

    // If IE event model is used 
    } else if (document.attachEvent) { 
     // ensure firing before onload, 
     // maybe late but safe also for iframes 
     document.attachEvent("onreadystatechange", DOMContentLoaded); 

     // A fallback to window.onload, that will always work 
     window.attachEvent("onload", jQuery.ready); 

     // If IE and not a frame 
     // continually check to see if the document is ready 
     var toplevel = false; 

     try { 
      toplevel = window.frameElement == null; 
     } catch(e) {} 

     if (document.documentElement.doScroll && toplevel) { 
      doScrollCheck(); 
     } 
    } 
}, 
+1

Bitte kommentieren Sie, wenn Sie sich für einen Downvote entscheiden. Vielen Dank. –

2

Ich denke, $ (Dokument) .ready() wird ausgeführt, wenn das HTML-Dokument geladen und gerendert wurde. Lesen Sie die Dokumentation für weitere Informationen

http://docs.jquery.com/Tutorials:Introducing_$(document).ready()

+0

'bereit()' läuft, wenn John Resig es laufen sollte entscheidet. Es kann zu verschiedenen Zeiten auf verschiedenen Browsern oder sogar auf verschiedenen Versionen desselben Browsers ausgeführt werden. Sie können sich nicht darauf verlassen, dass der Ereignishandler ausgelöst wird, bevor andere Skripts ausgeführt werden können. Das einzige, was Sie sicher sagen können, ist, dass Sie zum DOM gelangen können, wenn es ausgelöst wird. –

2

die Datei besonders sein kann js 3rd-Party zu blockieren, wenn es im Head-Tag ist. Versuchen Sie es kurz vor dem schließenden Tag <body>.

Ich denke, die erste Antwort ist falsch - document.ready bedeutet nicht, dass der gesamte Inhalt geladen werden muss, es bedeutet, dass das dom abgeschlossen ist. Sonst würden jquery-Methoden, die in diesem Modus ausgeführt werden, erst ausgeführt, wenn alle Bilder (zum Beispiel) geladen wurden, was nicht der Fall ist.

bearbeiten

Es sieht aus wie das Verhalten für Skripte unterschiedlich ist, kann aber Browser spezifisch sein. Es gibt eine gute Erklärung hier:

JavaScript: DOM load events, execution sequence, and $(document).ready()

+1

Laut Mozilla-Dokumentation für den "DOMContentLoaded" -Ereignis besteht der Hauptunterschied zwischen "ready" und "load" darin, dass die Seite nicht darauf wartet, dass Bilder geladen werden, bevor "ready" aufgerufen wird (dh der "DOMContentLoaded" -Handler) Firefox oder Webkit). Sagt nichts über das Ausführen von Skriptdateien.Da wir über ein single-threaded-Modell sprechen, sehe ich nicht, wie die "ready" -Handler aufgerufen werden könnten, während der Browser noch einen "