首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$(document).ready inside $(document).ready

$(document).ready inside $(document).ready
EN

Stack Overflow用户
提问于 2014-03-14 20:11:44
回答 3查看 3.6K关注 0票数 11

我在我的代码库中找到了在另一个$(document).ready(function() {...}中有$(document).ready(function() {...}的代码。

例如:

代码语言:javascript
运行
复制
$(document).ready(function() {      

    // 20 lines... 

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

    // 200 lines...
}

function foo() {...}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-14 20:18:14

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

是。

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

这意味着代码,如:

代码语言:javascript
运行
复制
$(function () {
    a();
    $(b);
    c();
});

其中abc都是按以下顺序执行的函数:

  1. a
  2. c
  3. b

与此相关的是,人们会质疑为什么要在另一个document.ready调用中运行一个document.ready调用,而简单的回答是,您不会这样做。

唯一的好处是,$(callback)比以下内容更便于编写:

代码语言:javascript
运行
复制
setTimeout(callback, 0);
票数 14
EN

Stack Overflow用户

发布于 2014-03-14 20:18:36

您应该删除内部$(文档).ready,并为该回调指定一个名称。然后调用它作为最后一行,外部回调。

票数 1
EN

Stack Overflow用户

发布于 2014-03-14 20:20:57

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22414842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档