【问题标题】:$(document).ready inside $(document).ready$(document).ready 里面 $(document).ready
【发布时间】:2014-04-20 07:48:22
【问题描述】:

我在我的代码库中发现了 $(document).ready(function() {...} 在另一个 $(document).ready(function() {...} 中的代码

例如

$(document).ready(function() {      

    // 20 lines... 

    $(document).ready(function() {
        foo()
    }

    // 200 lines...
}

function foo() {...}

我想了解执行顺序,这样我就可以安全地重构出这个嵌套回调。外部回调似乎在内部回调执行之前继续执行。外部回调是否保证在内部回调被调用之前完成?

【问题讨论】:

  • 贴出你说的这个神秘密码。
  • 有趣,但你为什么要这样做?
  • 这不是为文档的ready 事件在事件触发之后分配一个监听器吗?我本来希望该代码(在外部函数内)永远不会执行。
  • @MichaelZalla,我最近看到了一个案例,其中代码从 IIFE(很差)重构为 document.ready 回调,而原始的 document.ready 代码保持原样。值得庆幸的是,事情一直在工作,因为那将是调试的噩梦。

标签: javascript jquery jquery-callback asynccallback


【解决方案1】:

外部回调是否保证在内部回调被调用之前完成?

是的。

document.ready 的工作方式是在调用回调之前等待 readystatechange 事件触发,但如果 readystatechange 事件已经触发,它也会运行setTimeout。

这表示代码如:

$(function () {
    a();
    $(b);
    c();
});

其中a、b和c是所有函数将按以下顺序执行:

  1. a
  2. c
  3. b

在相关的注释中,人们会质疑为什么您希望在另一个 document.ready 呼叫中运行 document.ready 呼叫,简短的回答是您不会。

唯一的收获是$(callback)比写起来方便一点:

setTimeout(callback, 0);

【讨论】:

【解决方案2】:

您应该删除内部 $(document).ready 并为该回调分配一个名称。然后将其作为外部回调的最后一行调用。

【讨论】:

    【解决方案3】:

    是的。事件侦听器存储在堆栈中,并且在触发事件时一次弹出一个。这个“就绪”侦听器只是将另一个“就绪”侦听器添加到堆栈的末尾。因此,当第一个(外部)执行完毕后,浏览器会继续向下堆栈...直到到达第二个(内部),然后执行。

    【讨论】:

    • 如果代码是document.addEventListener('readystatechange', callback, false),这个答案可能就是这种情况,但是jQuery 处理document.ready 的方式涉及到许多间接和技巧,以使事情在跨浏览器中正常工作。一旦第一个回调执行完毕,它实际上并没有将后续的就绪回调存储在堆栈中。
    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2011-04-11
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多