2010-10-14 11 views
30

Przypuśćmy, że mam pliku js, który wygląda tak:Kolejność realizacji dokumentu jquery gotowy

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

po załadowaniu pliku zadania zostanie wykonany w porządku. Nie jestem w stanie zrozumieć, dlaczego? Zgaduję, że metody wywołania zwrotnego są uruchamiane, gdy wystąpi zdarzenie "on ready". W jaki sposób zachowuje się zlecenie wykonania? Czy kolejne połączenia zwrotne są w kolejce w pewnym miejscu?

Uwaga: wiem, że jest to bardzo naiwny sposób kodowania. Napisałem fragment kodu tylko po to, aby uzyskać mój punkt widzenia i nie piszę takiego kodu w moich projektach.

+0

nie złoży odpowiedź, bo nie jestem pewien, ale nie .ready dodać detektor zdarzeń, a detektory zdarzeń są wywoływane w kolejności lub ich dodawanych ? – EMMERICH

+1

Czego można się spodziewać? – SLaks

Odpowiedz

31

Twoje teleskopowe są poddawane pushed into an array (readyList) do wykonywania in order later, kiedy 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); 
} 

Jeśli dokument jest już gotowy, wtedy będziemy wykonywać natychmiast, która nadal jest w porządku.

+0

@Nick: w 1.4.3 można kontrolować kolejność wykonywania, nie? – jAndy

+1

@jAndy - Nie możesz, chociaż możesz * opóźnić * wykonanie wszystkich 'ready' handlerów, mówiąc po prostu" hej, czekam, tworzę więcej elementów! ". –

+0

@Nick: Ah ciekawe. Nawet jeśli nie mogę sobie wyobrazić użycia ad hoc. – jAndy

5

Funkcje, które określasz, są dodawane do listy. Gdy DOM jest gotowy, jQuery iteruje przez tę listę i wywołuje funkcje w tej kolejności.

Twoja lista staje się czymś w rodzaju ..

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

Następnie pętli iteracji ...

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

a funkcje są nazywane w kontekście dokumentu.

+0

Nie są obsługiwane w ten sposób, są wykonywane w taki sposób, że 'jQuery (funcition ($) {});' działa :) –

+0

to był pseudo przykład, 'handlery' w zasadzie to' readyList'. –

+0

Chodziło mi o to, jak się nazywają :) –

1

To nie jest lepsze, ale wewnątrz $ (okna) .load możesz mieć większą kontrolę. po $ (document) .ready

$(window).load(fn); 
Powiązane problemy