jQuery如何检查文档是否已加载?如何检查文档加载是否已完成?
答案 0 :(得分:29)
查看source code中的函数bindReady。
它们绑定到DOMContentLoaded事件(或某些浏览器上的onreadystatechange)。如果DOMContentLoaded不受支持或因其他原因未被触发,它们也会回退到常规加载事件。在支持它的浏览器上,他们使用此调用:
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
在IE< 9:
上document.attachEvent( "onreadystatechange", DOMContentLoaded);
这些调用中DOMContentLoaded
的第二个实例是它们自己的函数 - 实际上是对源代码中ready
正上方的bindReady
函数的引用。此函数将通过检查document.body
来检查DOM树是否实际完成。如果它还不存在,它们会等待一毫秒(使用setTimeout)并再次检查。当document.body存在时,它们会遍历您设置的回调列表。
答案 1 :(得分:8)
所以幕后有一点点,但这是它的要点,直接用于jQuery源:
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", jQuery.ready, false );
// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", DOMContentLoaded );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", jQuery.ready );
// If IE and not a frame
// continually check to see if the document is ready
var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch(e) {}
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
因此,对于大多数浏览器(Mozilla,Opera和Webkit),jQuery正在侦听一个DOMContentLoaded
事件,当触发该事件时,它会调用您使用jQuery注册的所有现成处理程序。
IE的行为有点不同,因为他们没有DOMContentLoaded
事件,他们尝试挂钩文档的onreadystatechange
事件,他们还挂钩window.onload
事件,如还有一个偷偷摸摸的代码,他们不断尝试每毫秒滚动页面(doScrollCheck)。其中一个火灾首先触发就绪处理程序,后续事件将被忽略。
我希望这有意义并帮助你:)
答案 2 :(得分:5)
jQuery没有做任何JavaScript不能/不做的事情 - 它只是一个JavaScript框架/库。它的作用是为浏览器实现的JavaScript事件提供包装,例如onload
($.load()
)和DOMContentLoaded
($.ready()
)。当然,有很多工作要尝试在浏览器中尽可能地标准这种行为,并解决浏览器错误,问题和不兼容问题。
例如,IE在IE 9之前并不真正支持DOMContentLoaded
,但jQuery必须为它提供实现。您可能希望看到这些链接,以了解更多关于此事件是什么以及如何实现类似的东西,即使没有jQuery:
如果你真的想看看jQuery正在做什么,你应该查看jQuery source。