DOM 是什么?

DOM 将整个文档表示为一个树状结构,其中每个元素、属性、文本段落和其他内容都被表示为节点。这些节点可以通过编程语言 (JavaScript) 访问、修改和更新文档的内容、结构和样式。DOM 提供了一种方便的方式,让开发者可以与网页或 XML 文档进行交互。

DOM 的树形结构的构建过程

DOM (文档对象模型) 的树形结构是通过解析 HTML 或 XML 文档而构建。构建过程如下:

浏览器中的解析器会读取 HTML/XML 文档,并根据其标记语言的语法规则将其解析为一系列节点。这些节点按照文档中元素的层次关系组织成一个树形结构,即 DOM 树。

解析过程中,解析器会为每个遇到的标记创建一个节点对象。不同类型的节点对象对应不同的标记,如元素节点对应 HTML 标签,文本节点对应文本内容等。这些节点对象会按照它们在文档中的层次关系相互链接,形成父子关系。

解析器会从文档的根元素开始,递归地创建节点对象并建立它们之间的层次关系。每个节点都可能有子节点,子节点又可能有自己的子节点,如此构建出整个 DOM 树。

一旦 DOM 树构建完成,开发者就可以使用 JavaScript 操作 DOM 树。通过 DOM API,可以动态地添加、删除或修改节点,改变节点的属性等,实现对网页内容和结构的动态更新。

DOM 和 HTML 的关联方式

解析 HTML 文档

DOM (文档对象模型) 与 HTML 文档的关联始于文档的解析。当浏览器加载 HTML 文档时,它会按照 HTML 规范逐行解析文档。解析的过程包括分析 HTML 标记、构建文档结构、创建 DOM 树等步骤。每个 HTML 标签、属性、文本内容都会被解析为 DOM 中的相应节点。例如,<div> 标签会解析为 DOM 中的元素节点,class 属性会解析为属性节点,文本内容会解析为文本节点。解析过程是将 HTML 文档转换为 DOM 树的关键步骤,为后续的 DOM 操作奠定了基础。

解析 HTML 文档

结构关联

DOM 树的结构直接映射到 HTML 文档的结构。每个 HTML 元素在 DOM 中表示为一个元素节点,包括 <html>、<head>、<body> 等标签。HTML 文档中的嵌套关系、标签的层次结构在 DOM 树中得以保留。这种对应关系使得开发者可以通过访问 DOM 树中的节点获取 HTML 文档中的信息,实现文档内容的检索和操作。DOM 树的结构反映了 HTML 文档的语义和层次关系,为开发者提供了一种直观和高效的方式理解和操作网页内容。


结构关联

使用 JavaScript 访问 DOM

开发者可以使用 JavaScript 作为主要的客户端脚本语言,通过 DOM API 访问和操作 DOM 树。JavaScript 提供了多种方法和属性,用于选取、遍历、修改、创建和删除 DOM 节点。例如,document.getElementById 用于选取具有指定 ID 的元素,innerHTML 属性用于获取或修改元素的内容。通过 JavaScript 操作 DOM,开发者可以动态地更新网页内容、添加交互效果、响应用户事件等,从而创建丰富的 Web 应用程序。DOM API 为 JavaScript 与网页内容之间的交互提供了强大的桥梁。

使用 JavaScript 访问 DOM

动态性和实时同步

DOM 是动态的,与 HTML 文档的关联是实时的。当 HTML 文档发生变化,例如用户输入、元素添加或删除,DOM 会随之更新以反映这些变化。动态性使得 Web 应用程序可以根据用户的操作实时更新界面,创建动态效果,以及响应各种用户交互。例如,在社交媒体应用中,新的帖子可以在不刷新整个页面的情况下添加到用户的时间线中,这要归功于 DOM 的动态性和实时同步。DOM 的动态性和实时同步特性为现代 Web 应用程序带来了流畅的用户体验,使网页不再是静态的文档,而是一个可交互的动态环境。

动态性和实时同步

虚拟 DOM 是什么

虚拟 DOM (Virtual DOM) 是一种在前端开发中用于提高性能和优化用户界面渲染的技术。它是一种内存中的虚拟表示,通常是由 JavaScript 对象构成,模拟了实际的 DOM 结构。虚拟 DOM 的基本思想是通过在内存中维护一个虚拟的 DOM 树来减少直接操作实际 DOM 的次数。当用户与应用程序交互或数据发生变化时,首先会在虚拟 DOM 上进行操作,而不是直接操作实际的 DOM。这些操作包括元素的创建、更新和删除等。

一旦虚拟 DOM 上的操作完成,虚拟 DOM 会与实际 DOM 进行比较,找出发生了哪些变化,然后将这些变化批量更新到实际 DOM 上。这个过程称为"协调"或"调和"。

虚拟 DOM 的优点在于它可以极大地提高页面的性能和响应速度。通过减少直接操作实际 DOM 的次数,减少了浏览器的重绘和重排,进而减少了性能开销。此外,虚拟 DOM 还使开发人员能够更容易地管理和维护复杂的用户界面,使得 DOM 操作更加可控和可预测。

虽然虚拟 DOM 在 React 等前端框架中得到了广泛应用,但它并不是在所有情况下都必需。在简单的应用程序中,直接操作实际 DOM 可能足够高效。而对于大型和复杂的应用程序,虚拟 DOM 可以成为提高性能和开发效率的有力工具。

虚拟 DOM 通常由 JavaScript 对象构成,模拟了实际 DOM 的结构。当需要更新 DOM 时,虚拟 DOM 会先进行操作,然后与实际 DOM 进行比较,找出差异,最后将差异批量更新到实际 DOM 上。这种方式可以减少对实际 DOM 的直接操作,从而提高性能。

DOM 的性能优化方法

优化 DOM 性能的关键在于减少 DOM 操作和重绘。以下是一些常见的优化方法:

批量 DOM 更新

避免频繁修改 DOM,而是先缓存操作,最后一次性应用到 DOM 上。这可以减少重绘和重排的次数,提高性能。例如使用 documentFragment 批量插入节点。

批量 DOM 更新

事件代理

避免为大量节点绑定事件处理程序,而是利用事件冒泡机制,将事件处理程序委托给父元素。这可以减少内存占用,提高性能。

事件代理

虚拟 DOM

使用虚拟 DOM 库如 React 和 Vue,在内存中模拟 DOM 树的变化,只将必要的变化应用到真实 DOM 上。这可以大幅减少 DOM 操作,提高性能。

虚拟 DOM

避免布局抖动

避免强制同步布局,因为这会导致浏览器重新计算元素的几何属性,从而引发重绘和重排。可以批量读写样式,或使用 requestAnimationFrame 在下一帧进行布局。

避免布局抖动

使用 Web Workers

将 CPU 密集型任务交给 Web Workers 处理,避免阻塞主线程,从而提高 DOM 操作的性能。

使用 Web Workers

如何使用选择器查询 DOM 元素

在 Web 开发中,使用选择器查询 DOM (文档对象模型) 元素是一项非常常见的任务。通过 CSS 选择器的规则,开发者可以精确地选择并操作页面上的元素。以下是使用选择器查询 DOM 元素的几种主要方法:

querySelector 方法允许开发者通过 CSS 选择器来选择匹配的第一个元素。它返回一个元素引用,如果没有找到匹配的元素,则返回 null。例如,要选择页面上的第一个 <div> 元素,可以使用 `document.querySelector('div')`。

querySelectorAll 方法可以通过 CSS 选择器来查询所有匹配的元素,并返回一个 NodeList (节点列表)。开发者可以遍历这个 NodeList 以获取所有匹配的元素。例如,要选择页面上所有的 <p> 元素,可以使用 `document.querySelectorAll('p')`。

开发者可以使用组合选择器来选择更复杂的元素。例如,要选择所有具有 ""example"" 类名的 <div> 元素内部的链接,可以使用 `document.querySelectorAll('div.example a')`。

选择器支持伪类和伪元素,使开发者能够选择特定状态下的元素或元素的特定部分。例如,要选择第一个子元素,可以使用 `document.querySelector('parentElement :firstchild')`。

除了 querySelector 和 querySelectorAll 之外,还有其他一些较旧的方法可用于查询 DOM 元素,如 getElementById、getElementsByTagName 和 getElementsByClassName。但是,现代 Web 开发通常更推荐使用 querySelector 和 querySelectorAll,因为它们更加灵活和强大。

使用选择器查询 DOM 元素是 Web 开发中的一项基本技能。通过掌握不同的选择器和组合方式,开发者可以精确地定位和操作页面上的元素,从而构建出功能丰富和交互性强的 Web 应用程序。

亚马逊云科技中国峰会

6 月 19 日 - 20 日|上海世博中心

聚焦生成式 AI 从技术爆发迈向行业深耕的跨越

如何使用 JavaScript 操作 DOM

DOM(文档对象模型)是 Web 开发中的核心概念,它允许开发者使用 JavaScript 以编程方式访问、修改和操纵 HTML 文档的内容和结构。通过 DOM,开发者可以执行以下操作:

要操作 DOM,首先需要获取要操作的元素。可以使用多种方式选择元素,如通过元素的 ID、类名、标签名或 CSS 选择器。常用的方法有 `document.getElementById()`、`document.getElementsByClassName()`、`document.getElementsByTagName()` 和 `document.querySelector()`。

获取了 DOM 元素后,就可以使用 JavaScript 修改其属性、内容和样式。例如:

  • 通过 `element.innerHTML` 属性修改元素的 HTML 内容
  • 通过 `element.setAttribute()` 方法设置元素的属性
  • 通过 `element.style` 属性修改元素的 CSS 样式

使用 `document.createElement()` 方法可以创建新的元素节点,然后设置其属性和内容,并使用 `appendChild()`、`insertBefore()` 或 `insertAdjacentHTML()` 方法将其添加到文档中,动态生成新的页面内容。

可以使用 `removeChild()` 或 `remove()` 方法删除现有元素。

通过 `addEventListener()` 方法为 DOM 元素添加交互处理器,响应用户的操作,如点击、悬停、输入等。交互处理器中可以执行相应的 JavaScript 代码。

DOM 形成了一个树状结构,开发者可以使用 `parentNode`、`childNodes`、`firstChild`、`lastChild`、`nextSibling` 和 `previousSibling` 等属性在 DOM 树中导航和遍历节点。

通过 DOM 操作,开发者可以动态更新网页内容、添加交互行为、修改样式等,从而创建出丰富多彩的 Web 应用程序。掌握 DOM 操作是 Web 开发中的基础技能。

DOM 如何处理事件

DOM (文档对象模型) 提供了一种标准的方式处理网页上的事件。使用 DOM 处理事件是在 Web 开发中非常常见的任务,它允许开发者为用户与网页的交互操作编写响应性的代码。以下是 DOM 处理事件的基本步骤:

选择目标元素

首先,开发者需要选择希望处理事件的目标元素。这可以使用 JavaScript 的 DOM 选择方法来实现,如 `getElementById`、`getElementsByClassName`、`querySelector` 等。通常,开发者会选择要关注事件的 HTML 元素。

选择目标元素

添加事件关注器

选择目标元素后,开发者可以使用 `addEventListener` 方法为该元素添加事件关注器。事件处理程序函数通常会传递一个事件对象作为参数,该对象包含有关事件的信息,例如触发事件的元素、事件类型、鼠标坐标等。

添加事件关注器

编写事件处理程序

事件处理程序是一个 JavaScript 函数,用于定义事件发生时要执行的操作。开发者可以在事件处理程序中编写任何希望执行的代码,包括:

  • 更改元素的内容
  • 修改元素的样式
  • 提交表单
  • 发送 AJAX 请求
  • 执行其他 DOM 操作
编写事件处理程序

移除事件关注器

如果需要在某个时刻停止关注事件,开发者可以使用 `removeEventListener` 方法来移除事件关注器。这通常用于清理资源,避免不必要的事件处理。例如:`button.removeEventListener('click', eventHandlerFunction)`。

移除事件关注器

处理事件对象

在事件处理程序函数中,通常会有一个事件对象传递给函数,该对象包含有关事件的信息,例如:

  • 事件类型
  • 发生事件的元素
  • 鼠标坐标
  • 键盘按键信息等等

开发者可以使用事件对象来获取有关事件的详细信息,并根据需要执行相应的操作。

通过使用 DOM 事件处理机制,Web 开发者可以创建交互式和响应式的网页体验,使用户能够与网页进行有效的交互。DOM 事件处理是 Web 开发中不可或缺的一部分,它为开发者提供了一种标准化和灵活的方式来处理用户交互。

处理事件对象

如何在前端框架中使用 DOM 的信息

在前端框架中使用 DOM 的信息是一个重要的话题。以下是一些关键点:

流行的前端框架如 React、Angular 和 Vue 都采用了虚拟 DOM 的概念。虚拟 DOM 是一种内存中的 DOM 表示,用于优化 DOM 操作和提高性能。框架会自动处理虚拟 DOM 与实际 DOM 之间的同步。

  • React 使用 JSX 语法来定义组件结构,并将组件状态和属性与虚拟 DOM 关联。
  • 开发者可以使用 ref 属性访问 DOM 元素的引用,并在需要时获取信息或执行操作。
  • React 的核心思想是通过状态和属性控制组件行为,而不是直接操作 DOM。
  • Angular 通过指令来扩展 HTML 元素的行为和功能,从而实现对 DOM 的操作。
  • Angular 提供了 Renderer API,允许开发者以安全的方式操作 DOM。
  • 开发者可以在组件中通过依赖注入的方式使用 Renderer 来执行 DOM 操作。
  • Vue 使用模板语法和指令来定义组件结构,并将模板转化为虚拟 DOM。
  • Vue 倾向于通过数据驱动视图,而不是直接操作 DOM。
  • 开发者可以使用生命周期钩子(如 mounted 和 updated)来执行 DOM 操作。
  • 尽量避免直接操作 DOM,而是利用框架提供的抽象层和数据绑定机制。
  • 只在必要时才直接访问 DOM 元素,例如处理第三方库或特殊场景。
  • 保持组件的简单性和可维护性,避免过度依赖 DOM 操作。

总的来说,前端框架为开发者提供了更高层次的抽象,使得开发者可以专注于组件和数据流,而不必过多关注底层的 DOM 操作。但在某些情况下,仍然需要访问和操作 DOM 信息,框架都提供了相应的机制来满足这种需求。

DOM 的跨浏览器兼容性问题

不同浏览器对 DOM 标准的实现存在差异

虽然 DOM 是一个标准规范,但不同浏览器对其实现方式存在一些差异,导致相同的 DOM 操作在不同浏览器中可能产生不同的结果。

浏览器对 DOM 特性支持程度不一

较新的 DOM 特性可能在新版本浏览器中得到支持,而在旧版本浏览器中则无法使用,需要进行特性检测和代码分支处理。

浏览器对 DOM 事件处理存在差异

不同浏览器对事件冒泡、事件捕获等事件处理机制的实现方式可能不尽相同,需要编写跨浏览器兼容的事件处理代码。

浏览器对 DOM 性能优化措施不同

不同浏览器对 DOM 操作的性能优化措施可能有所区别,需要针对不同浏览器采取相应的优化策略。

浏览器对 DOM 扩展特性支持程度不一

不同浏览器可能会实现一些自身的 DOM 扩展特性,这些特性在其他浏览器中可能无法使用,影响代码的可移植性。

浏览器对 DOM 安全策略实现存在差异

不同浏览器对 DOM 相关的安全策略(如同源策略)的实现可能有所不同,需要针对不同浏览器进行相应的安全性考虑。

欢迎加入亚马逊云科技培训中心

从 0 到 1 轻松上手云服务,获取更多官方开发资源及培训教程

快速上手训练营

第一课:亚马逊云科技简介

本课程帮助您初步了解云平台与本地环境的差异,以及亚马逊云科技平台的基础设施和部分核心服务,包括亚马逊云科技平台上的弹性高可用架构,架构设计准则和本地架构迁移上云的基本知识。

亚马逊云科技技术讲师:李锦鸿

第二课:存储与数据库服务

您将在本课程中学习到亚马逊云科技上的三个存储服务分别是什么。我们也将在这个模块中为您介绍亚马逊云科技上的关系型数据库服务 Amazon Relational Database Service (RDS)。

亚马逊云科技资深技术讲师:周一川

第三课:安全、身份和访问管理

在这个模块,您将学习到保护您在亚马逊云科技上构建的应用的安全相关知识,责任共担模型以及身份和访问管理服务, Identity and Access Management (IAM) 。同时,通过讲师演示,您将学会如何授权给 EC2 实例,允许其访问 S3 上的资源。

亚马逊云科技技术讲师:马仲凯

了解更多入门学习计划 »

快速上手训练营

账单设置与查看

账单设置与查看

立即注册,免费试用 Amazon EC2 T4g 实例

新老用户现可享受每月 750 小时的免费 t4g.small 实例使用时长,优惠期至 2025 年 12 月 31 日!

打开中国区账号注册页面

01 填写您 注册账号的邮箱,点击“继续”

02 查看您的 注册账号邮箱

注: 发件箱 no-reply@register.signin.amazonaws.com.cn

03 输入 邮箱中收到的验证码,点击“继续”

注: 该链接中的内容显示语言是与您的网页浏览器设置相一致的,您可以根据需要自行调整语言栏。

立即开始注册 »

image

填写用户名密码

01 请设置您的 账号用户名

02 为您的帐号 设置密码

03 重新 输入密码

立即开始注册 »

图片

填写账号联系人以及公司信息

01 填写公司联系人 姓名全称

02 填写公司联系人的 联系电话

03 填写 公司名称

注: 公司名称请务必与您所提供的营业执照公司名称保持一致

04 填写 公司办公地址

注: 省份/自治区/直辖市 - 城市 - 区 - 街道门牌号以及楼层信息 - 邮政编码

05 请选择 是否需要发票

注: *附件-申请发票流程 供您参考

06 点击查看 客户协议 勾选方框表示您已阅读,并同意客户协议的条款

立即开始注册 »

图片

企业信息验证

01 在此上传 企业注册执照

02 请填写网络安全负责人的 姓名

注: 该字段务必与您下方提供的身份证号匹配或与证件上的姓名保持一致

03 请填写网络安全负责人的 联系方式

注: 有效的电子邮件地址 - 有效的中国内地 手机号码 - 座机号码(如无座机,请填写正确有效的手机号码)

04 在此上传网络安全负责人的 身份证件

注: 当您选择证件类型为“身份证”时,您需要填写正确的身份证号码,选择其他证件类型时,您需要上传证件扫描稿

立即开始注册 »

图片

手机验证与支持计划

01 在此填写 手机号

02 请输入您收到的 4 位 验证码

03 请点击 继续

04 请根据需求 选择一个支持计划

立即开始注册 »

图片