概述

window.onload 和 DOMContentLoaded 是两个重要的页面加载事件,它们在网页加载过程中触发的时机不同,用途也有所区别。

window.onload

定义

window.onload 事件在页面的所有资源(包括 DOM、CSS、JavaScript、图片、音视频等)完全加载完成后触发。

特点

  • 等待所有资源加载完毕才触发
  • 包括图片、样式表、脚本、iframe 等外部资源
  • 触发时间相对较晚
window.onload = function() {
    console.log("所有资源加载完成");
    // 此时可以安全地操作页面上的任何元素
};

// 或者使用 addEventListener
window.addEventListener('load', function() {
    console.log("所有资源加载完成");
});

DOMContentLoaded

定义

DOMContentLoaded 事件在 HTML 文档完全加载和解析完成后触发,无需等待样式表、图像等外部资源加载完成。

特点

  • 仅等待 DOM 结构加载完成
  • 不等待 CSS、图片、音频等外部资源
  • 触发时间较早,性能更好
document.addEventListener('DOMContentLoaded', function() {
    console.log("DOM 加载完成");
    // 此时可以操作 DOM 元素,但外部资源可能尚未加载完成
});

对比示例

<!DOCTYPE html>
<html>
<head>
    <title>加载事件测试</title>
</head>
<body>
    <img src="large-image.jpg" alt="大图片">
    <script>
        console.log("脚本执行时间");
        
        document.addEventListener('DOMContentLoaded', function() {
            console.log("DOMContentLoaded 触发");
            // 此时可以操作 DOM 元素
        });
        
        window.onload = function() {
            console.log("window.onload 触发");
            // 此时图片等资源也加载完成了
        };
    </script>
</body>
</html>

执行顺序:

  1. “脚本执行时间”
  2. “DOMContentLoaded 触发”
  3. (等待图片加载完成)
  4. “window.onload 触发”

使用场景

DOMContentLoaded 适用于:

  • 初始化页面 DOM 操作
  • 绑定事件处理器
  • 设置页面交互功能
  • 需要尽早执行的 JavaScript 代码

window.onload 适用于:

  • 需要操作图片尺寸的场景
  • 依赖外部资源的初始化操作
  • 需要确保所有内容完全加载后才执行的代码

兼容性

  • DOMContentLoaded: IE9+ 及现代浏览器支持
  • window.onload: 所有浏览器都支持

对于 IE8 及以下版本,可以通过 document.readyState 来模拟 DOMContentLoaded:

function ready(fn) {
    if (document.readyState !== 'loading') {
        fn();
    } else if (document.addEventListener) {
        document.addEventListener('DOMContentLoaded', fn);
    } else {
        document.attachEvent('onreadystatechange', function() {
            if (document.readyState === 'complete') {
                fn();
            }
        });
    }
}

总结

特性 DOMContentLoaded window.onload
触发时机 DOM 解析完成 所有资源加载完成
执行速度 较快 较慢
适用场景 DOM 操作初始化 资源依赖操作
推荐使用 大多数情况 需要完整资源时
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐