--- 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
, unload
Window
对象中的此事件: DOMContentLoaded