ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JavaScript 教程:深入理解 DOM 树——标签、文本节点与浏览器的自动修正机制

JavaScript 教程:深入理解 DOM 树——标签、文本节点与浏览器的自动修正机制 文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载HTML 文档在浏览器中并不是一行行被渲染的文本而是一棵由对象构成的树——这就是文档对象模型DOM。本篇技术指南以现代 JavaScript 教程The Modern JavaScript Tutorial中「DOM 树」一章为主体结合仓库中的可运行示例如 elk.html与相邻章节源码系统讲解 DOM 树的节点类型、空白文本节点的处理规则、浏览器对不规范 HTML 的自动修正以及如何借助浏览器开发者工具和 Console 直观观察与操作 DOM。读完本篇你将能准确理解标签成为元素节点、文本成为文本节点、注释也是节点这一核心事实并掌握document.body、$0、inspect(node)等最常用的 DOM 观察与调试手段。从标签到对象DOM 树的基本思想HTML 文档的主干是标签tag。根据 DOM 规范每个 HTML 标签都是一个对象嵌套的标签是外层标签的子标签children标签内的文本同样是一个对象。所有这些对象都可以通过 JavaScript 访问和修改这正是 JavaScript 能够操控页面的根本原因。例如document.body就是表示body标签的对象。下面这段代码会让body保持 3 秒红色状态然后恢复原样document.body.style.background red; // 将背景设置为红色 setTimeout(() document.body.style.background , 3000); // 恢复回去这里用到了style.background而 DOM 节点还暴露了大量其他属性例如innerHTML—— 节点的 HTML 内容offsetWidth—— 节点宽度以像素度量……等等。在学习更多操作 DOM 的方法之前首先需要理解 DOM 的结构本身。上一章 浏览器环境规格 已经介绍过document对象是页面的主要入口点通过它可以更改或创建页面上的任何内容而 DOM Living StandardDOM 现行规范详细描述了文档的结构以及操作文档的对象。DOM 树的实际形态一个简单的例子让我们从下面这个简单的文档开始!DOCTYPE HTML html head titleAbout elk/title /head body The truth about elk. /body /htmlDOM 将 HTML 表示为标签的树形结构html位于根节点head和body是它的子项title又是head的子项文本About elk则是title的子节点。在本仓库中这类结构图由article.md顶部的libs: d3, domtree声明提供支持教程页面会加载 d3 与 domtree 两个库把节点数据绘制成可交互的树状图——在线上版本中点击元素节点还可以展开或折叠其子节点。每个树的节点都是一个对象它们大致分为两类元素节点element node即 HTML 标签本身构成了树的主干结构文本节点text node元素内的文本在图中标记为#text。文本节点只包含一个字符串没有子项并且永远是树的叶子。例如title标签里面的文本About elk就是一个文本节点。文本节点中的特殊字符空格与换行符请注意文本节点中的特殊字符换行符↵在 JavaScript 中为\n空格␣。空格和换行符都是完全有效的字符就像字母和数字一样。它们会形成文本节点并成为 DOM 的一部分。例如在上面的示例中head标签中的title标签前面包含一些空格这部分内容就变成了一个只含换行符和若干空格的#text节点。不过存在两个顶层排除项由于历史原因head之前的空格和换行符均被忽略如果我们在/body之后放置一些东西它会被自动移动到body内部的最下方——因为 HTML 规范要求所有内容必须位于body内所以/body之后不能有空格。在其他情况下规则很简单如果文档中有空格就像任何字符一样它们就会成为 DOM 中的文本节点如果删除它们DOM 中就不会有对应的空格节点。这是去掉所有空白后的对照示例!DOCTYPE HTML htmlheadtitleAbout elk/title/headbodyThe truth about elk./body/html此时 DOM 中只剩下HTML → HEAD → TITLE → About elk与HTML → BODY → The truth about elk.两条干净的主干。与 DOM 一起使用的浏览器工具通常不会显示文本的开头/结尾空格也不会显示标签之间的空文本节点纯换行符这是为了节省屏幕空间。本教程后续的 DOM 示意图也会在空格无关紧要时忽略它们——这样的空格通常不影响文档的显示方式。浏览器的自动修正DOM 总是合法的如果浏览器遇到格式不正确的 HTML它会在构建 DOM 时自动更正。比如顶级标签永远是html即使文档里没有写浏览器也会在 DOM 中创建它对于body也是一样。例如一个 HTML 文件里只有一个单词Hello浏览器会把它包装进html和body中并自动添加所需的head最终 DOM 变为HTML → (HEAD, BODY → Hello)。对于没有关闭标签的文档pHello liMom liand liDad浏览器在读取标签时会填补缺失的部分最终生成BODY → (P → Hello, LI → Mom, LI → and, LI → Dad)这样一个结构正常的 DOM。warn header表格永远有tbody 表格是特殊的例子。按 DOM 规范table必须包含tbody标签但 HTML 文本可能省略它浏览器在创建 DOM 时会自动补上。对于 HTMLtable idtabletrtd1/td/tr/tableDOM 结构会变成TABLE → TBODY → TR → TD → 1——tbody凭空出现了。这一点值得记住以免在使用表格时对这一现象感到惊讶。本仓库正好有一个可直接验证上述规则的可运行文件[elk.html](https://link.gitcode.com/i/a2f0d7cd5b1d2c69997ae41d6eb57694)。它的完整内容如下包含注释、空白与多层嵌套 html !DOCTYPE HTML html body The truth about elk. ol liAn elk is a smart/li !-- comment -- li...and cunning animal!/li /ol /body /html将其在浏览器中打开或配合开发者工具的 Elements 面板就能看到浏览器为这段 HTML 生成的真实 DOM 树形态。其他节点类型注释、DOCTYPE 与 document除了元素节点和文本节点DOM 中还有一些其他节点类型。最典型的是注释节点标记为#comment。以上面的 elk.html 为例!-- comment --会成为一个位于两个li之间的#comment节点。你可能会想注释不影响视觉呈现为什么也要进入 DOM因为有一条铁律如果一些内容存在于 HTML 中那么它也必须在 DOM 树中——HTML 中的所有内容甚至注释都会成为 DOM 的一部分。甚至连 HTML 开头的!DOCTYPE...指令也是一个 DOM 节点它位于html之前很少有人知道这一点教程图表通常也不会绘制它但它确实就在那里。表示整个文档的document对象在形式上同样是一个 DOM 节点。规范中一共有12 种节点类型但实际开发中我们通常只用其中的 4 种document—— DOM 的入口点元素节点 —— HTML 标签树的构建块文本节点 —— 包含文本注释 —— 有时可以把信息放入其中它不会显示但 JS 可以从 DOM 中读取它。使用浏览器开发者工具观察真实 DOM要在实际中查看 DOM 结构最直接的方式是打开本仓库的 elk.html然后打开浏览器开发者工具并切换到元素Elements选项卡。此时你会看到类似下面的界面开发者工具中的 DOM 结构是经过简化的文本节点仅以文本形式显示并且完全不含空白只有空格的文本节点。这其实很方便因为大多数情况下我们只关心元素节点。开发者工具中还有几个实用入口点击左上角的检查Inspect按钮该按钮图标由仓库中的 toolbarButtonGlyphs.svg 提供相关样式定义在 head.html 中即可用鼠标在网页上选取一个节点并检查它——工具会在 Elements 选项卡中滚动到该节点。当页面 DOM 非常庞大、希望定位某个特定元素时这一功能尤其有用。另一种更快的办法是在网页上右键单击然后在上下文菜单中选择检查Inspect。在工具的右侧部分还有若干子选项卡Styles—— 查看按规则应用于当前元素的 CSS 规则包括灰色显示的内建规则。几乎所有内容都可以就地编辑包括盒子模型box model的 dimension / margin / paddingComputed—— 按属性查看应用于元素的最终 CSS 值对每个属性都能看到赋予它的规则包括 CSS 继承等Event Listeners—— 查看附加到 DOM 元素上的事件监听器本教程后续章节会介绍它们……等等。学习这些工具的最佳方式就是多点击尝试——大多数值都可以就地编辑改完即可立刻看到效果。与控制台Console交互$0 与 inspect(node)在观察 DOM 时我们往往还想就地运行 JavaScript 对它做实验。以下是在 Elements 选项卡与 Console 之间切换的两个技巧。技巧一用$0/$1引用最近选中的节点。在 Elements 选项卡中选择第一个li按下Esc键——它会在 Elements 选项卡下方打开 Console 面板此时最后选中的元素可以通过$0操作之前一次的选择则是$1。例如$0.style.background red会把选中的列表项变成红色技巧二用inspect(node)反向定位节点。如果存在引用 DOM 节点的变量例如来自 JavaScript 代码可以在 Console 中执行inspect(node)命令工具会自动在 Elements 选项卡中定位并滚动到该节点。也可以直接在 Console 中输出 DOM 节点并就地展开探索例如输入document.body后点击展开就能看到body节点的属性、子节点等全部结构对应示意图 domconsole1.svg。当然这些操作主要用于调试——从下一章开始我们将正式使用 JavaScript 来访问和修改 DOM。小结HTML/XML 文档在浏览器内均被表示为DOM 树核心事实可以浓缩为三点标签tag成为元素节点并形成文档结构文本text成为文本节点总是树的叶子HTML 中的所有东西在 DOM 中都有它的位置包括注释以及 DOCTYPE、document对象本身。浏览器还会对不规范 HTML 进行自动修正自动补全html/head/body、闭合未闭合的标签、为表格补上tbody因此无论源码多脏DOM 永远是结构完整的。开发者工具Elements 面板 Console是观察 DOM、手动修改并排查问题的最有力助手。DOM 节点还具有大量允许我们在节点间移动、修改节点、在页面中移动的属性和方法——这正是下一篇 遍历 DOM 要系统讲解的内容从document.documentElement、document.body出发通过childNodes、firstChild、lastChild、parentNode、nextSibling等属性在节点树中自由穿行。赞分享文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载相关推荐JavaScript教程深入理解DOM节点属性JavaScript教程深入理解DOM节点属性 在现代Web开发中深入理解DOMDocument Object Model文档对象模型节点属性是每个前文档教程前端SilentPatch让GTA三部曲在Windows 11上重获新生的3大技术秘籍SilentPatch让GTA三部曲在Windows 11上重获新生的3大技术秘籍 你是否还记得第一次在GTA San Andreas的洛圣都街头飙车的兴奋游戏开发逆向工程Stable Video Infinity提示词生成器AI辅助创建高质量视频描述的完整指南Stable Video Infinity提示词生成器AI辅助创建高质量视频描述的完整指南 Stable Video InfinitySVI是一个革命性的人工智能大模型媒体生成深度学习计算机视觉微调上一篇EMQX 监听器绑定地址可移植性检查针对主机专属 IP 的告警日志机制深入解析下一篇30 秒把秒传链接变成自己的文件百度网盘秒传转存脚本创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表