【问题标题】:When is the Javascript event loop triggered in a HTML page?什么时候在 HTML 页面中触发 Javascript 事件循环?
【发布时间】:2026-02-16 11:10:02
【问题描述】:

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

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

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

然后页面继续前进,这种结构可能会不断重复,直到到达&lt;/html&gt;

这种情况下事件队列什么时候处理?

编辑:我想为我页面中的脚本创建某种惰性加载器。我依赖来自其他来源的内容,这些内容应该只在解析 DOM 之后才会出现,并且希望能够响应。

【问题讨论】:

  • 文档解析完成后,打开事件循环以处理异步事件/动作。 Does this example help?
  • @zzzzBov 我认为在 DOM 完全准备好之前可能会发生超时回调,但我不是 100% 确定。
  • @Draconar 如果您有一些特别的问题要解决,您可能需要将其添加到问题中。
  • 伙计们!太感谢了。这回答了我的问题。我想确保所有内联的东西在事件循环触发之前完成。
  • @zzzzBov - 我一直不清楚的一个案例。如果在连接不良的情况下加载大型 HTML 文档,我相信下载会停止足够长的时间,以使浏览器能够绘制到目前为止到窗口的 DOM。如果在绘制结束时,如果浏览器仍在等待更多字符,它会旋转事件循环吗?

标签: javascript html dom-events unobtrusive-javascript


【解决方案1】:

一旦找到结束 &lt;/script&gt; 标记,就会处理每个内联脚本。同样,从服务器导入脚本作为单独文件的&lt;script&gt; 标记在收到文件时进行处理,并且该过程是同步的 - 浏览器在处理之前等待脚本内容(除了参见相对较新的“异步”属性&lt;script&gt; 标签 edit 和 IE 上的旧“defer”属性,它可能会或可能不会按预期工作(感谢@RobG)。

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

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

【讨论】:

  • 还有(更老的,IE 发明的)defer 属性支持且未被忽略。
最近更新 更多