我希望在DOM准备就绪时禁用我的插件对DOM执行的某些特定“功能”。
如果我将代码置于onload
回调中,它是否会在ready
回调后执行?
我希望在100%中确保即使没有任何图像,只要很少,就会在onload之前执行就绪。
答案 0 :(得分:3)
虽然我认为@jAndy's answer是正确的,但您可以通过将onload
内的代码置于ready()
电话中来为自己提供额外的保证。
确保首先发出主ready()
来电。
$(document).ready(function() {
// Your normal ready handler
});
$(window).load(function() {
// Placing code in another .ready() call in here will add it to the
// end of internal Array of ready handlers if any are pending
$(document).ready(function() {
// my onload code
});
});
因此,如果在ready()
触发时onload
已经触发,那么您的onload
代码仍会运行。 (一旦DOM准备好就会设置内部标志,因此将立即调用将来的.ready()
个调用。)
如果在.ready()
发生时onload
以某种方式不被触发,则表示原始ready()
代码在内部数组中是第一个,并且新的.ready()
代码将添加到数组的末尾。
修改强>
查看at the source以获取在DOM准备就绪时触发的主jQuery.ready
处理程序(反过来,触发用户的.ready()
处理程序列表),似乎有一个IE错误,其中处理程序稍早启动。
为了解决这个问题,jQuery使得处理程序异步被调用,直到它真正看到document.body
。
ready: function (wait) {
// Either a released hold or an DOMready/load event and not yet ready
if ((wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady)) {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if (!document.body) {
return setTimeout(jQuery.ready, 1);
}
// Remember that the DOM is ready
jQuery.isReady = true;
// If a normal DOM Ready event fired, decrement, and wait if need be
if (wait !== true && --jQuery.readyWait > 0) {
return;
}
// If there are functions bound, to execute
readyList.fireWith(document, [jQuery]);
// Trigger any bound ready events
if (jQuery.fn.trigger) {
jQuery(document).trigger("ready").off("ready");
}
}
},
似乎由于处理程序的这种异步循环,IE至少可能倾向于在window.onload
处理程序之前调用.ready()
处理程序。
如上所述,在.ready()
中添加onload
处理程序列表可以解决此问题。
答案 1 :(得分:1)
是
onload
将在加载任何其他内容时触发(图片,框架,iframe等),DOMContentLoaded
就会触发。答案 2 :(得分:0)