2010-10-14 47 views
30

假設的執行,我有一個js文件看起來像這樣:訂購jQuery的文件準備

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

在加載的任務會按順序執行的文件。我無法理解爲什麼? 我猜測回調方法會在發生「就緒」事件時觸發。執行訂單如何保留?連續的回叫在某個地方排隊嗎?

注:我知道這是一種非常幼稚的編碼方式。我寫了這段代碼只是爲了說明問題,不要在我的項目中編寫這樣的代碼。

+0

我不會提交答案,因爲我不確定,但沒有.ready添加事件偵聽器,並且事件偵聽器按順序被觸發或被添加? – EMMERICH 2010-10-14 15:02:10

+1

你會期望發生什麼? – SLaks 2010-10-14 15:06:17

回答

31

你的處理程序是用於執行in order later,當documentis readypushed into an arrayreadyList)。

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 2010-10-14 15:03:59

+1

@jAndy - 儘管你可以延遲執行所有'ready'處理程序,但是你不能,基本上說「嘿等待我創建更多的元素!」。 – 2010-10-14 15:05:21

+0

@尼克:啊有趣。即使我無法想象一個專用的用例。 – jAndy 2010-10-14 15:07:27

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($){});'工作:)的方式執行。 – 2010-10-14 15:06:10

+0

這是一個僞示例,'handlers'基本上是'readyList'。 – 2010-10-14 15:07:35

+0

我指的是他們如何被稱爲:) – 2010-10-14 15:08:56

1

這不是更好,但在$(窗口).load內,你可以有更多的控制。 $(document).ready後

$(window).load(fn);