当我们说"HTML文档被完全加载和解析完成"时,这指的是浏览器已经完成了以下关键步骤:

  1. HTML文档的下载:浏览器从服务器获取完整的HTML文件内容。

  2. HTML文档的解析:浏览器逐行解析HTML代码,识别标签、属性和文本内容。

  3. DOM树的构建:浏览器根据解析的结果,在内存中构建出完整的文档对象模型(DOM)树结构。

DOM树构建完成的标志

DOMContentLoaded事件触发的核心标志是:

  • 浏览器已经处理了所有HTML标记。

  • 所有DOM元素都已创建并添加到DOM树中。

  • 所有内联脚本(不包含defer或async属性的脚本)已经执行完成。

  • 文档的readyState属性值变为interactive。

与资源加载的区别

需要特别注意的是,"HTML文档被完全加载和解析完成"不包括以下内容:

  • 外部CSS样式表的加载和解析。

  • 图像、视频、音频等媒体资源的加载。

  • 外部字体文件的加载。

  • 子框架(iframe)内容的加载和解析。

实际意义

这就是为什么我们说DOMContentLoaded事件比load事件更早触发的原因。它允许我们在页面视觉上完全呈现之前,就开始操作DOM元素,从而提高用户体验和页面交互的响应速度。

示例说明

document.addEventListener('DOMContentLoaded', function() {
    // 获取所有复选框容器
    const labelContainer = document.querySelectorAll('.dmi-label');
    
    // 这里可以安全地操作DOM元素,因为它们都已存在
    // 即使页面上的图片可能还在加载中
});

在这个例子中,当DOMContentLoaded事件触发时,浏览器已经确保.dmi-label元素存在于DOM树中,即使页面上的其他资源(如图片)可能仍在加载。这就是为什么我们可以安全地使用querySelectorAll来获取这些元素并添加事件监听器。