DOM 树的理解
DOM 树的概念、生成过程及 JavaScript 对其的影响
问题
什么是 DOM 树,它是如何生成的?
解答
什么是 DOM
DOM(Document Object Model)是渲染引擎将 HTML 字节流转化后的内部数据结构。浏览器无法直接理解网络传输的 HTML 字节流,需要将其转换为 DOM 这种结构化的表述。
DOM 在渲染引擎中有三个作用:
页面视角:DOM 是生成页面的基础数据结构。
JavaScript 视角:DOM 提供了操作接口,JavaScript 可以通过这些接口访问和修改文档的结构、样式和内容。
安全视角:DOM 是一道安全防护线,在解析阶段过滤不安全的内容。
DOM 树的生成过程
HTML 解析器(HTMLParser)负责将 HTML 字节流转换为 DOM 结构。网络进程和渲染进程之间通过共享数据通道传输数据,网络进程加载多少数据就传给 HTML 解析器多少数据。
生成过程分为三个阶段:
1. 字节流转 Token
分词器将字节流转换为 Token,分为 Tag Token(标签)和文本 Token。
2. Token 解析为 DOM 节点
将 Token 解析成对应的 DOM 节点对象。
3. DOM 节点添加到 DOM 树
将生成的节点按照层级关系组装成 DOM 树。
JavaScript 对 DOM 生成的影响
内嵌脚本
当 HTML 解析器遇到 <script> 标签时,会暂停 DOM 解析,因为 JavaScript 可能会修改已生成的 DOM 结构。JavaScript 引擎执行完脚本后,HTML 解析器才会恢复解析。
外部脚本
遇到外部 JavaScript 文件时,同样会暂停 DOM 解析,但需要先下载脚本文件,下载完成后再执行,执行完毕后恢复解析。
关键点
- DOM 是浏览器将 HTML 转换后的内部数据结构,连接了页面和 JavaScript
- DOM 生成经历三个阶段:字节流 → Token → DOM 节点 → DOM 树
- JavaScript 会阻塞 DOM 解析,因为脚本可能修改 DOM 结构
- 外部脚本需要先下载再执行,会延长 DOM 生成时间
目录