jQuery的“文档就绪”功能如何工作?

时间:2011-05-11 04:18:02

标签: jquery

jQuery如何检查文档是否已加载?如何检查文档加载是否已完成?

3 个答案:

答案 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