DOM(文档队形模型)是针对HTML和XML文档的一个API(应用程序编程接口)。DOM描绘了一个层次化的节点树,允许开发人员添加,移除和修改页面的一部分。DOM可以讲任何HTML和XML文档描绘成一个有多层次节点构成的结构。节点分为几种不同的类型,每种类型分别表示文档中不同的信息。每个节点都拥有各自的特点、数据和方法,另外也与其他节点存在某种关系。节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。总共有12种节点类型,这些类型都继承自一个基类型-Node类型

Node类型

DOM1级定义了一个Node接口,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){ //在IE中无效
alert("Node is an element");
}

为了确保跨浏览器兼容,最好还是将nodeType属性与数字值比较

         if(someNode.nodeType == 1){
alert("Node is an element");
}

1、nodeName和nodeValue属性

要了解节点的具体属性,可以使用这两个属性,他们的值完全取决于节点的类型,在使用这两个值之前,最好是像下面这样先检测一下节点的类型

         if(someNode.nodeType == 1){
value = someNode.nodeName; //nodeName的值是元素的标签名
}

2、节点关系

每个节点都有一个childNodes属性,其中保存着一个NodeList对象。NodeList是一种类数组对象,用于保存一组有序的节点,可以通过为止来访问这些节点。要注意他不是Array的实例,他实际上是基于DOM结构动态执行查询的结果,因此DOM结构的变化能够自动反映在NodeList对象中,要访问NodeList中的节点可以通过方括号,也可以使用item()方法,另外也与其他节点存在某种关系。节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点。

         var fitstChild = sonmeNode.childNodes[0];
var secondChild = someNode.childNodes.item(1);
var count = someNode.childNodes.length;

在前面介绍过,对arguments对象使用Array.prototype.slice()方法可以将其转换为数组,对于NodeList也适用。

         //在IE8及之前版本无效
var arrayOfNodes = Array.prototype.alice.call(someNode.childNodes,0); //兼容所有浏览器
function converToArray(nodes){
var array = null;
try{
array = Array.prototype.slice.call(nodes,0); //针对非IE浏览器
}catch(ex){
array = new Array();
for(var i=0,len = nodes.length;i < len; i++){
array.push(nodes[i]);
}
}
return array;
}

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

父节点的firstChildlastChild属性分别指向起childNodes列表中的第一个和最后一个节点。其中someNode.firstChild等于someNode.childNodes[0],而someNode.lastChild等于someNode.childNodes[someNode.childNodes.length - 1]

hasChildNodes()在节点包含一个或多个子节点的情况下返回true

所有节点都有的最后一个属性是ownerDocument,该属性指向表示整个文档的文档节点,通过这个属性,我们可以不必在节点层次中层层回溯到顶端,而是可以直接访问文档节点

3、操作关系

appendChild(),用于向childNodes列表的末尾添加一个节点,相应的指针关系会更新,更新完成后返回一个新增的节点。

         var returnNode = someNode.appendChild(newNode);
console.log(returnNode = someNode.firstChild); //true
console.log(returnNode = newNode); //true

如果传入到appendChild()方法中的参数已经是文档中的一部分,则他会从原来的位置转移到新的位置,例如

         var returnNode = someNode.appendChild(someNode.firstChild);
console.log(returnNode = sonmeNode.firstChild); //false
console.log(returnNode = someNode.lastChild); //true

insertBefore()把节点放在列表中某个特定的位置上。接受两个参数:插入的节点和作为参考的节点。插入的节点会作为参考节点的前一个同胞节点,同时被返回,如果参照节点是null,则和appendChild()相同

         //插入后成为第一个节点
returnNode = someNode.insertBefore(newNode,someNode.childNodes[0]);
//插入后成为最后一个节点
returnNode = someNode.insertBefore(newNode,someNode.lastChild);
//插入到最后一个节点的前面
returnNode = someNode.insertBefore(newNode,someNode.childNodes[someNode.childNodes.length - 1]);

replaceChild()替换某个节点,接受两个参数:插入的节点和要替换的节点。要替换的节点将由这个方法返回并从文档树中移除。

          //替换第一个子节点
var returnNode = replaceChild(newNode,someNode.firstChild);

removeChild()移除某个节点,接受一个参数即要移除的节点并返回它。

          //移除第一个子节点
var returnNode = removeChild(someNode.childNodes[0]);

4、其他方法

有两个方法是所有类型的节点都有的:cloneNode()和normalize()

cloneNode()方法接受一个布尔值参数,表示是否执行深复制,参数为true时,执行深复制。也就是复制节点本身和整个子节点树。参数为false时,执行浅复制即只复制节点本身。复制后返回的节点副本属于文档所有,但并没有为他指定父节点。因此,这个节点的副本就成为了一个“孤儿”,除非通过appendChild()、insertBefore()或replaceChild()将他添加到文档中,例如:

          <ul>
<li></li>
<li></li>
<li></li>
</ul> //如果我们已经将<ul>元素的引用保存在了myList中, var deepList = myList.cloneNode(true);
console.log(deepList.childNodes.length); // var shallowList = myList.cloneNode(false);
concole.log(shallow.childNodes.length); //

cloneNode()方法不会复制添加到DOM节点中的JavaScript属性,例如事件处理程序等。

normalize()唯一的作用就是处理文档中的文本节点,由于解析器的实现或者DOM操作等原因,可能会出现文本节点不包含文本,或者接连出现两个文本节点的情况。当在某个节点上调用这个方法时,就会在该节点中查照上述两种情况。如果找到了空文本节点,则删除它。如果找到相邻的文本节点,则将它们合并为一个文本节点。

DOM-Node类型的更多相关文章

  1. js DOM Node类型

    DOM(文档对象模型)是针对HTML和XML文档的一个API. DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的.以特定节点为根节点的树形结构.节点分为12种不同的类型,每种类型分别表示 ...

  2. 从原型链看DOM--Node类型

    前言: 本系列从原型,原型链,属性类型等方面下手学习了DOM文档对象模型,旨在弄清我们在DOM中常用的每一个属性和方法都清楚它从哪里来要到哪里做什么事,这样对于理解代码有一定启发.全靠自己在总结中摸索 ...

  3. DOM(一):节点层次-Node类型

    Node类型DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现,每个节点都有一个nodeType属性,用于表明节点的类型.节点类型由在Node类型中定义的下列12个数值常量来表示, ...

  4. 深入理解DOM节点类型第五篇——元素节点Element

    × 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...

  5. 深入理解DOM节点类型第一篇——12种DOM节点类型概述

    × 目录 [1]元素 [2]特性 [3]文本[4]CDATA[5]实体引用[6]实体名称[7]处理指令[8]注释[9]文档[10]文档类型[11]文档片段[12]DTD 前面的话 DOM是javasc ...

  6. 跟随 Web 标准探究DOM -- Node 与 Element 的遍历

    写在前面 这篇没有什么 WebKit 代码的分析,因为……没啥好分析的,在实现里无非就是树的(先序DFS)遍历而已,囧哈哈哈……在WebCore/dom/Node.h , WebCore/dom/Co ...

  7. Node类型知识大全

    Node类型 1.节点关系 每个节点都有一个childNodes属性,其中保存着一个NodeList对象.NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点.请注意, ...

  8. DOM节点类型

    DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现.这个Node接口在JavaScript中是作为Node类型实现的:除了IE外,在其他所有浏览器中都可以访问到这个类型.JavaS ...

  9. 【转载】跟随 Web 标准探究DOM -- Node 与 Element 的遍历

    跟随 Web 标准探究DOM -- Node 与 Element 的遍历 这个是 Joyee 2014年更新的,可能是转战github缘故,一年多没有跟新了.这篇感觉还挺全面,就转载过来,如以前文章一 ...

  10. org.w3c.dom.Node.getTextContent()方法编译错误-已解决

    org.w3c.dom.Node.getTextContent()方法编译错误. 在项目的Java Build Path | Order and Export选项卡中,将JRE System Libr ...

随机推荐

  1. 【JBOSS】控制台数据库连接信息

    数据库连接 信息 进入         在这个页面中(IP和端口已自己的为主):ConnectionCount 这个项目代表在服务开启后,总共使用的连接数!ConnectionCreatedCount ...

  2. ViewController的生命周期

    # ViewController 的生命周期 # ViewController的生命周期中各个方法的流程如下: init loadView :加载view viewDidLoad :view加载完毕 ...

  3. WINFORM 输出txt文件

    SaveFileDialog saveFile1 = new SaveFileDialog(); saveFile1.Filter = "文本文件(.txt)|*.txt"; sa ...

  4. HDU2842 矩阵乘法

    Chinese Rings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  5. MUI框架---实现百度地图定位功能

    1 2 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...

  6. 学习 React(jsx语法) + es2015 + babel + webpack

    视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...

  7. IEEE/ACM ASONAM 2014 Industry Track Call for Papers

    IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...

  8. SQL Server 2016 CTP2.2 的关键特性

    SQL Server 2016 CTP2.2 的关键特性 正如微软CEO 说的,SQL Server2016 是一个Breakthrough Flagship  Database(突破性的旗舰级数据库 ...

  9. ABP框架理论学习之Hangfire集成

    返回总目录 Hangfire是一个综合的后台工作管理者.你可以将Hangfire集成到ABP中,这样就可以不使用默认的后台工作管理者了.但你仍然可以为Hangfire使用相同的后台工作API.这样,你 ...

  10. [PHP源码阅读]strlen函数

    文章来自:http://www.hoohack.me/2016/02/22/phps-source-analytics-strlen 我在github有对PHP源码更详细的注解.感兴趣的可以围观一下, ...