何时在 HTML 页面中触发 Javascript 事件循环?

When is the Javascript event loop triggered in a HTML page?

提问人:Draconar 提问时间:10/4/2012 最后编辑:Brian Tompsett - 汤莱恩Draconar 更新时间:9/13/2020 访问量:479

问:

我知道 JS 函数(即)将其接收到的函数作为参数放在浏览器的事件循环中,并且此事件循环将在处理所有内联/同步 JS 调用后进行处理。setTimeout(function(){...}, TIME)

但是,当他具有以下 HTML 页面结构时,实际会发生什么:

<html>
 <head>
  <script> MANY INLINED SCRIPTS </script>
  <script src="file.js"></script>
  <script> setTimeout(function(){...}, TIME)</script>
   .
   .
   .

然后页面继续,可能这种结构会重复出现,直到到达。</html>

在这种情况下,何时处理事件队列?

编辑:我想为我的页面中的脚本创建某种延迟加载器。我依赖于来自其他来源的内容,这些内容应该只在 DOM 被解析并希望响应后出现。

javascript html dom-events unobtrusive-javascript

评论

1赞 zzzzBov 10/4/2012
完成文档解析后,将打开事件循环以处理异步事件/操作。这个例子有帮助吗
0赞 Pointy 10/4/2012
@zzzzBov我认为在 DOM 完全准备就绪之前可能会发生超时回调,但我不是 100% 确定。
0赞 Pointy 10/4/2012
@Draconar,如果您有一些特定的问题要解决,您可能希望将其添加到问题中。
0赞 Draconar 10/4/2012
人!非常感谢。这回答了我的问题。我想确保在事件循环触发之前,所有内联内容都已完成。
0赞 Alohci 10/4/2012
@zzzzBov - 一个我一直不清楚的案例。如果通过较差的连接加载大型 HTML 文档,我相信下载会停滞足够长的时间,以便浏览器绘制它已经到达窗口的 DOM。如果在绘制结束时,如果浏览器仍在等待更多字符,它会旋转事件循环吗?

答:

4赞 Pointy 10/4/2012 #1

找到结束标记后,将立即处理每个内联脚本。类似地,从服务器导入脚本作为单独文件的标签在收到文件时会被处理,并且该过程是同步的 - 浏览器在处理之前等待脚本内容(除了查看相对较新的标签编辑的“async”属性和IE上的旧“defer”属性,它可能曾经或可能不会预测地工作(感谢@RobG))。</script><script><script>

因此,当浏览器看到完整的块时,将运行带有调用的内联代码,然后在给定的毫秒数(大致)过后调用传递的函数。不能过分依赖超时处理的准确性。setTimeout()<script>

除了超时机制之外,还有其他事件:用户交互、ajax 等。从概念上讲,这些都通过同一个网关汇集;也就是说,如果计划运行超时,但用户提前几毫秒单击按钮,则计时器代码将等待按钮处理完成。

评论

1赞 RobG 10/4/2012
和(更古老的,IE发明的)defer属性在支持和不被忽略的地方。