摘要:在本教程中,您将了解 JavaScript DOMContentLoaded 事件。
JavaScript DOMContentLoaded 事件简介
DOMContentLoaded 事件在初始 HTML 文档完全加载和解析后触发,无需等待样式表、图像、框架和异步脚本 <script async src="..."> 完成加载。
以下是 DOMContentLoaded 事件的关键要点
DOMContentLoaded事件在 HTML 文档完全解析后触发。- 它不会等待外部资源(如样式表、图像、框架和异步脚本
<script async src="...">)完成加载。 - 所有延迟脚本
<script defer src="...">和模块<script type="module">已下载并执行。 DOMContentLoaded事件不可取消。
要向 DOMContentLoaded 事件添加事件处理程序,您可以使用 addEventListener() 方法,如下所示
document.addEventListener("DOMContentLoaded", (event) => {
console.log("DOM fully loaded and parsed.");
});Code language: JavaScript (javascript)在此示例中,一旦 DOM 完全加载,代码将在控制台中显示消息“DOM 完全加载并解析”。
JavaScript DOMContentLoaded 事件示例
在实践中,当您将 JavaScript 放置在页面的 head 中但引用 body 中的元素时,您可以监听 DOMContentLoaded 事件,例如
<!DOCTYPE html>
<html>
<head>
<title>JS DOMContentLoaded Event</title>
<script>
let btn = document.getElementById('btn');
btn.addEventListener('click', (e) => {
// handle the click event
console.log('clicked');
});
</script>
</head>
<body>
<button id="btn">Click Me!</button>
</body>
</html>
Code language: HTML, XML (xml)此示例将导致错误,因为当脚本标签运行时,按钮尚未加载。
要解决此问题,您可以在 DOMContentLoaded 事件处理程序中放置上述代码,如下所示
<!DOCTYPE html>
<html>
<head>
<title>JS DOMContentLoaded Event</title>
<script>
document.addEventListener('DOMContentLoaded', () => {
let btn = document.getElementById('btn');
btn.addEventListener('click', () => {
// handle the click event
console.log('clicked');
});
});
</script>
</head>
<body>
<button id="btn">Click Me!</button>
</body>
</html>
Code language: HTML, XML (xml)当您将 JavaScript 放置在页眉中时,会导致瓶颈和渲染延迟。因此,最好将脚本移到 </body> 标签之前。在这种情况下,您不需要将代码放在 DOMContentLoaded 事件中
<!DOCTYPE html>
<html>
<head>
<title>JS DOMContentLoaded Event</title>
</head>
<body>
<button id="btn">Click Me!</button>
<script>
let btn = document.getElementById('btn');
// add an event listener
btn.addEventListener('click', (e) => {
console.log('clicked');
});
</script>
</body>
</html>Code language: HTML, XML (xml)readyState
HTML 文档有三种加载状态
"loading"– 文档正在加载。"interactive"– 文档已完全读取。"complete"– 文档已完全读取,所有资源(如图像)已加载。
document.readState 属性存储当前加载状态。
如果文档已加载,并且您注册了 DOMContentLoaded 事件处理程序,则事件处理程序将永远不会执行。
要正确设置处理程序或在文档准备就绪时立即执行事件处理程序,您可以检查 readyState 属性,如下所示
<!DOCTYPE html>
<html>
<head>
<title>JS DOMContentLoaded Event</title>
<script>
function handleReady() {
console.log('DOM ready');
}
if (document.readyState === 'loading') {
console.log('The document is loading...');
document.addEventListener('DOMContentLoaded', handleReady);
} else {
console.log('The document has been loaded.');
handleReady();
}
</script>
</head>
<body>
</body>
</html>Code language: HTML, XML (xml)总结
DOMContentLoaded事件在 DOM 内容加载时触发,无需等待外部资源(如图像样式表和框架)完成加载。- 仅当您将 JavaScript 代码放置在
head中并引用body中的元素时,才处理DOMContentLoaded事件。 - readyState 存储当前文档加载状态,包括
loading、interactive和complete。
测验
本教程是否有帮助?