2010-10-14 15 views
30

Angenommen, ich habe eine js-Datei, die wie folgt aussieht:Reihenfolge der Ausführung von jquery Dokument bereit

$(document).ready(function() { // first task}); 
$(document).ready(function() { // second task }); 
$(document).ready(function() { // third task }); 

Nach dem Laden der Datei die Aufgaben ausgeführt, um zu bekommen. Ich verstehe nicht warum? Ich vermute, dass die Callback-Methoden ausgelöst werden, wenn ein "bereit" -Ereignis auftritt. Wie wird die Ausführungsreihenfolge beibehalten? Sind die aufeinanderfolgenden Rückrufe an irgendeiner Stelle in der Warteschlange?

Hinweis: Ich weiß, dass dies eine sehr naive Art der Codierung ist. Ich habe das Snippet nur geschrieben, um meinen Standpunkt verständlich zu machen und schreibe keinen Code in meine Projekte.

+0

.ready werde ich keine Antwort einreichen, weil ich nicht sicher bin, aber .ready nicht ein Ereignis-Listener hinzufügen, und die Ereignis-Listener werden in der Reihenfolge oder deren hinzugefügt ausgelöst ? – EMMERICH

+1

Was würden Sie erwarten? – SLaks

Antwort

31

Ihre Handler werden pushed into an array (readyList) für in order later ausgeführt wird, wenn die documentis ready.

They're queued like this:

readyList.push(fn); 

And executed when ready like this:

var fn, i = 0; 
while ((fn = readyList[ i++ ])) { 
    fn.call(document, jQuery); 
} 

Wenn das Dokument bereits bereit ist, führen sie werden dann sofort, was noch in Ordnung.

+0

@Nick: in 1.4.3 können Sie die Reihenfolge der Ausführung steuern, nein? – jAndy

+1

@jAndy - Du kannst nicht, obwohl du die Ausführung aller 'bereiten' Handler * verzögern * kannst, im Grunde sagend "hey warte, dass ich mehr Elemente erschaffe!". –

+0

@Nick: Ah interessant. Auch wenn ich mir einen Anwendungsfall ad hoc nicht vorstellen kann. – jAndy

5

Die von Ihnen angegebenen Funktionen werden in der Reihenfolge zu einer Liste hinzugefügt. Wenn das DOM bereit ist, durchläuft jQuery diese Liste und ruft die Funktionen in dieser Reihenfolge auf.

Ihre Liste wird so etwas wie ..

handlers = [ function(){ alert('first') }, function() { alert('second')} ]; 

dann in einer Schleife durchläuft ...

for (var i = 0, l = handlers.length; i<l; ++i) { 
    handlers.apply(document, arguments) 
} 

und die Funktionen werden im Rahmen des Dokuments genannt.

+0

Sie werden nicht so behandelt, sie werden so ausgeführt, dass 'jQuery (funcition ($) {});' funktioniert :) –

+0

Es war ein Pseudo-Beispiel, die 'Handler' sind im Grunde' readyList'. –

+0

Ich bezog sich darauf, wie sie heißen :) –

1

Dies ist nicht der bessere, aber innerhalb $ (window) .load können Sie mehr Kontrolle haben. nach $ (document)

$(window).load(fn); 
Verwandte Themen