假设我有:问题有关多准备()
<script src="script1.js"></script>
<script src="script2.js"></script>
这些脚本双方都有ready()
内。 script2.js的ready()
中的代码是否会在第一个代码后执行?
假设我有:问题有关多准备()
<script src="script1.js"></script>
<script src="script2.js"></script>
这些脚本双方都有ready()
内。 script2.js的ready()
中的代码是否会在第一个代码后执行?
是。
首先,script2.js
中的代码将在script1.js
之后执行,因为它稍后在文档中(并且未设置defer
attribute)。
此外,ready
功能的the implementation [source]是:
ready: function(fn) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.done(fn);
return this;
},
其中readyList
seems to be [source]一个deferred object [docs]。这意味着回调会按照它们添加到该对象的顺序执行。
准备好多个文档将被解雇。
.ready()
函数被调用的第一个注册获得第一处理基础
我想看到一些源归属...据我所知,它是用for..in循环完成的,这意味着它使用集合上的迭代器,这是您无法使用的顺序。 – jcolebrand
jQuery为此使用自己的Deferred
对象。 jQuery的适当代码证明它是为了执行:
当你调用.ready
,该功能被添加到readyList
:
readyList.done(fn);
当DOM准备就绪后,执行该功能:
readyList.resolveWith(document, [ jQuery ]);
的resolveWith
功能包含此码,其执行添加作为回调函数:
while(callbacks[ 0 ]) {
callbacks.shift().apply(context, args);
}
正如您所看到的,回调函数是shift
ed(从回调数组的开头弹出(即readyList
)),所以第一个在第二个之前执行。
很好的解释。 :) –
感谢您的信息,upvoting – babonk
菲利克斯干得好。我只是看着未压缩代码的那部分,试图找出如何解释它... –
感谢您的伟大答案 – babonk