《JavaScript高级程序设计》—— DOM

这本书堪称是一个经典佳作啊,可惜我当时能力太弱,所以看不懂里面的东西,最后选择了放弃看后面的内容,现在前面的东西学习的差不多啦,现在再来学习后面的东西。还是以记录者的姿态来学习。那就开始吧。

导读: DOM(文档对象模型)是针对 HTML XML 文档的一个 API(应用程序编程接口)。 DOM 描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。

(1) 节点层次

DOM 可以将任何 HTML XML 文档描绘成一个由多层节点构成的结构。节点分为几种不同的类型,每种类型分别表示文档中不同的信息及(或)标记。每个节点都拥有各自的特点、数据和方法,另外也与其他节点存在某种关系。节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。

文档元素是文档的最外层元素,文档中的其他所有元素都包含在文档元素中。每个文档只能有一个文档元素。在 HTML 页面中,文档元素始终都是<html>元素。在 XML 中,没有预定义的元素,因此任何元素都可能成为文档元素。

并不是所有节点类型都受到 Web 浏览器的支持。开发人员最常用的就是元素和文本节点。

1. 节点关系

每个节点都有一个 childNodes 属性,其中保存着一个 NodeList 对象。 NodeList 是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点。 这个对象也有 length 属性,但它并不是 Array 的实例。NodeList 对象的
独特之处在于,它实际上是基于 DOM 结构动态执行查询的结果,因此 DOM 结构的变化能够自动反映在 NodeList 对象中。

每个节点都有一个 parentNode 属性,该属性指向文档树中的父节点。包含在 childNodes 列表中的所有节点都具有相同的父节点,因此它们的 parentNode 属性都指向同一个节点。此外,包含在childNodes 列表中的每个节点相互之间都是同胞节点。通过使用列表中每个节点的 previousSiblingnextSibling 属性,可以访问同一列表中的其他节点。列表中第一个节点的 previousSibling 属性值为 null,而列表中最后一个节点的 nextSibling 属性的值同样也为 null。

父节点与其第一个和最后一个子节点之间也存在特殊关系。父节点的 firstChild lastChild属性分别指向其 childNodes 列表中的第一个和最后一个节点。

2. 操作节点

① appendChild

(一)因为关系指针都是只读的,所以 DOM 提供了一些操作节点的方法。其中,最常用的方法是appendChild(),用于向 childNodes 列表的末尾添加一个节点。添加节点后, childNodes 的新增节点、父节点及以前的最后一个子节点的关系指针都会相应地得到更新。更新完成后, appendChild()返回新增的节点。
(二)如果传入到 appendChild()中的节点已经是文档的一部分了,那结果就是将该节点从原来的位置转移到新位置。 因此,如果在调用 appendChild()时传入了父节点的第一个子节点,那么该节点就会成为父节点的最后一个子节点。
② insertBefore

如果需要把节点放在 childNodes 列表中某个特定的位置上,而不是放在末尾,那么可以使用insertBefore()方法。这个方法接受两个参数:要插入的节点和作为参照的节点。插入节点后,被插入的节点会变成参照节点的前一个同胞节点(previousSibling),同时被方法返回。

③ replaceChild

replaceChild()方法接受的两个参数是:要插入的节点和要替换的节点。要替换的节点将由这个方法返回并从文档树中被移除,同时由要插入的节点占据其位置。

④ removeChild

removeChild()方法接受一个参数,即要移除的节点。被移除的节点将成为方法的返回值。

前面介绍的四个方法操作的都是某个节点的子节点,也就是说,要使用这几个方法必须先取得父节点(使用 parentNode 属性)。大概的意思就是说你必须要在一个确定的父节点下操作这些方法。

(2) Document类型
JavaScript 通过 Document 类型表示文档。在浏览器中, document 对象是 HTMLDocument(继承自 Document 类型)的一个实例,表示整个 HTML 页面。而且, document 对象是 window 对象的一个属性,因此可以将其作为全局对象来访问。

1. 文档子节点

① documentElement属性始终指向 HTML 页面中的<html>元素。

另外值得一提的是:documentElementfirstChild childNodes[0]的值相同,都指向<html>元素。

② 作为 HTMLDocument 的实例, document 对象还有一个 body 属性,直接指向<body>元素。因为开发人员经常要使用这个元素,所以 document.body JavaScript 代码中出现的频率非常高。

所有浏览器都支持 document.documentElement document.body 属性。
2. 文档信息

title,包含着<title>元素中的文本——显示在浏览器窗口的标题栏或标签页上。通过这个属性可以取得当前页面的标题,也可以修改当前页面的标题并反映在浏览器的标题栏中。修改 title 属性的值不会改变<title>元素。
URL 属性中包含页面完整的 URL(即地址栏中显示的 URL), domain 属性中只包含页面的域名,而 referrer属性中则保存着链接到当前页面的那个页面的 URL。在没有来源页面的情况下, referrer 属性中可能会包含空字符串。所有这些信息都存在于请求的 HTTP 头部,只不过是通过这些属性让我们能够在JavaScrip 中访问它们而已 。
3. 查找元素

getElementById(),接收一个参数:要取得的元素的 ID。如果找到相应的元素则返回该元素,如果不存在带有相应 ID 的元素,则返回 null。注意,这里的 ID 必须与页面中元素的 id特性(attribute)严格匹配,包括大小写。

另一个常用于取得元素引用的方法是 getElementsByTagName()。这个方法接受一个参数,即要取得元素的标签名,而返回的是包含零或多个元素的 NodeList

第三个方法,也是只有 HTMLDocument 类型才有的方法,是 getElementsByName()。顾名思义,这个方法会返回带有给定 name 特性的所有元素。最常使用 getElementsByName()方法的情况是取得单选按钮;为了确保发送给浏览器的值正确无误,所有单选按钮必须具有相同的 name 特性 。

(3) Element类型

除了 Document 类型之外, Element 类型就要算是 Web 编程中最常用的类型了。 Element 类型用于表现 XML HTML 元素,提供了对元素标签名、子节点及特性的访问。

1. 取得属性

传递给 getAttribute()的特性名与实际的特性名相同。因此要想得到 class 特性值,应该传入"class"而不是"className",后者只有在通过对象属性访问特性时才用。如果给定名称的特性不存在, getAttribute()返回 null

getAttribute()对应的方法是 setAttribute(),这个方法接受两个参数:要设置的特性名和值。如果特性已经存在,setAttribute()会以指定的值替换现有的值;如果特性不存在,setAttribute()则创建该属性并设置相应的值。

最后一个方法是 removeAttribute(),这个方法用于彻底删除元素的特性。调用这个方法不仅会清除特性的值,而且也会从元素中完全删除特性。

2. 创建元素

使用 document.createElement()方法可以创建新元素。这个方法只接受一个参数,即要创建元素的标签名。

(4) Text类型

可以使用 document.createTextNode()创建新文本节点,这个方法接受一个参数——要插入节点中的文本。

原文地址:https://www.cnblogs.com/luohaoran/p/5996962.html