DOM
文档对象模型(DOM,Document Object Model)是 HTML 和 XML 文档的编程接口。它表示由多层节点构成的文档,开发者可以通过它来添加、删除和修改页面的各个部分。DOM 最初源自于网景和微软早期的动态 HTML(DHTML,Dynamic HTML),如今已经成为真正跨平台、语言无关的表示和操作网页的标准方式。
DOM Level 1 于 1998 年成为 W3C 推荐标准,提供了基本文档结构和查询的接口。虽然现在已经有了更高级别的DOM规范(如DOM Level 2、DOM Level 3等),但DOM Level 1 作为基础的部分仍然是非常重要的。它为网页的动态操作和交互提供了基础。
节点层级
任何 HTML 或 XML 文档都可以用 DOM 表示为一个由节点构成的层级结构。节点分很多类型,每种类型对应着文档中不同的信息和(或)标记,也都有自己不同的特性、数据和方法,而且与其他类型有某种关系。这些关系构成了层级,让标记可以表示为一个以特定节点为根的树形结构。以下面的 HTML为例:
<html lang="en">
<head>
<title>Sample Page</title>
</head>
<body>
<p>Hello World!</p>
</body>
</html>
如果表示为层级结构,则如图所示。
其中,document
节点表示每个文档的根节点。在这里,根节点的唯一子节点是 <html>
元素,我们称之为文档元素(documentElement)。文档元素是文档最外层的元素,所有其他元素都存在于这个元素之内。每个文档只能有一个文档元素。在 HTML 页面中,文档元素始终是 <html>
元素。在 XML 文档中,则没有这样预定义的元素,任何元素都可能成为文档元素。
HTML 中的每段标记都可以表示为这个树形结构中的一个节点。元素节点表示 HTML 元素,属性节点表示属性,文档类型节点表示文档类型,注释节点表示注释。DOM 中总共有 12 种节点类型,这些类型都继承一种基本类 型。
Node 类型
DOM Level 1 描述了名为 Node 的接口,这个接口是所有 DOM 节点类型都必须实现的。Node 接口在 JavaScript中被实现为 Node 类型,在除 IE之外的所有浏览器中都可以直接访问这个类型。在 JavaScript中,所有节点类型都继承 Node 类型,因此所有类型都共享相同的基本属性和方法。
每个节点都有 nodeType
属性,表示该节点的类型。节点类型由定义在 Node 类型上的 12 个数值常量表示:
常量 | 值 |
---|---|
Node.ELEMENT_NODE | 1 |
Node.ATTRIBUTE_NODE | 2 |
Node.TEXT_NODE | 3 |
Node.CDATA_SECTION_NODE | 4 |
Node.ENTITY_REFERENCE_NODE | 5 |
Node.ENTITY_NODE | 6 |
Node.PROCESSING_INSTRUCTION_NODE | 7 |
Node.COMMENT_NODE | 8 |
Node.DOCUMENT_NODE | 9 |
Node.DOCUMENT_TYPE_NODE | 10 |
Node.DOCUMENT_FRAGMENT_NODE | 11 |
Node.NOTATION_NODE | 12 |
if (someNode.nodeType == Node.ELEMENT_NODE) {
alert('someNode 是一个元素节点');
}
1.nodeName 与 nodeValue
在DOM(文档对象模型)中,nodeName
和 nodeValue
是节点对象的两个属性。
nodeName
属性表示节点的名称,这取决于节点的类型。对于元素节点,它是元素的标签名(大写字母形式),对于属性节点,它是属性的名称,对于文本节点,它是 #text
,对于注释节点,它是 #comment
。
nodeValue
属性表示节点的值,它根据节点的类型而不同。对于元素节点,文本节点和注释节点,它是节点所包含的文本内容;对于属性节点,它是属性的值。
2.节点关系
在DOM(文档对象模型)中,节点之间可以建立不同类型的关系,这些关系用于描述文档结构。以下是常见的节点关系:
父子关系(Parent-Child Relationship)
- 每个节点(除了根节点)都可以有一个父节 点。父节点是指直接包含该节点的节点。
- 每个节点可以有零个或多个子节点。子节点是指直接被该节点包含的节点。
通过 parentNode
和 childNodes
属性,可以访问DOM树中节点的父节点和子节点。
// 访问 body 元素的父节点
console.log(document.body.parentNode); // <html>……</html>
// 访问 html 元素的子节点
console.log(document.documentElement.childNodes); // NodeList(4) [script, head, text, body]
NodeList 是一个类数组对象, 可以通过中括号或 item()
方法访问 NodeList 中的元素:
let nodeList = document.documentElement.childNodes;
console.log(nodeList[0]); // <script>……</script>
console.log(nodeList.item(1)); // <head>……</head>
console.log(nodeList.length); // 4