JavaScript的DOM 树是如何构建的 ?

article/2025/10/31 20:45:39

今天通过对 DOM 模型、HTML 解释器和 JavaScript 的执行的介绍,来初步学习 HTML 解释器是如何将从网络或者本地文件获取的字节流转成 DOM 树的。

DOM 模型

1、DOM 标准

DOM (Document Object Model) 的全称是文档对象模型,它可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。比如,Web开发中,用 JavaScript 语言来访问、创建、删除或者修改 HTML 的文档结构。

目前 W3C 已经定义了一系列 DOM 接口(三个版本的 DOM 接口,每一个版本都加入了一些新功能,有兴趣的同学请自行查阅),使用这些接口可以对 DOM 树结构进行操作。

 

2、 DOM 树

在介绍 DOM 树之前,首先要清楚,DOM 规范中,对于文档的表示方法并没有任何限制,因此,DOM 树只是多种文档结构中的一种较为普遍的实现方式。

DOM 结构构成的基本要素是 “节点(node)“,而文档的结构就是由层次化的节点组成。在 DOM 模型中,节点的概念很宽泛,整个文档 (Document) 就是一个节点,称为文档节点。除此之外还有元素(Element)节点、属性节点、Entity节点、注释(Comment)节点等。

了解了 DOM 的结构是由各种的子节点组成的,那么以 HTMLDocument 为根节点,其余节点为子节点,组织成一个树的数据结构的表示就是 DOM树。


HTML 网页和它的 DOM 树表示

HTML 解释器

1、解释过程

HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。


从资源的字节流到 DOM 树

通过上图可以清楚的了解这一过程:首先是字节流,经过解码之后是字符流,然后通过词法分析器会被解释成词语(Tokens),之后经过语法分析器构建成节点,最后这些节点被组建成一颗 DOM 树。

在这个过程中,每一个环节都会调用对应的类去处理

  • 词法分析: HTMLTokenizer 类
  • 词语验证:XSSAuditor 类
  • 从词语到节点: HTMLDocumentParser 类、 HTMLTreeBuilder 类
  • 从节点到 DOM 树: HTMLConstructionSite 类

对于线程化的解释器,字符流后的整个解释、布局和渲染过程基本会交给一个单独的渲染线程来管理(不是绝对的)。由于 DOM 树只能在渲染线程上创建和访问,所以构建 DOM 树的过程只能在渲染线程中进行。但是,从字符串到词语这个阶段可以交给单独的线程来做,Chromium 浏览器使用的就是这个思想。在解释成词语之后,Webkit 会分批次将结果词语传递回渲染线程。

JavaScript 的执行

在 HTML 解释器的工作过程中,可能会有 JavaScript 代码需要执行,它发生在将字符串解释成词语之后、创建各种节点的时候。这也是为什么全局执行的 JavaScript 代码不能访问 DOM 的原因——因为 DOM 树还没有被创建完呢。

WebKit 将 DOM 树创建过程中需要执行的 JavaScript 代码交由 HTMLScriptRunner 类来负责,其利用 JavaScript 引擎来执行 Node 节点中包含的代码。

因为 JavaScript 代码可能会修改文档结构,所以代码的执行会阻碍后面节点的创建,同时也会阻碍后面的资源下载,这样就会导致资源不能并发下载的性能问题。所以一般建议:

1、在 “script“ 标签上加上 “async“ 或 “defer“ 属性。
2、将 “script“ 元素放在 “body“ 元素后面。

对于此,WebKit 也通过预扫描和预加载来实现对资源并发下载的优化。

具体过程就是当需要执行 JavaScript 代码的时候,WebKit 先暂停代码的执行,使用预扫描器 HTMLPreloadScanner 类来扫描后面的词语, 如果发现需要使用其他资源,那么就会使用与资源加载器 HTMLResourcePreloader 类来发送请求,在这之后,才执行 JavaScript 代码。由于预扫描器本身并不创建节点对象,也不会构建 DOM 树,所以速度比较快。就算如此,还是推荐不要在头部写入大量 JavaScript 代码,毕竟不是所有渲染引擎都做了这样的优化。

在 DOM 树构建完成后,WebKit 会触发 “DOMContentLoaded” 事件,当所有资源都被加载完成后,会触发 “onload” 事件。


http://chatgpt.dhexx.cn/article/UOYjv6XE.shtml

相关文章

DOM系列:DOM树和遍历DOM

上一节,咱们整理了DOM系列中的第一篇,主要介绍浏览器与DOM相关的知识。从标题中我们可以看出来,今天所要学的东西包含两个部分,第一部分是DOM树,第二部分是遍历DOM。如果你和我一样对于DOM树和遍历DOM是初次接触&#…

DOM树的理解【面试常问】

前言 vue和react框架被广泛应用,封装了DOM操作但是DOM操作一直都是前端工程师的基础、必备知识只会vue而不懂DOM操作的程序员,不会长久 DOM 全称为文档对象模型(Document Object Model)。有这几个概念: 文档、元素…

DOM树知识点梳理

为什么会提到Dom树呢,或许它对于我们很好地理解网页各个元素,标签和控件搭配,以及各种js,css等的加载会有一些帮助。笔者在工程中遇到了一些小问题,本质就是dom树的东西掌握的不扎实。所以借此来梳理一下。 1.HTML DOM ok, 我们先来看一下W3school中怎么解释这个概念和结…

浏览器-DOM树

前言: 在渲染流水线中直接或者间接地依赖于 DOM 结构,本文按着网络数据流路径来介绍 DOM 树是如何进行构建的。 节点(Node): 节点(Node)原本是网络术语,表示网络中的连接点。一个网…

Dom树,什么是dom树?

相信很多初学前端的小伙伴,学了html, css, js之后,会遇到 一个名词 DOM树。 首先说一下DOM是什么? DOM 是 Document Object Model(文档对象模型)的缩写。 举个例子 我们日常生活中,经常会遇到一些写文档…

对 Dom 树的理解

什么是 DOM 从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的,所以要将其转化为渲染引擎能够理解的内部结构,这个结构就是 DOM。 DOM 提供了对 HTML 文档结构化的表述。 在渲染引擎中,DOM 有三个层面的作用: …

DOM初探(9)——DOM结构树

document一回车,他就代表整个文档;Document一回车,他代表的是一个函数,什么函数需要首字母大写?构造函数吧,只不过这个Document有点特殊,你不能new他,这时系统留给自己new的。那这个…

dom树是如何生成的

页面得渲染流程总得俩说就五步,创建 DOM 树——创建 StyleRules——创建 Render 树——布局Layout(重排)——绘制 Painting(重绘) 第一步,用 HTML 分析器,分析 HTML 元素,构建一颗 D…

Dom树 CSS树 渲染树(render树) 规则、原理

前端不可不学的浏览器渲染机制,阿里年年问,去一个栽一个。听说百度也在考这个,你还不准备学吗? 首先你要了解浏览器渲染的顺序:   1.构建dom 树   2.构建css 树   3.构建渲染树   4.节点布局   5.页面渲染 什么…

HTML-DOM树篇

一、什么是DOM DOM(Document Object Model) 文档对象模型,是HTML和XML文档的编程接口 DOM 以树结构表达 HTML 文档,树的每个分支的终点都是一个节点,每个节点都包含着对象DOM 将web页面与脚本或编程语言链接起来&#…

DOM结构(DOM树)

DOM 文档类型DOM(Document Object Model)主要用于HTML文档和XML文档的内容进行操作。DOM描绘了一个层次化的节点树,通过节点的操作,来实现对文档内容进行增删改查。 1.DOM(Document Object Model)&#x…

DOM(一)概述、dom树、查找元素

目录 一、DOM 概述 二、DOM树 二、查找元素 1. 无需查找的元素 2. 按节点间关系查找 3. 按 HTML 特征查找 三、案例:通过DOM实现购物车效果 一、DOM 概述 DOM全称 Document Object Model,是专门操作网页内容的一套对象和函数的总称。由于 ES 标准…

DOM深入学习 --- DOM 树介绍,如何遍历 DOM 树节点(一)

DOM 树 HTML 文档的主干是标签(tag)。 根据文档对象模型(DOM),每个 HTML 标签都是一个对象。嵌套的标签是闭合标签的“子标签(children)”。标签内的文本也是一个对象。 所有这些对象都可以通…

什么是DOM?你了解DOM树吗?

在找工作的过程中,看到了招聘信息上有写这么一条信息: 掌握WEB前端开发技术:JavaScript(含ES6)、HTML、CSS、DOM等 看见这条信息我心里安心了不少,都是一些基础问题,但是乍一看DOM,脑子有点短路了&#x…

Windows命令:CHCP

CHCP 用途一:Windows操作系统默认编码格式是GBK(963),cmd窗口编码方式设置为UTF-8方法: 临时修改方案:CHCP 65001永久修改方案:参考资料:https://jingyan.baidu.com/article/d71306…

查看windows操作系统的默认编码(字符集)-chcp

在windows cmd 模式下,输入命令 : chcp 如上图,我的活动代码页为936,意思是"中国-简体中文(GB2312)" 说明:代码页是“字符集编码”的别名,也有人称为“内码表”。 下表列出了所有支持的代码页…

解决‘chcp’不是内部或外部命令,也不是可运行的程序或批处理文件

解决方法: 此电脑\系统属性\高级系统设置\环境变量 在系统变量点击path,变量值改为Anacondad的安装路径加 ;C:\Windows\System32 即可解决注意添加; 有什么问题可私信我 附图:

meterpreter里面cmd乱码解决方法chcp 65001

当我们使用meterpreter反弹shell后使用是乱码时 可以采用如下命令解决 chcp 65501 chcp是一个计算机指令,能够显示或设置活动代码页编号。 65001 UTF-8代码页 950 繁体中文 936 简体中文默认的GBK 437 MS-DOS美国英语

win10 命令行工具cmd乱码解决方案及cmd非常用命令chcp介绍

问题发生前景: 在使用好压压缩命令批量添加压缩文件的时候产生,中文路径或者文件名中文都是乱码,一堆问号。后来查了一些资料,发现命令行工具能够设置编码格式。具体操作如下: 在cmd或者powershell中执行命令 chcp …

msf拿到shell显示乱码解决方法以及chcp各种编码的补充

文章目录 前言 前言 msf拿到shell之后输入命令经常会有乱码,只需要一条命令就能解决。 chcp 65001 chcp 65001 的意思是 :改变当前活动代码页为 UTF-8,让当前的批处理窗口支持 UTF-8 格式的文件。 改变当前 cmd 窗体的活动代码页&#xff0…