DOM-Node类型
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列表中的每个节点相互之间都是同胞节点。通过使用列表中每个节点的previousSibling和nextSibling属性,可以访问同一列表中的其他节点列表中第一个节点的previousSibling属性值为null,而列表中最后一个节点的nextSlbling属性的值同样也是null
父节点的firstChild和lastChild属性分别指向起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类型的更多相关文章
- js DOM Node类型
DOM(文档对象模型)是针对HTML和XML文档的一个API. DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的.以特定节点为根节点的树形结构.节点分为12种不同的类型,每种类型分别表示 ...
- 从原型链看DOM--Node类型
前言: 本系列从原型,原型链,属性类型等方面下手学习了DOM文档对象模型,旨在弄清我们在DOM中常用的每一个属性和方法都清楚它从哪里来要到哪里做什么事,这样对于理解代码有一定启发.全靠自己在总结中摸索 ...
- DOM(一):节点层次-Node类型
Node类型DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现,每个节点都有一个nodeType属性,用于表明节点的类型.节点类型由在Node类型中定义的下列12个数值常量来表示, ...
- 深入理解DOM节点类型第五篇——元素节点Element
× 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...
- 深入理解DOM节点类型第一篇——12种DOM节点类型概述
× 目录 [1]元素 [2]特性 [3]文本[4]CDATA[5]实体引用[6]实体名称[7]处理指令[8]注释[9]文档[10]文档类型[11]文档片段[12]DTD 前面的话 DOM是javasc ...
- 跟随 Web 标准探究DOM -- Node 与 Element 的遍历
写在前面 这篇没有什么 WebKit 代码的分析,因为……没啥好分析的,在实现里无非就是树的(先序DFS)遍历而已,囧哈哈哈……在WebCore/dom/Node.h , WebCore/dom/Co ...
- Node类型知识大全
Node类型 1.节点关系 每个节点都有一个childNodes属性,其中保存着一个NodeList对象.NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点.请注意, ...
- DOM节点类型
DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现.这个Node接口在JavaScript中是作为Node类型实现的:除了IE外,在其他所有浏览器中都可以访问到这个类型.JavaS ...
- 【转载】跟随 Web 标准探究DOM -- Node 与 Element 的遍历
跟随 Web 标准探究DOM -- Node 与 Element 的遍历 这个是 Joyee 2014年更新的,可能是转战github缘故,一年多没有跟新了.这篇感觉还挺全面,就转载过来,如以前文章一 ...
- org.w3c.dom.Node.getTextContent()方法编译错误-已解决
org.w3c.dom.Node.getTextContent()方法编译错误. 在项目的Java Build Path | Order and Export选项卡中,将JRE System Libr ...
随机推荐
- 【内核篇】Windows内核重要变量
====================================================== LIST_ENTRY PsLoadedModuleList; [定 义] wrk\wrk ...
- spring3.0使用annotation完全代替XML(续)
从回帖的反应来看,大多数人还是不赞成完全代替XML的,这点倒是在意料之中.我个人还是倾向于用代码来取代XML的Bean定义,当然这更多的是关乎个人偏好,不代表与我观点不同的人就是错的. 先来说说代码相 ...
- 【WPF】WPF中的List<T>和ObservableCollection<T>
在WPF中 控件绑定数据源时,数据源建议采用 ObservableCollection<T>集合 ObservableCollection<T> 类:表示一个动态数据集合,在添 ...
- STM32之通用定时器
广大的互联网的大家早上中午晚上..又好..没错了..我又来了..写博客不是定时的..为什么我要提写博客不是定时的呢??聪明的人又猜到我要说什么了吧.有前途.其实我还是第一次听到定时器有通用和高级之分的 ...
- 【转】关于FLASH中图文混排聊天框的小结
原文链接 图文混排也是FLASH里一个很古老的话题了,我们不像美国佬那样游戏里面聊天框就是聊天框,全是文字干干净净,也不像日本人发明了并且频繁地使用颜文字.不管是做论坛.做游戏,必定要实现的一点就是带 ...
- Akka-actor使用入门
学习scala编程,不可避免的会接触到actor模式,它使得并发编程不再像噩梦般萦绕着开发者,Akka是actor的一个开源实现.由于本人水平有限,自认为还不能把actor设计思想讲明白,所以本文仅仅 ...
- Python模块之day4
模块,代码归类实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能 ...
- phpMoadmin CVE-2015-2208 远程代码执行漏洞分析
原文:http://www.thinkings.org/2015/03/05/cve-2015-2208-phpmoadmin-exec-vul.html phpMoAdmin 是一个用PHP 开发的 ...
- 利用canvas图片剪切
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- 【SQLServer】“无法对数据库'XXX' 执行删除,因为它正用于复制”的解决方法
从今天起,把编程中遇到的所有问题都记录下来,以便今后参考,以及方便网友查阅,希望我的问题可以帮助到很多志同道合的人们,我也是受很多前辈的提点,一步一步走来,希望大家都不要吝啬,将自己遇到的问题记录下来 ...