Document: DOMContentLoaded 事件
当纯 HTML 被完全加载以及解析时,DOMContentLoaded
事件会被触发,而不必等待样式表,图片或者子框架完成加载。
冒泡阶段 | Yes |
---|---|
可撤销性 | Yes (尽管它被指定为一个简单事件时是不可撤销的) |
接口 | 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`;
});
结果展示
规范
Specification |
---|
HTML Standard # stop-parsing |
浏览器兼容性
BCD tables only load in the browser
相关链接
- 有关事件:
load
,readystatechange
,beforeunload
,unload
Window
对象中的此事件:DOMContentLoaded