`
zuoguodong
  • 浏览: 2624 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多
原帖:http://lijunabc.iteye.com/blog/723708 (感谢lijunabc)
1.节点(node)层次

Document--最顶层的节点,所有的其他节点都是附属于它的。
DocumentType--DTD引用(使用<!DOCTYPE>语法)的对象表现形式,它不能包含子节点。
DocumentFragment--可以像Document一样来保存其他节点。
Element--表示起始标签和结束标签之间的内容,例如<tag></tab>或者<tag/>。这是唯一可以同时包含特性和子节点的节点类型。
Attr--代表一对特性名和特性值。这个节点类型不能包含子节点。
Text--代表XML文档中的在起始标签和结束标签之间,或者CDataSection内包含的普通文本。这个节点类型不能包含子节点。
CDataSection--<![CDATA[]]>的对象表现形式。这个节点类型仅能包含文本节点Text作为子节点。
Entity--表示在DTD中的一个实体定义,例如<!ENTITY foo"foo">。这个节点类型不能包含子节点。
EntityReference--代表一个实体引用,例如&quot;。这个节点类型不能包含子节点。
ProcessingInstruction--代表一个PI。这个节点类型不能包含子节点。
Comment--代表XML注释。这个节点不能包含子节点。
Notation--代表在DTD中定义的记号。这个很少用到。

Node接口定义了所有节点类型都包含的特性和方法。


特性/方法                      类型/返回类型                说明

nodeName                    String                节点的名字;根据节点的类型而定义
nodeValue                     String                节点的值;根据节点的类型而定义
nodeType                      Number            节点的类型常量值之一
ownerDocument             Document          指向这个节点所属的文档
firstChild                        Node                 指向在childNodes列表中的第一个节点
lastChild                        Node                指向在childNodes列表中的最后一个节点
childNodes                    NodeList          所有子节点的列表
parentNode                   Node               该节点的父节点
previousSibling              Node                指向前一个兄弟节点;如果这个节点就是第一个兄弟节点,那么该值为null
nextSibling                     Node               指向后一个兄弟节点;如果这个节点就是最后一个兄弟节点,那么该值为null
hasChildNodes()            Boolean           当childNodes包含一个或多个节点时,返回真
attributes                       NamedNodeMap    包含了代表一个元素的特性的Attr对象;仅用于Element节点
appendChild(node)         Node              将node添加到childNodes的末尾
removeChild(node)         Node              从childNodes中删除node
replaceChild(newnode,oldnode)     Node           将childNodes中的oldnode替换成newnode
insertBefore(newnode,refnode)    Node          在childNodes中的refnode之前插入newnodd
getAttribute(name)--等于attributes.getNamedItem(name).value;
setAttribute(name,newvalue)--等于 attribute.getNamedItem(name).value=newvalue;
removeAttribute(name)--等于attribute.removeNamedItem(name)。

除节点外,DOM还定义了一些助手对象,它们可以和节点一起使用,但不是DOM文档必有的部分。


NodeList--节点数组,按照数值进行索引;用来表示和一个元素的子节点。
NamedNodeMap--同时使用数值和名字进行索引的节点表;用于表示元素特性。

2.访问相关的节点
下面的几节中考虑下面的HTML页面

1<html>
2    <head>
3        <title>DOM Example</title>
4    </head>
5    <body>
6        <p>Hello World!</p>
7        <p>Isn't this exciting?</p>
8        <p>You're learning to use the DOM!</p>
9    </body>
10</html>

要访问<html/>元素(你应该明白这是该文件的document元素),你可以使用document的 documentElement特性:
var oHtml = document.documentElement;
现在变量oHtml包含一个表示<html/>的HTMLElement对象。如果你想取得<head/>和<body />元素,下面的可以实现:
var oHead = oHtml.firstChild;
var oBody = oHtml.lastChild;
也可以使用childNodes特性来完成同样的工作。只需把它当成普通的javascript array,使用方括号标记:
var oHead = oHtml.childNodes[0];
var oBody = oHtml.childNodes[1];
注意方括号标记其实是NodeList在javascript中的简便实现。实际上正式的从childNodes列表中获取子节点的方法是使用 item()方法:
var oHead = oHtml.childNodes.item(0);
var oBody = oHtml.childNodes.item(1);
HTML DOM页定义了document.body作为指向<body/>元素的指针。
var oBody = ducument.body;
有了oHtml,oHead和oBody这三个变量,就可以尝试确定它们之间的关系:
alert(oHead.parentNode==oHtml);
alert(oBody.parentNode==oHtml);
alert(oBody.previousSibling==oHead);
alert(bHead.nextSibling==oBody);
alert(oHead.ownerDocument==document);
以上均outputs "true"。

3.处理特性
正如前面所提到的,即便Node接口已具有attributes方法,且已被所有类型的节点继承,然而,只有
Element节点才能有特性。Element节点的attributes属性其实是NameNodeMap,它提供一些用于访问和处理其内容的方法:
getNamedItem(name)--返回nodename属性值等于name的节点;
removeNamedItem(name)--删除nodename属性值等于name的节点;
setNamedItem(node)--将node添加到列表中,按其nodeName属性进行索引;
item(pos)--像NodeList一样,返回在位置pos的节点;
注:请记住这些方法都是返回一个Attr节点,而非特性值。

NamedNodeMap对象也有一个length属性来指示它所包含的节点的数量。
当NamedNodeMap用于表示特性时,其中每个节点都是Attr节点,这的nodeName属性被设置为特性名称,而nodeValue属性被设置为特性的值。例如,假设有这样一个元素:
<p style="color:red" id="p1">Hello world!</p>
同时,假设变量oP包含指向这个元素的一个引用。于是可以这样访问id特性的值:
var sId = oP.attributes.getNamedItem("id").nodeValue;
当然,还可以用数值方式访问id特性,但这样稍微有些不直观:
var sId = oP.attributes.item(1).nodeValue;
还可以通过给nodeValue属性赋新值来改变id特性:
oP.attributes.getNamedItem("id").nodeValue="newId";
Attr节点也有一个完全等同于(同时也完全同步于)nodeValue属性的value属性,并且有name属性和nodeName属性保持同步。我们可以随意使用这些属性来修改或变更特性。
因为这个方法有些累赘,DOM又定义了三个元素方法来帮助访问特性:
getAttribute(name)--等于attributes.getNamedItem(name).value;
setAttribute(name,newvalue)--等于 attribute.getNamedItem(name).value=newvalue;
removeAttribute(name)--等于attribute.removeNamedItem(name)。

4.访问指定节点
(1) getElementsByTagName()
核 心(XML) DOM定义了getElementsByTagName()方法,用来返回一个包含所有的tagName(标签名)特性等于某个指定值的元素的 NodeList。在Element对象中,tagName特性总是等于小于号之后紧跟随的名称--例如,<img />的tagName是"img"。下一行代码返回文档中所有<img />元素的列表:
var oImgs = document.getElementsByTagName("img");
把所有图形都存于oImgs后,只需使用方括号或者Item()方法(getElementsByTagName()返回一个和childNodes一样的NodeList),就可以像访问子节点那样逐个访问这些节点了:
alert(oImgs[0].tagName);      //outputs "IMG"
假如只想获取在某个页面第一个段落的所有图像,可以通过对第一个段落元素调用getElementsByTagName()来完成,像这样:
var oPs = document.getElementByTagName("p");
var oImgsInp = oPs[0].getElementByTagName("img");
可以使用一个星号的方法来获取document中的所有元素:
var oAllElements = document.getElementsByTagName("*");
当参数是一个星号的时候,IE6.0并不返回所有的元素。必须使用document.all来替代它。
(2) getElementsByName()
HTML DOM 定义了getElementsByName(),这用来获取所有name特性等于指定值的元素的。
(3)g etElementById()
这是HTML DOM定义的第二种方法,它将返回id特性等于指定值的元素。在HTML中,id特性是唯一的--这意味着没有两个元素可以共享同一个id。毫无疑问这是从文档树中获取单个指定元素最快的方法。
注:如果给定的ID匹配某个元素的name特性,IE6.0还会返回这个元素。这是一个bug,也是必须非常小心的一个问题。

5.节点操作
最常用到的几个方法是
createDocumentFragment()--创建文档碎片节点
createElement(tagname)--创建标签名为tagname的元素
createTextNode(text)--创建包含文本text的文本节点

createElement()、createTextNode()、appendChild()



Js代码
<html>  
<head>  
<title>createElement() Example</title>  
<script type="text/javascript">  
function createMessage() {  
    var oP = document.createElement("p");  
    var oText = document.createTextNode("Hello World!");  
    oP.appendChild(oText)  
    document.body.appendChild(oP);  
}  
</script>  
</head>  
<body onload="createMessage()">  
</body>  
</html> 

<html>
<head>
<title>createElement() Example</title>
<script type="text/javascript">
function createMessage() {
    var oP = document.createElement("p");
    var oText = document.createTextNode("Hello World!");
    oP.appendChild(oText)
    document.body.appendChild(oP);
}
</script>
</head>
<body onload="createMessage()">
</body>
</html> 




removeChild()
删除节点


Js代码
<html>  
<head>  
<title>removeChild() Example</title>  
<script type="text/javascript">  
function removeMessage() {  
       var oP = document.body.getElementsByTagName("p")[0];  
       oP.parentNode.removeChild(oP);  
}  
</script>  
</head>  
<body onload="removeMessage()">  
<p>Hello World!</p>  
</body>  
</html> 

<html>
<head>
<title>removeChild() Example</title>
<script type="text/javascript">
function removeMessage() {
       var oP = document.body.getElementsByTagName("p")[0];
       oP.parentNode.removeChild(oP);
}
</script>
</head>
<body onload="removeMessage()">
<p>Hello World!</p>
</body>
</html>
 



replaceChild()
替换


Js代码
<SPAN><html>  
<head>  
<title>replaceChild() Example</title>  
<script type="text/javascript">  
function replaceMessage() {  
     var oNewP = document.createElement("p");  
    var oText = document.createTextNode("Hello Universe!");  
    oNewP.appendChild(oText);  
      var oOldP = document.body.getElementsByTagName("p")[0];  
      oOldP.parentNode.replaceChild(oNewP, oOldP);  
}  
</script>  
</head>  
<body onload="replaceMessage()">  
<p>Hello World!</p>  
</body>  
</html</SPAN>  


<html>
<head>
<title>replaceChild() Example</title>
<script type="text/javascript">
function replaceMessage() {
     var oNewP = document.createElement("p");
    var oText = document.createTextNode("Hello Universe!");
    oNewP.appendChild(oText);
      var oOldP = document.body.getElementsByTagName("p")[0];
      oOldP.parentNode.replaceChild(oNewP, oOldP);
}
</script>
</head>
<body onload="replaceMessage()">
<p>Hello World!</p>
</body>
</html
>
 


insertBefore()
新消息添加到旧消息之前


Java代码
<SPAN><html>  
<head>  
<title>insertBefore() Example</title>  
<script type="text/javascript">  
function insertMessage() {  
    var oNewP = document.createElement("p");  
    var oText = document.createTextNode("Hello Universe!");  
    oNewP.appendChild(oText);  
     var oOldP = document.getElementsByTagName("p")[0];  
     document.body.insertBefore(oNewP, oOldP);  
}  
</script>  
</head>  
<body onload="insertMessage()">  
<p>Hello World!</p>  
</body>  
</html></SPAN> 

<html>
<head>
<title>insertBefore() Example</title>
<script type="text/javascript">
function insertMessage() {
    var oNewP = document.createElement("p");
    var oText = document.createTextNode("Hello Universe!");
    oNewP.appendChild(oText);
     var oOldP = document.getElementsByTagName("p")[0];
     document.body.insertBefore(oNewP, oOldP);
}
</script>
</head>
<body onload="insertMessage()">
<p>Hello World!</p>
</body>
</html>

 



createDocumentFragment()
一旦把节点添加到document.body(或 者它的后代节点)中,页面就会更新并反映出这个变化。对于少量的更新,这是很好的,然而,当要向document添加大量数据时,如果逐个添加这些变动, 这个过程有可能会十分缓慢。为解决这个问题,可以创建一个文档碎片,把所有的新节点附加其上,然后把文档碎片的内容一次性添加到document中,假如 想创建十个新段落


Js代码
<SPAN><html>  
<head>  
<title>insertBefore() Example</title>  
<script type="text/javascript">  
function addMessages() {  
    var arrText = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"];  
     var oFragment = document.createDocumentFragment();  
    for (var i=0; i < arrText.length; i++) {  
     var oP = document.createElement("p");  
    var oText = document.createTextNode(arrText[i]);  
       oP.appendChild(oText);  
       oFragment.appendChild(oP);  
}  
 
      document.body.appendChild(oFragment);  
 
}  
</script>  
</head>  
<body onload="addMessages()">  
</body>  
</html></SPAN> 

<html>
<head>
<title>insertBefore() Example</title>
<script type="text/javascript">
function addMessages() {
    var arrText = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"];
     var oFragment = document.createDocumentFragment();
    for (var i=0; i < arrText.length; i++) {
     var oP = document.createElement("p");
    var oText = document.createTextNode(arrText[i]);
       oP.appendChild(oText);
       oFragment.appendChild(oP);
}

      document.body.appendChild(oFragment);

}
</script>
</head>
<body onload="addMessages()">
</body>
</html>

 



6.让特性像属性一样
大部分情况下,HTML DOM元素中包含的所有特性都是可作为属性。
假设有如下图像元素:
<img src = "mypicture.jpg" border=0 />
如果要使用核心的DOM来获取和设置src和border特性,那么要用getAttribute()和setAttribute()方法:
alert(oImg.getAttribute("src"));
alert(oImg.getAttribute("border"));
oImg.setAttribute("src","mypicture2.jpg");
oImg.setAttribute("border",1);
然而,使用HTML DOM,可以使用同样名称的属性来获取和设置这些值:
alert(oImg.src);
alert(oImg.border);
oImg.src="mypicture2.jpg";
oImg.border ="1";
唯一的特性名和属性名不一样的特例是class属性,它是用来指定应用于某个元素的一个CSS类,因为class在ECMAScript中是一个保留字,在javascript中,它不能被作为变量名、属性名或都函数名。于是,相应的属性名就变成了className;
注:IE在setAttribute()上有很大的问题,最好尽可能使用属性。

7.table方法
为了协助建立表格,HTML DOM给<table/>,<tbody/>和<tr/>等元素添加了一些特性和方法。
给<table/>元素添加了以下内容:
特性/方法                             说明
caption                                指向<caption/>元素并将其放入表格
tBodies                               <tbody/>元素的集合
tFoot                                  指向<tfoot/>元素(如果存在)
tHead                                 指向<thead/>元素(如果存在)
rows                                   表格中所有行的集合
createTHead()                      创建<thead/>元素并将其放入表格
createTFood()                       创建<tfoot/>元素并将其放入表格
createCpation()                   创建<caption/>元素并将其放入表格
deleteTHead()                       删除<thead/>元素
deleteTFood()                      删除<tfoot/>元素
deleteCaption()                    删除<caption/>元素
deleteRow(position)               删除指定位置上的行
insertRow(position)               在rows集合中的指定位置上插入一个新行

<tbody/>元素添加了以下内容
特性/方法                             说明
rows                                  <tbody/> 中所有行的集合
deleteRow(position)             删除指定位置上的行
insertRow(position)              在rows集合中的指定位置上插入一个新行

<tr/>元素添加了以下内容
特性/方法                             说明
cells <tr/>                           元素中所有的单元格的集合
deleteCell(postion)               删除给定位置上的单元格
insertCell(postion)                在cells集合的给点位置上插入一个新的单元格

8.遍历DOM
NodeIterator,TreeWalker
DOM Level2的功能,这些功能只有在Mozilla和Konqueror/Safari中才有,这里就不介绍了


分享到:
评论

相关推荐

    firefox DOM Inspector 火狐 dom 查看器插件 天涯浪子

    DOM Inspector是Mozilla Firefox的一个扩充套件,官方中文版上称之为DOM观察器,在安装Mozilla Firefox时,可以在自订安装中选择是否安装DOM Inspector,如果在安装Mozilla Firefox时没有选择自订安装以安装DOM ...

    dom4j-2.1.1-API文档-中文版.zip

    赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...

    dom4j-2.1.1-API文档-中英对照版.zip

    赠送jar包:dom4j-2.1.1.jar; 赠送原API文档:dom4j-2.1.1-javadoc.jar; 赠送源代码:dom4j-2.1.1-sources.jar; 赠送Maven依赖信息文件:dom4j-2.1.1.pom; 包含翻译后的API文档:dom4j-2.1.1-javadoc-API文档-...

    删除DOM节点 删除DOM节点

    删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点删除DOM节点...

    资源jar包dom4j-1.6.1.rar

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    vue如何判断dom的class

    vue点击给dom添加class然后获取含有class的dom (item,index2) key=index2 ref=chosebox&gt; &lt;p&gt;{{item.name}} &lt;dt v-for=(item2,index) in item.childsCurGoods :key=item2.id :class=index==iac[index2]?'check'...

    DOM编辑器用于JSP

    DOM是一种独立于语言和平台的XML解析模型。给出了支持DOM核心模型和多种DOM扩展规范的XML编辑器ONCEXMLEditor的实现。ONCEXMLEditor具有高效的XML验证和序列化性能,同时提供给用户多种功能,包括按需遍历文档、提供上...

    HTML DOM基础教程(网页形式)

    DOM 首页 DOM 简介 DOM 节点 DOM 节点树 DOM 节点访问 DOM 节点信息 DOM How To DOM 参考 DOM 总结 DOM 实例 DOM 实例 DOM 对象 DOM Window DOM Navigator DOM Screen DOM History DOM Location DOM ...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    DOM4J jar包 所有的包 xml解析 dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1 导入直接使用

    JavaEE源代码 dom4j-1.6.1

    JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源代码 dom4j-1.6.1JavaEE源...

    JavaScript DOM编程艺术(中文第2版)

    第1章 JavaScript简史 1.1 JavaScript的起源 1.2 DOM 1.3 浏览器战争 1.3.1 DHTML 1.3.2 浏览器之间的冲突 1.4 制定标准 1.4.1 浏览器以外的考虑 1.4.2 浏览器战争的结局 1.4.3 崭新的起点 1.5 小结 第2章 ...

    Dom4j_使用简介

    Dom4j_使用简介DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义: Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java ...

    使用dom4j 和本地dom 解析xml 文件

    使用dom4j 和本地dom 解析xml 文件

    dom4j_dom4j1.6.1安装包_

    maven dom4j 1.6.1安装包

    dom4j-1.6.1 + w3cschool.CHM离线帮助文档

    dom4j 目录的介绍: 1)docs 是文档目录 2)如何查 Dom4j 的文档 3)Dom4j 快速入门 2)lib 目录 3)src 目录是第三方类库的源码目录: 可进我的博客看文章 javaweb-05xml 第三节部分 早期 JDK 为我们提供了两种 ...

    Dom4j 1.6.1 JAVA API

    dom4j帮助文档 官方API All Classes Packages org.dom4j org.dom4j.bean org.dom4j.datatype org.dom4j.dom org.dom4j.dtd org.dom4j.io org.dom4j.jaxb org.dom4j.rule org.dom4j.rule.pattern org.dom...

    xml 三种解析方式dom,sax,dom4j

    xml 三种解析方式dom,sax,dom4j 内涵jar包,xml我默认放在本地D盘的。 三种方式的代码,我自己看别人代码总结。

    dom4j dom4j dom4j dom4j

    dom4j dom4j dom4j dom4j dom4j dom4j

    dom手册,js dom api,java dom api

    dom api手册,javascript dom,js dom,java dom

    dom4j-1.6.1 与 dom4j-2.0.0-ALPHA

    dom4j-1.6.1.zip与 dom4j-2.0.0-ALPHA-2.jar

Global site tag (gtag.js) - Google Analytics