在DOM准备好后,onLoad会被解雇吗?

时间:2012-02-12 13:49:49

标签: javascript jquery onload

我希望在DOM准备就绪时禁用我的插件对DOM执行的某些特定“功能”。

如果我将代码置于onload回调中,它是否会在ready回调后执行?

我希望在100%中确保即使没有任何图像,只要很少,就会在onload之前执行就绪。

3 个答案:

答案 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等),
  • 只要可以访问DOM树,
  • DOMContentLoaded就会触发。

答案 2 :(得分:0)

不。只需亲自试用:创建一个大型HTML文件,删除每个相关资源(图像,脚本,样式表)并进行测试。

enter image description here

从互联网上获取每个资源时加载。获取HTML 时,会触发DOMContentLoad。后者在我的测试中使用140 KB HTML代码花了14毫秒。当然,这是一个边缘情况,但不能保证在DOMContentLoaded之前加载 - 甚至没有外部资源(由于缓存,HTTP / 2的并行下载,快速连接)。