前端面试之DOM树

本文深入解析DOM树的构造与原理,探讨其在网页开发中的关键作用,包括JS操作DOM的机制,异步加载的策略,以及常见DOM操作实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、DOM树

什么是DOM

文档对象类型,是 W3C 组织推荐的处理可扩展标记语言的标准编程接口

通过这些 DOM 接口可以改变网页的内容、结构和样式
在这里插入图片描述
深层理解:从网络传给渲染引擎的HTML文件字节流无法直接被渲染引擎理解的,所以要将其转化为渲染引擎能够理解的内部结构,这个结构就是 DOM。DOM 提供了对 HTML 文档结构化的表述

DOM分类

核心DOM:是用于XML与HTML的共用接口;
XMLDOM:XML专用接口;
HTML DOM:HTML专用接口;
DOM事件模型:定义DOM能够响应的事件;
CSS DOM:CSS专用接口

DOM 作用

1、从页面的视角看,DOM是生成页面的基础数据结构
2、从javascript脚本的视角看,DOM提供了一些常见的操作接口,通过这套接口可以直接对文档进行结构,样式的操作。
JS中DOM元素的操作
3、从安全的视角来看、DOM是一道安全防线,把一些不安全的内容在DOM解析阶段就拒之门外、

DOM的生成

第一个阶段,通过分词器将字节流转换为 Token。
第二个和第三个阶段是同步进行的,需要将 Token 解析为 DOM 节点,并将 DOM 节点添加到 DOM 树中。
在这里插入图片描述

js如何影响DOM树

我们都知道html树是从上到下的执行,在执行过程中遇到js脚本时,会暂停执行html,先执行js脚本,因为接下来的js可能会修改当前的DOM结构,
在这里插入图片描述

js引擎介入执行js,如果js脚本中有修改html节点的,先修改html。
当js脚本全都执行完成后,html解析器继续执行。直到DOM完成
这也是为什么js需要异步加载和js脚本需要放在最后的原因
如果js中没有DOM操作。可以使用js异步加载
js异步加载的三种方式
外部js的流程和内嵌的js不一样
当浏览器执行到js文件时,会先下载js文件,(暂停解析来下载js文件)
js中有操作DOM部分的代码,回到主线程上操作DOM后继续执行js
js中如果有操作css外部样式表的,需要先下载外部样式表之后在进行操作。

总结

关于DOM ,我们需要学习的就是js常见的操作DOM 的事件和属性 理解DOM 的原理之后也就好理解为什么js脚本需要放在html底部和延迟加载了(优化的时候会考到)

常见的DOM操作

### DOM 和 BOM 的定义 #### 文档对象模型 (DOM) 文档对象模型(Document Object Model,简称 DOM)是由 W3C 组织推荐的一种标准编程接口[^4]。它提供了一种与平台和语言无关的方式,允许程序和脚本动态访问并更新 HTML 或 XML 文档的内容、结构以及样式。DOM 将整个文档视为一棵形结构,其中每个节点都表示文档的一部分。 #### 浏览器对象模型 (BOM) 浏览器对象模型(Browser Object Model,简称 BOM)是用于描述浏览器窗口及其组件之间的层次关系的模型。BOM 提供了一系列的对象,使得 JavaScript 能够与浏览器环境进行交互。核心对象 `window` 是 BOM 的顶层对象,所有的其他对象如 `navigator`, `screen`, `history`, `location` 都是从 `window` 对象派生出来的。 --- ### DOM 和 BOM 的区别 | **特性** | **DOM** | **BOM** | |---------------------|---------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | **功能定位** | 主要负责处理 HTML 或 XML 文档的内容和结构[^1] | 主要负责与浏览器窗口及外部设备进行交互[^3] | | **根对象** | Document | Window | | **作用范围** | 操作网页内部的具体内容,比如修改元素、获取数据等[^2] | 控制浏览器行为,例如打开新窗口、调整屏幕大小、读取历史记录等[^5] | | **依赖性** | 不同于 BOM,DOM 更加标准化,各浏览器间的差异较小 | 由于涉及浏览器特定的功能实现,不同浏览器可能表现出较大差异 | --- ### 前端开发中的实际应用 在前端开发中,DOM 和 BOM 各自承担着不同的职责: - **DOM 应用场景** - 动态创建或删除页面上的某个元素。 - 修改已有元素的属性值或样式。 - 获取用户的输入信息并通过表单提交给服务器。 示例代码如下: ```javascript const element = document.createElement('div'); // 创建一个新的 div 元素 element.textContent = '这是一个新的 DIV'; // 设置文本内容 document.body.appendChild(element); // 添加到 body 中 ``` - **BOM 应用场景** - 打开或关闭浏览器的新标签页。 - 实现跨域通信或者本地存储管理。 - 访问地理位置服务或其他硬件设施的信息。 示例代码如下: ```javascript window.open('https://example.com', '_blank'); // 在新标签页中加载指定 URL 地址 console.log(window.screen.width); // 输出当前显示器宽度像素数 ``` --- ### 总结 虽然两者名称相似,但实际上它们关注的重点完全不同:一个是针对文档本身的操作框架——即 DOM;另一个则是围绕整个浏览体验构建起来的支持体系——也就是我们所说的 BOM 。理解这两者对于掌握完整的 Web 开发技能至关重要。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十九万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值