Document: DOMContentLoaded 事件
当 HTML 文档被完全解析并且所有延迟脚本 (<script defer src="…">
和 <script type="module">
) 已下载并执行时,DOMContentLoaded
事件将触发。它不会等待其他操作(例如图像、子框架和异步脚本)完成加载。
DOMContentLoaded
不会等待样式表加载,但是延迟脚本会等待样式表,并且 DOMContentLoaded
事件会在延迟脚本之后排队。此外,非延迟或非异步脚本(例如 <script>
)将等待已解析的样式表加载。
另一个事件,load
,应该仅用于检测页面完全加载。将 load
用于应该使用 DOMContentLoaded
的地方是一种常见的错误。
此事件不可取消。
语法
在诸如 addEventListener()
之类的函数中使用事件名称,或者设置一个事件处理程序属性。
js
addEventListener("DOMContentLoaded", (event) => {});
事件类型
一个通用的 Event
。
示例
基本用法
js
document.addEventListener("DOMContentLoaded", (event) => {
console.log("DOM fully loaded and parsed");
});
延迟 DOMContentLoaded
html
<script>
document.addEventListener("DOMContentLoaded", (event) => {
console.log("DOM fully loaded and parsed");
});
for (let i = 0; i < 1_000_000_000; i++);
// This synchronous script is going to delay parsing of the DOM,
// so the DOMContentLoaded event is going to launch later.
</script>
检查加载是否已完成
DOMContentLoaded
可能会在您的脚本有机会运行之前触发,因此在添加监听器之前进行检查是明智的。
js
function doSomething() {
console.info("DOM loaded");
}
if (document.readyState === "loading") {
// Loading hasn't finished yet
document.addEventListener("DOMContentLoaded", doSomething);
} else {
// `DOMContentLoaded` has already fired
doSomething();
}
注意:这里没有竞争条件——文档不可能在 if
检查和 addEventListener()
调用之间完成加载。JavaScript 具有运行至完成的语义,这意味着如果文档在事件循环的某个特定时间点正在加载,它不可能在下一个周期之前完成加载,到那时 doSomething
处理程序已经附加并且将被触发。
实时示例
HTML
html
<div class="controls">
<button id="reload" type="button">Reload</button>
</div>
<div class="event-log">
<label for="eventLog">Event log:</label>
<textarea
readonly
class="event-log-contents"
rows="8"
cols="30"
id="eventLog"></textarea>
</div>
JavaScript
js
const log = document.querySelector(".event-log-contents");
const reload = document.querySelector("#reload");
reload.addEventListener("click", () => {
log.textContent = "";
setTimeout(() => {
window.location.reload(true);
}, 200);
});
window.addEventListener("load", (event) => {
log.textContent += "load\n";
});
document.addEventListener("readystatechange", (event) => {
log.textContent += `readystate: ${document.readyState}\n`;
});
document.addEventListener("DOMContentLoaded", (event) => {
log.textContent += "DOMContentLoaded\n";
});
结果
规范
规范 |
---|
HTML 标准 # 停止解析 |
浏览器兼容性
BCD 表格仅在浏览器中加载