--- title: 'Document: DOMContentLoaded 事件' slug: Web/API/Document/DOMContentLoaded_event tags: - 事件 translation_of: Web/API/Document/DOMContentLoaded_event ---
当纯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完全加载以及解析"
});
<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();
}
<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>
body {
display: grid;
grid-template-areas: "control log";
}
.controls {
grid-area: control;
display: flex;
align-items: center;
justify-content: center;
}
.event-log {
grid-area: log;
}
.event-log-contents {
resize: none;
}
label, button {
display: block;
}
#reload {
height: 2rem;
}
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")}}
load, readystatechange, beforeunload, unloadWindow 对象中的此事件: DOMContentLoaded