(学习笔记)DOM节点

HTML文档被描述为标准的W3C DOM,所以用户可以使用w3c推荐的DOM接口来处理HTML文档.
使用W3C DOM处理HTML文档的关键在于理解节点,因为DOM将HTML文档中的每个内容都描述为节点,不同的内容使用不同类型的节点.

JavaScript DOM API 的节点类型

在DOM文件中,每一个节点都属于一种类型,可以使用Node.nodeType属性获取节点类型,DOM规范共定义了12中节点类型,可以使用node接口定义的常量来表示,也可以使用数字来表示.
(IE浏览器直到IE9才支持用常量表示,所以最好使用数字表示).

节点类型常量 值+描述
Node.ELEMENT_NODE 1元素节点
Node.ATTRIBUTE_NODE 2属性节点
Node.TEXT_NODE 3文本节点
Node.CDATA_SECTION_NODE 4CDATA节点
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符号节点

节点的层次关系
(1)父节点(Parent Node)
每个元素都有一个父节点,除非是根元素
(2)子节点(Child Nodes)
(3)同胞节点(Sibling Nodes)
(4)祖辈节点(Ancestor Nodes)
(5)后代节点(Descendant Nodes)

节点及其对应的接口

接口名 功能描述
Attr 表示一个属性节点
CDATASection 表示一个CDATA节点
Comment 表示注释节点
Document 表示整个HTML文档或HTML文档
DocumentFragment 表示文档片段节点
DocumentType 表示文档类型节点
Element 表示元素节点
Entity 表示实体节点
EntityRference 表示实体引用节点
Notation 表示DTD表示法节点
ProcessingInstruction 表示处理指令节点
Text 表示文本节点
集合类型接口 功能描述
NamedNodeMap 表示可以通过名称访问节点的集合
NameList 提供对并行的名称和命名空间值对(可以为null)的有序集合的抽象,无需定义或约束如何实现该集合
NodeList 提供对节点的有序集合的抽象,没有定义或约束如何实现该对象.

不需要记住那么多的接口,只要有大概的印象即可,但有三个对象称为基本的DOM对象必须要记住:

对象 说明
Node 文档的每个节点,都有自己的Node对象
NodeList 这是Node对象列表
NamedNodeMap 允许按名称(不是按索引)访问所有对象

基本的节点处理

一旦解析了HTML文档为DOM,那么HTML文档在内存中就表现为各种节点,使用标准的接口定义就可以进行处理.
Node是整个DOM的基接口,它表示该文档树中的单个节点.Node定义了很多方法和属性供所有子接口所实现的对象使用.

方法名 功能描述
appendChild() 在子节点末尾添加一个子节点
cloneNode() 克隆一个节点
hasAttributes() 检查该节点是否有属性
hasChildNodes() 检查该节点是否有子节点
insertBefort() 在引用的节点之前添加一个新节点
inSupported() 检查该节点是否被版本支持
normalize() 规格化该节点
removeChild() 在子节点列表中删除一个子节点
replaceChild() 替换一个子节点
属性 描述
nodeName 返回节点名
nodeValue 返回和设置节点值
nodeType 返回节点类型
parentNode 父节点
childNodes 返回所有子节点
firstChild 第一个子节点
lastChild 最后一个子节点
perviousSibling 紧挨着当前子节点的前一个子节点
nextSibling 紧挨着当前子节点的后一个子节点
attributes 返回当前节点的所有属性
ownerDocument 返回当前节点对应的文档对象
namespaceURL 返回该节点的命名空间URL
prefix 返回当前节点的命名空间前缀
localName 返回当前节点的限定名的前缀部分

HTML文档解析后所得到的文档就是Document节点,可以使用window.document获取,document表示的是整个HTML文档,一般应该用该接口的documentElement属性获取该文档的根节点,也就是HTML元素的节点.

var root=document.documentElement;

根节点是一个元素节点,可以使用很多种方法获取根节点下的子节点,例如下面代码使用firstChild属性获取第一个子节点:

var node=root.firstChild;

在获取子节点之前,一般应该检查是否有子节点(例如,text类型的节点就没有子节点).

if(root.hasNodes()){
	//代码片段
}

可以配合使用firstChild和nextSubling遍历所有子节点.

if(root.hasNodes()){
	var node=root.firstChild();
	while(node!=null){
		alert(node.innerHTML;
		node=node.nextSubling;
	}
}

另外,也可以使用childNodes属性一次获取该节点的所有子节点,然后使用循环语句遍历.

扫描二维码关注公众号,回复: 6763549 查看本文章
if(root.hasNodes()){
	var nodelist=root.childNodes;
	var node;
	for(var i=0;i<nodelist.length:i++){
		node=nodelist[i];
		alert(node.innerHTML);
	}
}

使用getElementByTagName()方法可以返回具有给定元素名称的所有后代元素组成的NodeList,然后可以使用循环遍历这些元素,例如下面代码:

if(root.hasNodes()){
	var nodelist=root.getElementByTagName("div");
	var nodeLen=node.length;
	for(var i=0;i<nodeLen;i++){
		node=nodelist[i];
		alert(node.innerHTML);
	}
}

节点名,节点值和属性

使用Node定义的nodeName,nodeValue和attributes属性,可以分别获取节点的节点名,节点值,和属性.
使用Node定义的 nodeName;nodeValue,attributes属性可以分别获取节点的节点名,节点值,和属性(只有Element节点可获取NamedNodeMap).

删除HTML文档中的元素节点,属性和内容

  1. 从DOM中删除子元素节点.
    若要删除节点,可以使用removeChild()方法,删除节点时,该方法该方法删除属于所删除节点的子数,语法格式如下:
	oldChild=node.removeChild(sChildName);
  1. 删除DOM中元素节点的属性.
    (1)使用Element.removeAttribute()方法可以按名称删除当前节点的指定属性,语法格式如下:
	element.removeAttribute(sName);

(2)使用removeAttributeNode()方法可以删除元素节点中的属性节点,这必须首先获得对属性节 点的引用,然后才能删除它,如下:

var aNode=document.getElementById("oDiv");
var attr_id=aNode.getAttributeNode("id");
aNode.removerAttributeNode(attr_id);
  1. 删除DOM元素中的文本内容.
    同样的原理,也可以删除元素的内容,这些内容其实是文本节点,首先获取对文本节点的引用,然后使用removeChild()删除文本节点即可.

替换节点

使用replaceChild()方法可以替换原有节点,以实现改变元素内容的目的.如下:

var aNode=document.getElementById("oDiv");
var oTextNode=document.createTestNode("这是新内容");
aNode.replaceChild(oTextNode,aNode.first);

主要接口的使用

除了Node,其他介个与HTML文档中节点类型对应的接口也各自定义了自己独特的方法,它们几乎都继承自Node(除DOMException,DOMImplementation,NamedNodeMap,NodeList).

Document接口

Document接口继承自Node,表示整个HTML文档,从概念上讲,Document是文档树的根,并提供对文档数据的基本访问.
使用该接口定义的方法,可以使用documentElement属性获取文档的根节点,也可以使用doctype属性获取文档的类型声明,还可以创建各种类型的节点,然后将这些节点添加到文档树,所创建的属性一般都有ownerDocument属性(该属性从Node接口继承),该属性将节点对象与创建这些对象的Document关联起来.

  1. 创建新节点
    doucument对象具有一些用于创建不同节点类型所需的createXXX()方法,使用这些方法便可以轻松创建该节点,下面列出的方法需要填充名称和创建其他参数以创建相应的节点,其语法格式如下:
oElementNode=document.createElement(sTagName);
oTextNode=document.createTextNode(sTextName);
oAttribute=document.createAttribute(sName);
oComment=document.createCommnet(sData);
oNewDoc=document.createDocumnetGragment();
  1. 成员简介

Documnet定义的属性成员和方法成员分别如下表所示:

属性名 描述
doctype 文档类型声明
documentElement 获取文档根元素
implementation 取得DOMImplementation对象用于处理文档
方法名 描述
createAttribute() 创建属性节点
createAttributeNS() 创建一个属性节点,并且该属性节点和一个命名空间相关联
createCDATASection() 创建cdata节点
createComment() 创建注释节点
createDocumentFragement() 创建文档片段
createElement() 创建元素节点
createElementNS() 创建元素节点,并且该元素节点和一个命名空间相关联
createEntityReference() 创建实体引用节点
createProcessingInstruction() 创建PI节点
createTextNode() 创建文本节点
getElementById() 根据ID属性搜索一个元素
getElementsByTagName() 根据标签名搜索所有元素
getElementsByTagNameNS() 根据特定命名空间内的标签搜索所有元素
importNode() 导入一个节点到当前元素

Attr接口

Attr接口表示Element对象中的属性节点,一个Attr对象就是一个属性节点.
可以使用Element接口的getAttributeNode()/getAttributeNodeNS()方法获取一个指定的属性节点,而后使用Attr接口定义的方法读取属性.
图片是在W3c找到的
注意:由于Attr节点实际不是Element的子节点,因此DOM不会将它们看作文档树的一部分,因此,当对Attr对象调用Node接口继承属性parentNode/perviousSibling/nextSilbing时,会返回null.
其余节点就不一一结束了,可以去w3cschool看详细介绍
W3C

猜你喜欢

转载自blog.csdn.net/qq_44858021/article/details/90180449
今日推荐