我正在执行一个外部脚本,在 <script>
中使用 <head>
> 。
现在,由于脚本在页面加载 之前 执行,因此我无法访问 <body>
等等。我想在文档“加载”后执行一些 JavaScript(HTML 完全下载并在 RAM 中)。当我的脚本执行时,是否有任何可以在页面加载时触发的事件?
原文由 Robin Rodricks 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在执行一个外部脚本,在 <script>
中使用 <head>
> 。
现在,由于脚本在页面加载 之前 执行,因此我无法访问 <body>
等等。我想在文档“加载”后执行一些 JavaScript(HTML 完全下载并在 RAM 中)。当我的脚本执行时,是否有任何可以在页面加载时触发的事件?
原文由 Robin Rodricks 发布,翻译遵循 CC BY-SA 4.0 许可协议
快速概述如何在打算加载/执行脚本时加载/运行脚本。
<script src="script.js" defer></script>
使用 defer 将在 domInteractive (document.readyState = “interactive”) 之后和 “DOMContentLoaded” 事件被触发之前触发。如果您需要在加载所有资源(图像、脚本)后执行脚本,请使用“加载”事件或目标 document.readyState 状态之一。进一步阅读以获取有关这些事件/状态的更多信息,以及与脚本获取和执行时间相对应的异步和延迟属性。
此布尔属性设置为向浏览器指示脚本将在文档已被解析之后但在触发 DOMContentLoaded 之前执行。
具有 defer 属性的脚本将阻止 DOMContentLoaded 事件触发,直到脚本加载并完成评估。
资源: https ://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attributes
\* 请参阅底部的图片了解羽毛说明。
当 初始 HTML 文档已完全加载和解析 时会触发此事件,而无需等待样式表、图像和子框架完成加载。在此阶段,您可以根据用户设备或带宽速度以编程方式优化图像和 CSS 的加载。
在加载 DOM 后执行(在图像和 CSS 之前):
document.addEventListener("DOMContentLoaded", function(){
//....
});
注意:同步 JavaScript 会暂停 DOM 的解析。如果您希望在用户请求页面后尽可能快地解析 DOM,您可以 将 JavaScript 转为异步 并 优化样式表的加载
一个非常不同的事件,**加载**,应该只用于检测*完全加载的页面*。在 DOMContentLoaded 更合适的地方使用 load 是一个非常普遍的错误,所以要小心。
在加载和解析所有内容后执行:
document.addEventListener("load", function(){
// ....
});
MDN 资源: https ://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded https://developer.mozilla.org/en-US/docs/Web/Events/load
所有事件的 MDN 列表:
https://developer.mozilla.org/en-US/docs/Web/Events
您还可以跟踪 document.readystatechange 状态以触发脚本执行。
// Place in header (do not use async or defer)
document.addEventListener('readystatechange', event => {
switch (document.readyState) {
case "loading":
console.log("document.readyState: ", document.readyState,
`- The document is still loading.`
);
break;
case "interactive":
console.log("document.readyState: ", document.readyState,
`- The document has finished loading DOM. `,
`- "DOMContentLoaded" event`
);
break;
case "complete":
console.log("document.readyState: ", document.readyState,
`- The page DOM with Sub-resources are now fully loaded. `,
`- "load" event`
);
break;
}
});
MDN 资源: https ://developer.mozilla.org/en-US/docs/Web/API/Document/readyState
这对于了解将脚本放置在何处以及它在 HTML 中的位置以及延迟和异步等参数将影响脚本获取、执行和 HTML 阻塞也非常重要。
\* 在下图中,黄色标签“Ready”表示结束加载 HTML DOM 的时刻。然后它触发: document.readyState = “interactive” >>> defered scripts >>> DOMContentLoaded 事件(它是顺序的);
如果您的脚本使用 异步 或 延迟,请阅读: https ://flaviocopes.com/javascript-async-defer/
原文由 DevWL 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答875 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
6 回答1k 阅读
这些解决方案将起作用:
如评论中所述,使用 defer :
或者
或者
甚至
请注意, 最后一个选项是更好的选择, 因为它不 显眼 并且被 认为更标准。