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 表格仅在浏览器中加载

另请参见