2010-10-14 71 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);