我知道 JS 函数(即 setTimeout(function(){...}, TIME)
)将其作为参数接收的函数放置在浏览器的事件循环中,并且该事件循环将在处理所有内联/同步 JS 调用后进行处理。
但是当他具有以下 HTML 页面结构时实际会发生什么:
<html>
<head>
<script> MANY INLINED SCRIPTS </script>
<script src="file.js"></script>
<script> setTimeout(function(){...}, TIME)</script>
.
.
.
页面继续,可能这个结构会不断重复,直到 </html>
已达到。
这种情况下事件队列什么时候会被处理?
编辑:我想为我的页面中的脚本创建某种延迟加载程序。我依赖来自其他来源的内容,这些内容仅在 DOM 解析后出现,并且希望能够响应。
最佳答案
每个内联脚本在结束 </script>
后立即处理。找到标签。同样,<script>
从服务器将脚本作为单独文件导入的标记在收到文件时进行处理,并且该过程是同步的 - 浏览器在处理之前等待脚本内容(除了查看 <script>
标记的相对较新的“异步”属性 编辑以及 IE 上旧的“延迟”属性,该属性可能会或可能不会按预期工作(感谢@RobG))。
因此,您的内联代码调用 setTimeout()
当浏览器看到完整的 <script>
时将运行 block ,然后在给定的毫秒数(大约)过去后将调用传递的函数。您不能过分依赖超时处理的准确性。
除了超时机制之外,还有其他事件:用户交互、ajax 等。从概念上讲,这些事件都通过同一个网关汇集;也就是说,如果您的超时计划运行,但用户提前几毫秒单击了按钮,您的计时器代码将等待按钮处理完成。
关于javascript - HTML 页面中的 Javascript 事件循环何时触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12729438/