从 JQuery.load ajax 调用添加到 DOM 的 document.ready 事件的预期行为是啥?

Posted

技术标签:

【中文标题】从 JQuery.load ajax 调用添加到 DOM 的 document.ready 事件的预期行为是啥?【英文标题】:What is the expected behavior of a document.ready event that is added to the DOM from a JQuery.load ajax call?从 JQuery.load ajax 调用添加到 DOM 的 document.ready 事件的预期行为是什么? 【发布时间】:2018-12-20 05:19:17 【问题描述】:

我有一个网站同时加载多个 JQueryUI 对话框窗口。我使用JQuery.load ajax call 获取每个对话框窗口的 html。这些对话框的内容有时也可能作为单独的网页加载,因此每个对话框都有自己的 $(document).ready() 函数(或简写为 $(function()))。我不确定在原始文档完全加载后由 ajax 加载时 $(document).ready() 函数应该如何表现。

我在这里遇到了一些奇怪的功能。出于某种原因,它在 document.ready 事件中运行代码它到达声明的那一刻,就好像它是顺序代码而不是事件分配。例如:

<script>    
    console.log(1);

    $(function () 
        console.log(3);
    

    console.log(2)
</script>

由于 JS 的单线程性质和事件冒泡,我认为它会等到全局级别脚本完成后才执行。换句话说,我希望这是输出:

1
2
3

但由于某种原因它实际上正在输出:

1
3
2

知道为什么会发生这种行为吗?

【问题讨论】:

您的示例看起来不是有效的语法 - ( 没有匹配的 ) 【参考方案1】:

您正在处理一个 jQuery 函数,而不是真正的 DOM 事件,因此,您与 jQuery 的 their function 实现绑定。

很难准确地说出他们在做什么,因为这种行为在图书馆的发展过程中确实发生了变化......

但基本上,如果函数应该等待的事件已经触发,似乎有两种主要情况:

    他们直接执行传递的回调(显然直到 jQuery 3) 他们在 $.deferred 调用中执行传递的回调,即 Promise(从 jQuery 3 开始)

window.onload = e => 
  console.log('start of window onload');
  $(()=>console.log('$ready')); // executed synchronously
  console.log('end of window onload');
;
<!-- jQuery < 3 -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

window.onload = e => 
  console.log('start of window onload');
  $(()=>console.log('$ready')); // deferred
  console.log('end of window onload');
;
<!-- jQuery >= 3 -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

【讨论】:

很棒的答案!感谢出色的 sn-ps。所以听起来我要么需要升级到 JQuery v3,要么将我的文档准备好的东西包装在 setTimeout(function(), 0) 调用中。由于我仍然有一些使用 IE8 的主要客户很遗憾,所以我使用了 setTimeout 方法,它就像一个魅力!谢谢!

以上是关于从 JQuery.load ajax 调用添加到 DOM 的 document.ready 事件的预期行为是啥?的主要内容,如果未能解决你的问题,请参考以下文章

jquery load 方法回显数据

jquery-Ajax load()

使用jQuery .load()将数组从输入加载到PHP?

Jquery load() 仅在 Firefox 中工作?

jquery load()重复加载,多次加载 js 和css问题的解决办法

jquery load加载页面内ajax返回的div不能响应页面js的问题的解决方案