2010-10-14 2 views
30

Предположим, у меня есть JS файл, который выглядит следующим образом:Порядок исполнения Jquery документа готового

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

При загрузке файла задачи получить выполняется в порядке. Я не могу понять, почему? Я предполагаю, что методы обратного вызова запускаются, когда происходит событие «on ready». Как сохраняется порядок выполнения? Являются ли последовательные обратные вызовы в очереди в очереди?

Примечание: Я знаю, что это очень наивный способ кодирования. Я написал этот фрагмент только для того, чтобы понять, и не писать такой код в своих проектах.

+0

не представит ответ, потому что я не уверен, но не .ready добавить слушателя событий, и слушатели событий вызываются в порядке или их добавляемого ? – EMMERICH

+1

Что бы вы ожидали от вас? – SLaks

ответ

31

Ваши обработчики быть pushed into an array (readyList) для выполнения in order later, когда 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); 
} 

Если документ уже готов, то они будут выполняться немедленно, что по-прежнему в порядке.

+0

@Nick: в 1.4.3 вы можете контролировать порядок исполнения, нет? – jAndy

+1

@jAndy - Вы не можете, хотя вы можете * задержать * выполнение всех обработчиков 'ready', в основном говоря« эй, подождите, я создаю больше элементов! ». –

+0

@Nick: Ах интересно. Даже если я не могу себе представить, что он нужен. – jAndy

5

Функции, которые вы указали, упорядочены в списке. Когда DOM готов, jQuery выполняет итерацию через этот список и вызывает функции в этом порядке.

Ваш список становится чем-то вроде ..

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

Затем петлю, перебирает ...

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

И функции вызываются в контексте документа.

+0

Они не обрабатываются совсем так, они исполняются таким образом, что 'jQuery (funcition ($) {});' works :) –

+0

Это был псевдо-пример, 'handlers' в основном' readyList'. –

+0

Я имел в виду, как их называют :) –

1

Это не самое лучшее, но внутри $ (window) .load у вас может быть больше контроля. после того, как $ (документ) .ready

$(window).load(fn); 
Смежные вопросы