《 JavaScript 权威指南 第十五章》
本文介绍了文档的概念,以及如何获取问题,Node 节点的属性,如何通过Node属性快速定位的相关节点。
JavaScript脚本化文档
每个 Window 对象由一个 document 属性引用了 Document 对象,它是一个巨大的 API 中的核心对象,就做文档模型,它代表和操作文档的内容。
本章涉及到的知识点:
- 如何在文档中查询或选取单独的元素
- 如何将文档作为节点树遍历,如何找到任何文档元素的祖先、兄弟和后台元素
- 如何查询和设置文档元素的属性
- 如何查询、设置和修改文档的内容
- 如何通过创建、插入和删除节点来修改文档结构
- 如何与HTML表单一起工作
- 文档特性,
referrershuxing、write()方法、和查询当前文档中选取的文档文本
DOM 概述
DOM:文档对象模型
一个简单的 HTML 文档的 DOM 树状图:
文档中的每一个节点,表示一个 Node 对象,每个 Node 对象由四大属性,详细请查阅相关章节:
DocumentCharaterDataElementAttr
选取文档元素
- 用指定的
ID属性 - 用指定的
name属性 - 用指定的标签名字
- 用指定的
CSS类 - 匹配指定的
CSS选择器
通过 ID 选取元素
1 | var section1 = document.getElementById('section1'); |
id 属性是 HTML 元素唯一的,这是最简单和常用的选取元素的方法。
通过 id 查找多个元素:

通过名字选取元素
name 属性不是必须唯一,但是只有少数 HTML 元素中有效,包括表单、表单元素、<ifarme>、<img>元素
1 | var radiobuttons = document.getElementByName('favorite_color'); |
有些元素自动设置 name 属性到 Window 对象中,所有可以仅仅通过名字获取,但是最好显示的通过 getElementByName() 获取:
1 | // 针对 <form name='shipping_address'> 元素,获得Element对象 |
通过标签名选取元素
1 | var spans = document.getElementByTagName('span'); |
只能返回数组对象,并且排列顺序是文档中的顺序。HTML 标签是不区分大小写的。
传递通配符参数 * 将获取代表文档中所有元素的 NodeList 对象。
通过 CSS 类选取元素
1 | //查找其class属性值中包含“awrning”的所有元素 |
参数可以是一个字符串,也可以是多个由空格隔开的标识符组成,只有当元素的 class 属性值包含所有指定的标识符时才会匹配,但是与标识符的顺序是无关的。
现代Web浏览器中以<!DOCTYPE>声明的严格程度来选择“怪异模式”或者“标准模式”方式显示HTML文档。
怪异模式是为了向后兼容性而存在的。
通过 CSS 选择器选取元素
选择器用来描述文档中的若干或多组元素,元素可以用ID、标签名或类来描述
querySelectorAll() :返回与指定的选择器组匹配的文档中的元素列表 (使用深度优先的先序遍历文档的节点)。返回的对象是 NodeList 。需要注意的是,一些伪元素无法匹配,如 :first-line :first-letter
1 | var matches = document.querySelectorAll("div.note, div.alert"); |
📌 获取某个元素下包含的所有子元素,查看其属性:
1 | let form = document.getElementById('sub-form') |

文档结构和遍历
有时需要查找文档中与之结构上相关的部分(父亲、兄弟、子女)。
文档从概念上可以看做是一棵节点对象树。
作为节点树的文档
Document对象、它的 Element 对象和文档中表示文本的 Text 对象都是 Node 对象(见上图),Node 定义了几个重要属性:
parentNode- 节点的父节点
childNodes- 只读的子节点数组对象
firstChild、lastChild- 该节点的第一个和最后一个子节点
nextSlibling、previpursSlibling📌- 节点的兄弟节点中的前一个和下一个
- 具有相同父节点的两个节点为兄弟节点
- 节点的顺序反映了它们在文档中出现的顺序
nodeType- 该节点的类型
nodeValueText节点或Comment节点的文本内容
nodeName- 元素的标签名,以大写形式表示
快速获取元素的实践:1
2
3
4//第一个子节点下面的第二个子节点
document.childNodes[0].childNodes[1];
//第一个子节点下面的第一个子节点的前一个兄弟节点
document.firstChild.firstChild.nextSibling
作为元素树的文档
etc… 似乎在开发中用不到