dom概述

一 概念

js 操作网页(html文档)的api, document是其顶级对象。

二 作用

将网页转为一个JS对象,从而可以用脚本进行各种操作(如:增删改查网页内容)。

三 DOM标准

目前的通用版本是DOM 3,最新制定的版本是DOM 4 (2015年已成为最新的dom标准)

四 DOM树

浏览器会根据DOM模型,将结构化文档(比如HTML和XML)解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)

最顶层的节点是document节点。它构成树结构的根节点(root node),其他HTML标签节点都是它的下级。

除根节点外,其他节点都存在三种关系

父节点关系(parentNode):直接的上级节点 子节点关系(childNodes):直接的下级节点 同级节点关系(sibling):拥有同一父节点

DOM提供 子节点接口(属性): firstChild(第一个子节点) lastChild(最后一个子节点)

同级节点接口(属性): nextSibling(紧邻在后的同级节点)previousSibling(紧邻在前的同级节点)

五 节点(node)

DOM的最小组成单位叫做节点(node)。

文档的树形结构(DOM树),是由各种不同类型的节点组成。

所有节点对象都是浏览器内置的Node对象的实例,继承了Node的属性和方法。

1 节点的类型(七种)

Document:整个文档树的顶层节点 DocumentType:doctype标签(如<!DOCTYPE html>) Element:各种HTML标签(如<body>、<a>) Attribute:网页元素的属性(如class="right") Text:标签的文本 Comment:注释 DocumentFragment:文档的片段

2 Node(节点)对象的属性:

.nodeName 返回节点的名称 .nodeType 返回节点类型的常数值 .nodeValue 返回当前节点本身的文本值,该属性可读写 .textContent 返回当前节点和它的所有后代节点的文本内容 .baseURI 返回当前网页的绝对路径,该属性的值一般由当前网址的URL(即window.location属性)决定,但是可使用HTML的<base>标签,改变该属性的值

.nextSibling 返回紧跟在当前节点后面的第一个同级节点 .previousSibling 返回当前节点前面的、距离最近的一个同级节点 .parentNode 返回当前节点的父节点(可能是三种类型:element节点、document节点和documentfragment节点) .parentElement 返回当前节点的父Element节点 .childNodes 返回一个NodeList集合,成员包括当前节点的所有子节点 .firstChild 返回当前节点的第一个子节点 .lastChild 返回当前节点的最后一个子节点

3 Node(节点)对象的方法(重点!):

.appendChild() 接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点 .hasChildNodes() 返回一个布尔值,表示当前节点是否有子节点 .cloneNode() 克隆一个节点。它接受一个布尔值作为参数,表示是否同时克隆子节点,默认false,即不克隆子节点。克隆一个节点,会拷贝该节点的所有属性,但是会丧失addEventListener方法和on-属性(如node.onclick = fn),添加在这个节点上的事件回调函数。 .insertBefore() 将某节点插入当前节点的指定位置。第一个参数是所要插入的节点,第二个参数是当前节点的一个子节点,新的节点将插在这个节点的前面。该方法返回被插入的新节点。 .removeChild() 接受一个子节点作为参数,用于从当前节点移除该子节点。返回被移除的子节点。 .replaceChild 用于将一个新节点,替换当前节点的某一个子节点。接受两参数,第一个参数是用来替换的新节点,第二个参数将要被替换走的子节点。返回被替换走的那个节点。 .contains() 接受一个节点作为参数,返回布尔值,表示参数节点是否为当前节点的后代节点。 .isEqualNode() 返回一个布尔值,用于检查两个节点是否相等。所谓相等的节点,指两个节点的类型相同、属性相同、子节点相同 .normalize() 用于清理当前节点内部的所有Text节点。会去除空的文本节点,并且将毗邻的文本节点合并成一个。

六 NodeList 和 HTMLCollection

节点都是单个对象,有时需要一种数据结构,能容纳多个节点。DOM提供两种集合对象,用于实现这种节点的集合:NodeList和HTMLCollection

许多DOM属性和方法,返回的结果是NodeList实例或HTMLCollection实例。

1 NodeList对象

NodeList实例对象是一个类似数组的对象,它的成员是节点对象。 如:document.querySelectorAll()返回的就是NodeList实例对象。

(1)NodeList实例对象是类数组结构但不是数组,不能直接使用js数组的方法

注意: NodeList实例对象提供length属性和数字索引,因此可像数组那样,使用数字索引取出每个节点,但它本身并不是数组,不能使用pop或push之类数组特有的方法

如果要在NodeList实例对象使用数组方法,可将NodeList实例转为真正的数组。另一种方法是通过call方法,间接在NodeList实例上使用数组方法。

(2)NodeList的遍历

遍历NodeList实例对象的首选方法,是使用for循环

不要使用for...in循环去遍历NodeList实例对象,因为for...in循环会将非数字索引的length属性和下面要讲到的item方法,也遍历进去,而且不保证各个成员遍历的顺序。

ES6新增的for...of循环,也可以正确遍历NodeList实例对象。

2 HTMLCollection对象

HTMLCollection实例对象与NodeList实例对象类似,也是节点的集合,返回一个类似数组的对象。

如:document.links、docuement.forms、document.images等属性,返回的都是HTMLCollection实例对象。

(1)HTMLCollection与NodeList的区别:

(1)HTMLCollection实例对象的成员只能是Element节点,NodeList实例对象的成员可以包含其他节点。

(2)HTMLCollection实例对象都是动态集合,节点的变化会实时反映在集合中。NodeList实例对象可以是静态集合。

(3)HTMLCollection实例对象可以用id属性或name属性引用节点元素,NodeList只能使用数字索引引用。

参考

已学习

DOM 模型概述(javascript标准参考教程,阮一峰) http://javascript.ruanyifeng.com/dom/node.html

results matching ""

    No results matching ""