--- title: 'Document: DOMContentLoaded 事件' slug: Web/API/Document/DOMContentLoaded_event tags: - 事件 translation_of: Web/API/Document/DOMContentLoaded_event ---
{{APIRef}}

当纯HTML被完全加载以及解析时,DOMContentLoaded 事件会被触发,而不必等待样式表,图片或者子框架完成加载。

冒泡阶段 Yes
可撤销性 Yes (尽管它被指定为一个简单事件时是不可撤销的)
接口 {{domxref("Event")}}
事件句柄属性 None

一个易混用但不同的事件是,load,这个事件仅仅应该在探测到整个页面完全加载完成时被使用。一个常见的错误就是在该使用DOMContentLoaded的地方使用了load

JavaScript的同步模式会导致DOM解析暂停。如果你想在用户请求页面时,首先尽可能先解析DOM,此时你可以使用JavaScript异步模式,并且优化样式表的加载。在通常模式的加载过程中,样式表的加载会与DOM解析并行,从而迟缓主要HTMl文档的加载。

例子

基本用法

document.addEventListener('DOMContentLoaded', (event) => {
    console.log('DOM fully loaded and parsed'); // 译者注:"DOM完全加载以及解析"
});

 延迟 DOMContentLoaded

<script>
  document.addEventListener('DOMContentLoaded', (event) => {
    console.log('DOM fully loaded and parsed');
  });

for( let i = 0; i < 1000000000; i++)
{} // 这段同步脚本将会延迟DOM解析,
   // 所以DOMContentLoaded事件将会延迟执行.
</script>

检查加载是否已经完成

在你的脚本有机会运行前,DOMContentLoaded可能就已经被触发。所以你在决定添加一个事件监听器前最好先检查一下。

function doSomething() {
  console.info('DOM loaded');
}

if (document.readyState === 'loading') {  // 此时加载尚未完成
  document.addEventListener('DOMContentLoaded', doSomething);
} else {  // 此时`DOMContentLoaded` 已经被触发
  doSomething();
}

实例

HTML

<div class="controls">
  <button id="reload" type="button">Reload</button>
</div>

<div class="event-log">
  <label>Event log:</label>
  <textarea readonly class="event-log-contents" rows="8" cols="30"></textarea>
</div>

JS

const log = document.querySelector('.event-log-contents');
const reload = document.querySelector('#reload');

reload.addEventListener('click', () => {
  log.textContent ='';
  window.setTimeout(() => {
      window.location.reload(true);
  }, 200);
});

window.addEventListener('load', (event) => {
    log.textContent = log.textContent + 'load\n';
});

document.addEventListener('readystatechange', (event) => {
    log.textContent = log.textContent + `readystate: ${document.readyState}\n`;
});

document.addEventListener('DOMContentLoaded', (event) => {
    log.textContent = log.textContent + `DOMContentLoaded\n`;
});

结果展示

{{ EmbedLiveSample('实例', '100%', '160px') }}

规范

Specification Status Comment
{{SpecName('HTML WHATWG', 'parsing.html#the-end:event-domcontentloaded', 'DOMContentLoaded')}} {{Spec2('HTML WHATWG')}}  
{{SpecName('HTML5 W3C', 'parsing.html#the-end:event-domcontentloaded', 'DOMContentLoaded')}} {{Spec2('HTML5 W3C')}}  

浏览器兼容性

{{Compat("api.Document.DOMContentLoaded_event")}}

相关链接