`
younglibin
  • 浏览: 1214242 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dom属性实例

    博客分类:
  • js
阅读更多

文档对象模型(DOM)是表示文档(比如HTML和XML)和访问、操作构成文档的各种元素的应用程序接口(API)。一般的,支持Javascript的所有浏览器都支持DOM。本文所涉及的DOM,是指W3C定义的标准的文档对象模型,它以树形结构表示HTML和XML文档,定义了遍历这个树和检查、修改树的节点的方法和属性。

7.4.1、DOM眼中的HTML文档:树
  在DOM眼中,HTML跟XML一样是一种树形结构的文档,<html>是根(root)节点,<head>、<title>、<body>是<html>的子(children)节点,互相之间是兄弟(sibling)节点;<body>下面才是子节点<table>、<span>、<p>等等。如下图:

  

  这个是不是跟XML的结构有点相似呢。不同的是,HTML文档的树形主要包含表示元素、标记的节点和表示文本串的节点。

7.4.2、HTML文档的节点
  DOM下,HTML文档各个节点被视为各种类型的Node对象。每个Node对象都有自己的属性和方法,利用这些属性和方法可以遍历整个文档树。由于HTML文档的复杂性,DOM定义了nodeType来表示节点的类型。这里列出Node常用的几种节点类型:
接口 nodeType常量 nodeType值 备注
Element Node.ELEMENT_NODE 1 元素节点
Text Node.TEXT_NODE 3 文本节点
Document Node.DOCUMENT_NODE 9 document
Comment Node.COMMENT_NODE 8 注释的文本
DocumentFragment Node.DOCUMENT_FRAGMENT_NODE 11 document片断
Attr Node.ATTRIBUTE_NODE 2 节点属性

  DOM树的根节点是个Document对象,该对象的documentElement属性引用表示文档根元素的Element对象(对于HTML文档,这个就是<html>标记)。Javascript操作HTML文档的时候,document即指向整个文档,<body>、<table>等节点类型即为Element。Comment类型的节点则是指文档的注释。具体节点类型的含义,请参考《Javascript权威指南》,在此不赘述。

  Document定义的方法大多数是生产型方法,主要用于创建可以插入文档中的各种类型的节点。常用的Document方法有:

方法 描述
createAttribute() 用指定的名字创建新的Attr节点。
createComment() 用指定的字符串创建新的Comment节点。
createElement() 用指定的标记名创建新的Element节点。
createTextNode() 用指定的文本创建新的TextNode节点。
getElementById() 返回文档中具有指定id属性的Element节点。
getElementsByTagName() 返回文档中具有指定标记名的所有Element节点。

  对于Element节点,可以通过调用getAttribute()、setAttribute()、removeAttribute()方法来查询、设置或者删除一个Element节点的性质,比如<table>标记的border属性。下面列出Element常用的属性:

属性 描述
tagName 元素的标记名称,比如<p>元素为P。HTML文档返回的tabName均为大写。

  Element常用的方法:

方法 描述
getAttribute() 以字符串形式返回指定属性的值。
getAttributeNode() 以Attr节点的形式返回指定属性的值。
getElementsByTabName() 返回一个Node数组,包含具有指定标记名的所有Element节点的子孙节点,其顺序为在文档中出现的顺序。
hasAttribute() 如果该元素具有指定名字的属性,则返回true。
removeAttribute() 从元素中删除指定的属性。
removeAttributeNode() 从元素的属性列表中删除指定的Attr节点。
setAttribute() 把指定的属性设置为指定的字符串值,如果该属性不存在则添加一个新属性。
setAttributeNode() 把指定的Attr节点添加到该元素的属性列表中。

  Attr对象代表文档元素的属性,有name、value等属性,可以通过Node接口的attributes属性或者调用Element接口的getAttributeNode()方法来获取。不过,在大多数情况下,使用Element元素属性的最简单方法是getAttribute()和setAttribute()两个方法,而不是Attr对象。

7.4.3、使用DOM操作HTML文档
  Node对象定义了一系列属性和方法,来方便遍历整个文档。用parentNode属性和childNodes[]数组可以在文档树中上下移动;通过遍历childNodes[]数组或者使用firstChild和nextSibling属性进行循环操作,也可以使用lastChild和previousSibling进行逆向循环操作,也可以枚举指定节点的子节点。而调用appendChild()、insertBefore()、removeChild()、replaceChild()方法可以改变一个节点的子节点从而改变文档树。

  需要指出的是,childNodes[]的值实际上是一个NodeList对象。因此,可以通过遍历childNodes[]数组的每个元素,来枚举一个给定节点的所有子节点;通过递归,可以枚举树中的所有节点。下表列出了Node对象的一些常用属性和方法:

  Node对象常用属性:

属性 描述
attributes 如果该节点是一个Element,则以NamedNodeMap形式返回该元素的属性。
childNodes 以Node[]的形式存放当前节点的子节点。如果没有子节点,则返回空数组。
firstChild 以Node的形式返回当前节点的第一个子节点。如果没有子节点,则为null。
lastChild 以Node的形式返回当前节点的最后一个子节点。如果没有子节点,则为null。
nextSibling 以Node的形式返回当前节点的兄弟下一个节点。如果没有这样的节点,则返回null。
nodeName 节点的名字,Element节点则代表Element的标记名称。
nodeType 代表节点的类型。
parentNode 以Node的形式返回当前节点的父节点。如果没有父节点,则为null。
previousSibling 以Node的形式返回紧挨当前节点、位于它之前的兄弟节点。如果没有这样的节点,则返回null。

  Node对象常用方法:

方法 描述
appendChild() 通过把一个节点增加到当前节点的childNodes[]组,给文档树增加节点。
cloneNode() 复制当前节点,或者复制当前节点以及它的所有子孙节点。
hasChildNodes() 如果当前节点拥有子节点,则将返回true。
insertBefore() 给文档树插入一个节点,位置在当前节点的指定子节点之前。如果该节点已经存在,则删除之再插入到它的位置。
removeChild() 从文档树中删除并返回指定的子节点。
replaceChild() 从文档树中删除并返回指定的子节点,用另一个节点替换它。

  接下来,让我们使用上述的DOM应用编程接口,来试着操作HTML文档。

  A、遍历文档的节点

  DOM把一个HTML文档视为树,因此,遍历整个树是应该是家常便饭。跟之前说过的一样,这里我们提供两个遍历树的例子。通过它,我们能够学会如何使用childNodes[]和firstChile、lastChild、nextSibling、previousSibling遍历整棵树。

  例子1-- sample3_1.htm:
  这个例子使用了childNodes[]和递归方式来遍历整个文档,统计文档中出现的Element元素总数,并把Element标记名全部打印出来。需要特别注意的是,在使用DOM时,必须等文档被装载完毕再执行遍历等行为操作文档。sample3_1.htm具体代码如下:

 


开始统计

  例子2 – sample3_2.htm:
  接下来使用firstChile、lastChild、nextSibling、previousSibling遍历整个文档树。修改一下countTotalElement函数,其他跟sample3_1.htm一样:

function countTotalElement(node) { //参数node是一个Node对象 var total = 0; if(node.nodeType == 1) { //检查node是否为Element对象  total++;   //如果是,计数器加1  elementName = elementName + node.tagName + ""; //保存标记名 } var childrens = node.childNodes;  //获取node的全部子节点 for(var m=node.firstChild; m!=null;m=m.nextSibling) {  total += countTotalElement(m); //在每个子节点上进行递归操作 } return total;}

  B、搜索文档中特定的元素
  在使用DOM的过程中,有时候需要定位到文档中的某个特定节点,或者具有特定类型的节点列表。这种情况下,可以调用Document对象的getElementsByTagName()和getElementById()方法来实现。

  document.getElementsByTagName()返回文档中具有指定标记名的全部Element节点数组(也是NodeList类型)。Element出现在数组中的顺序就是他们在文档中出现的顺序。传递给getElementsByTagName()的参数忽略大小写。比如,想定位到第一个<table>标记,可以这样写:document.getElementsByTagName(“table”)[0]。例外的,可以使用document.body定位到<body>标记,因为它是唯一的。

  getElementsByTagName()返回的数组取决于文档。一旦文档改变,返回结果也立即改变。相比,getElementById()则比较灵活,可以随时定位到目标,只是要实现给目标元素一个唯一的id属性值。这个我们在《AJAX开发简略》的“级联菜单”例子中已经使用过了。

  Element对象也支持getElementsByTagName()和getElementById()。不同的是,搜索领域只针对调用者的子节点。

  C、修改文档内容
  遍历整棵文档树、搜索特定的节点,我们最终目的之一是要修改文档内容。接下来的三个例子将使用Node的几个常用方法,来演示如何修改文档内容。

  例子3 -- sample4_1.htm:
  这个例子包含三个文本节点和一个按钮。点击按钮后,三个文本节点和按钮的顺序将被颠倒。程序使用了Node的appendChild()和removeChild()方法。

 


第一行

第二行

第三行

 

  例子4-- sample4_2.htm:
  例子1通过直接操作body的子节点来修改文档。在HTML文档中,布局和定位常常通过表格<table>来实现。因此,例子4将演示操作表格内容,将表格的四个单元行顺序颠倒。如果没有使用<tbody>标签,则<table>把全部的<tr>当做是属于一个子节点<tbody>,所以我们采用数组缓存的方式,把行数据颠倒一下。这个例子同时也演示了如何使用DOM创建表格单元行。

 


第一行
第二行
第三行
第四行

 

  例子5 -- sample4_3.htm:
  正如我们在Node节点介绍部分所指出的那样,appendChild()、replaceChild()、removeChild()、insertBefore()方法会立即改变文档的结构。下面的例子包含两个表格,我们试着把表格二的内容替换表格一的内容。

 


表格一
表格二

 

  注意,当执行kid1.replaceChild(repKid,kid1.firstChild);的时候,table2的子节点已经被转移到table1了,table2已经没有子节点,不能再调用table2的子节点。看看代码的注释,试着运行一下,应该就知道文档是怎么改变的了。

  D、往文档添加新内容
  在学会遍历、搜索、修改文档之后,我们现在试着网文档添加新的内容。其实没有什么新意,只是利用我们上述提到的Node的属性和方法而已,还是操作<table>标记的内容。有新意的是,我们要实现一个留言簿。是的,留言簿,你可以往里面留言,只是不能刷新噢。

  例子6 – sample5_1.htm:

 


网友留言列表:

  我们之前说过,<table>的子节点是<tbody>,<tbody>的子节点才是<tr>,<tr>是<td>的父节点,最后<td>内部的TextNode节点。所以,往<table>增加单元格行要逐级形成,就像往树里面添加一个枝桠一样,要有叶子有径。看看,这个留言簿是不是很简单啊。这个例子同时也演示了往<table>表格标记里面增加内容的另一种方法。


  E、使用DOM操作XML文档
  在数据表示方面,XML文档更加结构化。DOM在支持HTML的基础上提供了一系列的API,支持针对XML的访问和操作。利用这些API,我们可以从XML中提取信息,动态的创建这些信息的HTML呈现文档。处理XML文档,通常遵循“加载XML文档à提取信息à加工信息à创建HTML文档”的过程。下面的例子演示了如何加载并处理XML文档。

  这个例子包含两个JS函数。loadXML()负责加载XML文档,其中既包含加载XML文档的2级DOM代码,又有实现同样操作的Microsoft专有API代码。需要提醒注意的是,文档加载过程不是瞬间完成的,所以对loadXML()的调用将在加载文档完成之前返回。因此,需要传递给loadXML()一个引用,以便文档加载完成后调用。

  例子中的另外一个函数makeTable(),则在XML文档加载完毕之后,使用最后前介绍过的DOM应用编程接口读取XML文档信息,并利用这些信息形成一个新的table表格。

  例子7 -- sample6_1.htm:

 




供读取调用的XML文档 – employees.xml   Programmer  32768    Sales  70000    CEO  100000 

文档对象模型(DOM)是表示文档(比如HTML和XML)和访问、操作构成文档的各种元素的应用程序接口(API)。一般的,支持Javascript的所有浏览器都支持DOM。本文所涉及的DOM,是指W3C定义的标准的文档对象模型,它以树形结构表示HTML和XML文档,定义了遍历这个树和检查、修改树的节点的方法和属性。

7.4.1、DOM眼中的HTML文档:树
  在DOM眼中,HTML跟XML一样是一种树形结构的文档,<html>是根(root)节点,<head>、<title>、<body>是<html>的子(children)节点,互相之间是兄弟(sibling)节点;<body>下面才是子节点<table>、<span>、<p>等等。如下图:

  

  这个是不是跟XML的结构有点相似呢。不同的是,HTML文档的树形主要包含表示元素、标记的节点和表示文本串的节点。

7.4.2、HTML文档的节点
  DOM下,HTML文档各个节点被视为各种类型的Node对象。每个Node对象都有自己的属性和方法,利用这些属性和方法可以遍历整个文档树。由于HTML文档的复杂性,DOM定义了nodeType来表示节点的类型。这里列出Node常用的几种节点类型:

接口 nodeType常量 nodeType值 备注
Element Node.ELEMENT_NODE 1 元素节点
Text Node.TEXT_NODE 3 文本节点
Document Node.DOCUMENT_NODE 9 document
Comment Node.COMMENT_NODE 8 注释的文本
DocumentFragment Node.DOCUMENT_FRAGMENT_NODE 11 document片断
Attr Node.ATTRIBUTE_NODE 2 节点属性

  DOM树的根节点是个Document对象,该对象的documentElement属性引用表示文档根元素的Element对象(对于HTML文档,这个就是<html>标记)。Javascript操作HTML文档的时候,document即指向整个文档,<body>、<table>等节点类型即为Element。Comment类型的节点则是指文档的注释。具体节点类型的含义,请参考《Javascript权威指南》,在此不赘述。

  Document定义的方法大多数是生产型方法,主要用于创建可以插入文档中的各种类型的节点。常用的Document方法有:

方法 描述
createAttribute() 用指定的名字创建新的Attr节点。
createComment() 用指定的字符串创建新的Comment节点。
createElement() 用指定的标记名创建新的Element节点。
createTextNode() 用指定的文本创建新的TextNode节点。
getElementById() 返回文档中具有指定id属性的Element节点。
getElementsByTagName() 返回文档中具有指定标记名的所有Element节点。

  对于Element节点,可以通过调用getAttribute()、setAttribute()、removeAttribute()方法来查询、设置或者删除一个Element节点的性质,比如<table>标记的border属性。下面列出Element常用的属性:

属性 描述
tagName 元素的标记名称,比如<p>元素为P。HTML文档返回的tabName均为大写。

  Element常用的方法:

方法 描述
getAttribute() 以字符串形式返回指定属性的值。
getAttributeNode() 以Attr节点的形式返回指定属性的值。
getElementsByTabName() 返回一个Node数组,包含具有指定标记名的所有Element节点的子孙节点,其顺序为在文档中出现的顺序。
hasAttribute() 如果该元素具有指定名字的属性,则返回true。
removeAttribute() 从元素中删除指定的属性。
removeAttributeNode() 从元素的属性列表中删除指定的Attr节点。
setAttribute() 把指定的属性设置为指定的字符串值,如果该属性不存在则添加一个新属性。
setAttributeNode() 把指定的Attr节点添加到该元素的属性列表中。

  Attr对象代表文档元素的属性,有name、value等属性,可以通过Node接口的attributes属性或者调用Element接口的getAttributeNode()方法来获取。不过,在大多数情况下,使用Element元素属性的最简单方法是getAttribute()和setAttribute()两个方法,而不是Attr对象。

7.4.3、使用DOM操作HTML文档
  Node对象定义了一系列属性和方法,来方便遍历整个文档。用parentNode属性和childNodes[]数组可以在文档树中上下移动;通过遍历childNodes[]数组或者使用firstChild和nextSibling属性进行循环操作,也可以使用lastChild和previousSibling进行逆向循环操作,也可以枚举指定节点的子节点。而调用appendChild()、insertBefore()、removeChild()、replaceChild()方法可以改变一个节点的子节点从而改变文档树。

  需要指出的是,childNodes[]的值实际上是一个NodeList对象。因此,可以通过遍历childNodes[]数组的每个元素,来枚举一个给定节点的所有子节点;通过递归,可以枚举树中的所有节点。下表列出了Node对象的一些常用属性和方法:

  Node对象常用属性:

属性 描述
attributes 如果该节点是一个Element,则以NamedNodeMap形式返回该元素的属性。
childNodes 以Node[]的形式存放当前节点的子节点。如果没有子节点,则返回空数组。
firstChild 以Node的形式返回当前节点的第一个子节点。如果没有子节点,则为null。
lastChild 以Node的形式返回当前节点的最后一个子节点。如果没有子节点,则为null。
nextSibling 以Node的形式返回当前节点的兄弟下一个节点。如果没有这样的节点,则返回null。
nodeName 节点的名字,Element节点则代表Element的标记名称。
nodeType 代表节点的类型。
parentNode 以Node的形式返回当前节点的父节点。如果没有父节点,则为null。
previousSibling 以Node的形式返回紧挨当前节点、位于它之前的兄弟节点。如果没有这样的节点,则返回null。

  Node对象常用方法:

方法 描述
appendChild() 通过把一个节点增加到当前节点的childNodes[]组,给文档树增加节点。
cloneNode() 复制当前节点,或者复制当前节点以及它的所有子孙节点。
hasChildNodes() 如果当前节点拥有子节点,则将返回true。
insertBefore() 给文档树插入一个节点,位置在当前节点的指定子节点之前。如果该节点已经存在,则删除之再插入到它的位置。
removeChild() 从文档树中删除并返回指定的子节点。
replaceChild() 从文档树中删除并返回指定的子节点,用另一个节点替换它。

  接下来,让我们使用上述的DOM应用编程接口,来试着操作HTML文档。

  A、遍历文档的节点

  DOM把一个HTML文档视为树,因此,遍历整个树是应该是家常便饭。跟之前说过的一样,这里我们提供两个遍历树的例子。通过它,我们能够学会如何使用childNodes[]和firstChile、lastChild、nextSibling、previousSibling遍历整棵树。

  例子1-- sample3_1.htm:
  这个例子使用了childNodes[]和递归方式来遍历整个文档,统计文档中出现的Element元素总数,并把Element标记名全部打印出来。需要特别注意的是,在使用DOM时,必须等文档被装载完毕再执行遍历等行为操作文档。sample3_1.htm具体代码如下:

 


开始统计

  例子2 – sample3_2.htm:
  接下来使用firstChile、lastChild、nextSibling、previousSibling遍历整个文档树。修改一下countTotalElement函数,其他跟sample3_1.htm一样:

function countTotalElement(node) { //参数node是一个Node对象 var total = 0; if(node.nodeType == 1) { //检查node是否为Element对象  total++;   //如果是,计数器加1  elementName = elementName + node.tagName + ""; //保存标记名 } var childrens = node.childNodes;  //获取node的全部子节点 for(var m=node.firstChild; m!=null;m=m.nextSibling) {  total += countTotalElement(m); //在每个子节点上进行递归操作 } return total;}

  B、搜索文档中特定的元素
  在使用DOM的过程中,有时候需要定位到文档中的某个特定节点,或者具有特定类型的节点列表。这种情况下,可以调用Document对象的getElementsByTagName()和getElementById()方法来实现。

  document.getElementsByTagName()返回文档中具有指定标记名的全部Element节点数组(也是NodeList类型)。Element出现在数组中的顺序就是他们在文档中出现的顺序。传递给getElementsByTagName()的参数忽略大小写。比如,想定位到第一个<table>标记,可以这样写:document.getElementsByTagName(“table”)[0]。例外的,可以使用document.body定位到<body>标记,因为它是唯一的。

  getElementsByTagName()返回的数组取决于文档。一旦文档改变,返回结果也立即改变。相比,getElementById()则比较灵活,可以随时定位到目标,只是要实现给目标元素一个唯一的id属性值。这个我们在《AJAX开发简略》的“级联菜单”例子中已经使用过了。

  Element对象也支持getElementsByTagName()和getElementById()。不同的是,搜索领域只针对调用者的子节点。

  C、修改文档内容
  遍历整棵文档树、搜索特定的节点,我们最终目的之一是要修改文档内容。接下来的三个例子将使用Node的几个常用方法,来演示如何修改文档内容。

  例子3 -- sample4_1.htm:
  这个例子包含三个文本节点和一个按钮。点击按钮后,三个文本节点和按钮的顺序将被颠倒。程序使用了Node的appendChild()和removeChild()方法。

 


第一行

第二行

第三行

 

  例子4-- sample4_2.htm:
  例子1通过直接操作body的子节点来修改文档。在HTML文档中,布局和定位常常通过表格<table>来实现。因此,例子4将演示操作表格内容,将表格的四个单元行顺序颠倒。如果没有使用<tbody>标签,则<table>把全部的<tr>当做是属于一个子节点<tbody>,所以我们采用数组缓存的方式,把行数据颠倒一下。这个例子同时也演示了如何使用DOM创建表格单元行。

 


第一行
第二行
第三行
第四行

 

  例子5 -- sample4_3.htm:
  正如我们在Node节点介绍部分所指出的那样,appendChild()、replaceChild()、removeChild()、insertBefore()方法会立即改变文档的结构。下面的例子包含两个表格,我们试着把表格二的内容替换表格一的内容。

 


表格一
表格二

 

  注意,当执行kid1.replaceChild(repKid,kid1.firstChild);的时候,table2的子节点已经被转移到table1了,table2已经没有子节点,不能再调用table2的子节点。看看代码的注释,试着运行一下,应该就知道文档是怎么改变的了。

  D、往文档添加新内容
  在学会遍历、搜索、修改文档之后,我们现在试着网文档添加新的内容。其实没有什么新意,只是利用我们上述提到的Node的属性和方法而已,还是操作<table>标记的内容。有新意的是,我们要实现一个留言簿。是的,留言簿,你可以往里面留言,只是不能刷新噢。

  例子6 – sample5_1.htm:

 


网友留言列表:

  我们之前说过,<table>的子节点是<tbody>,<tbody>的子节点才是<tr>,<tr>是<td>的父节点,最后<td>内部的TextNode节点。所以,往<table>增加单元格行要逐级形成,就像往树里面添加一个枝桠一样,要有叶子有径。看看,这个留言簿是不是很简单啊。这个例子同时也演示了往<table>表格标记里面增加内容的另一种方法。


  E、使用DOM操作XML文档
  在数据表示方面,XML文档更加结构化。DOM在支持HTML的基础上提供了一系列的API,支持针对XML的访问和操作。利用这些API,我们可以从XML中提取信息,动态的创建这些信息的HTML呈现文档。处理XML文档,通常遵循“加载XML文档à提取信息à加工信息à创建HTML文档”的过程。下面的例子演示了如何加载并处理XML文档。

  这个例子包含两个JS函数。loadXML()负责加载XML文档,其中既包含加载XML文档的2级DOM代码,又有实现同样操作的Microsoft专有API代码。需要提醒注意的是,文档加载过程不是瞬间完成的,所以对loadXML()的调用将在加载文档完成之前返回。因此,需要传递给loadXML()一个引用,以便文档加载完成后调用。

  例子中的另外一个函数makeTable(),则在XML文档加载完毕之后,使用最后前介绍过的DOM应用编程接口读取XML文档信息,并利用这些信息形成一个新的table表格。

  例子7 -- sample6_1.htm: 

一 遍历文档节点总数

 

 

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>统计Element节点总数</title>
<script language="javascript">
<!--
var elementName = "";
function countTotalElement(node){
var total = 0;
if(node.nodeType == 1){
total ++;
elementName = elementName + node.tagName + "\r\n";
}
方法一
var childrens = node.childNodes;
for(var i = 0 ; i < childrens.length; i++){
total += countTotalElement(childrens[i]);
}
方法二
for(var m=node.firstChild; m!=null; m=m.nextSibling){
total += countTotalElement(m);
}

return total;
}
-->
</script>
</head>
<body>
<table width="364" border="1" cellpadding="0" cellspacing="0">
<form action="" name="form1" method="post">
  <tr>
    <td width="20%">&nbsp;用户名</td>
    <td width="80%">&nbsp;<input type="text" name="input1" value=""></td>
  </tr>
  <tr>
    <td>&nbsp;密码</td>
    <td>&nbsp;<input type="password" name="password1" value=""></td>
  </tr></form>
</table>
<a href="javascript:void(0)"  onClick="alert('标记总数:' + countTotalElement(document) + '\r\n 全部标记如下 \r\n' + elementName );elementName='';">开始统计</a>
</body>
</html>

二 搜索文档中特定的元素

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>定位HTML文档特定节点</title>
<script language="javascript">
<!--
function countTotal(){
var elements = document.getElementsByTagName("input");
window.alert("input类型节点总数是:" + elements.length);
}
function anchorElement(){
var element = document.getElementById("submit");
window.alert("控件的value是:" + element.value);
}
-->
</script>
</head>

<body>
<table width="364" border="1" cellpadding="0" cellspacing="0">
<form action="" name="form1" method="post">
  <tr>
    <td width="20%">&nbsp;用户名</td>
    <td width="80%">&nbsp;<input type="text" name="input1" value=""></td>
  </tr>
  <tr>
    <td>&nbsp;密码</td>
    <td>&nbsp;<input type="password" name="password1" value=""></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="Submit" value="提交"></td>
  </tr>
</form>
</table>
<a href="javascript:void(0);" onClick="countTotal();">统计input节点总数</a>
<a href="javascript:void(0);" onClick="anchorElement();">定位提交按钮</a>
</body>
</html>

三 修改文档内容

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>颠倒节点顺序</title>
<script language="javascript">
<!--
function reverseNode(node){
var kids = node.childNodes;
var kidsNum = kids.length;
for( var i=kidsNum - 1; i>=0;i--){
var c=node.removeChild(kids[i]);
node.appendChild(c);
}
}
-->
</script>
</head>

<body>
<p>第一行</p>
<p>第二行</p>
<p>第三行</p>
<input type="button" name="reverseNode" value="颠倒顺序" onclick="reverseNode(document.body)" />
</body>
</html>

实例二
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>颠倒表格行顺序</title>
<script language="javascript">
<!--
function reverserTable(){
var node = document.getElementsByTagName("table")[0];
var child = document.getElementsByTagName("tr");
var newChild = new Array();
for(var i=0;i<child.length;i++){
newChild[i]=child[i].firstChild.innerHTML;
}
node.removeChild(node.childNodes[0]);
var header=node.createTHead();
for(var i=0;i<newChild.length;i++){
var headerrow=header.insertRow(i);
var Cell=headerrow.insertCell(0);
Cell.appendChild(document.createTextNode(newChild[newChild.length-i-1]));
}
}
-->
</script>
</head>
<body>
<table width="200" border="0">
  <thead>
  <tr>
    <td>第一行</td>
  </tr>
  <tr>
    <td>第二行</td>
  </tr>
  <tr>
    <td>第三行</td>
  </tr>
  <tr>
    <td>第四行</td>
  </tr>
  </thead>
</table>
<input type="button" name="reverse" value="开始颠倒"  onClick="reverserTable();">
</body>
</html>

实例三
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>颠倒表格行顺序</title>
<script language="javascript">
<!--
function replaceContent(){
var table1 = document.getElementsByTagName("table")[0];
var table2 = document.getElementsByTagName("table")[1];
var kid1 = table1.firstChild.firstChild.firstChild;
var kid2 = table2.firstChild.firstChild.firstChild;
var repKid = kid2.firstChild;
try{
kid1.replaceChild(repKid,kid1.firstChild);
}
catch(e){
alert(e);
}
}
-->
</script>
</head>
<body>
<table width="200" border="0">
  <tbody>
  <tr>
    <td>表格一</td>
  </tr>
  </tbody>
</table>
<table width="200" border="0">
  <tbody>
  <tr>
    <td>表格二</td>
  </tr>
  </tbody>
</table>
<input type="button" name="reverse" value="开始颠倒"  onClick="replaceContent();">
</body>
</html>


四 往文档中添加新内容
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>添加表格内容</title>
<script language="javascript">
<!--
function insertStr(){
var f = document.form1;
var value = f.str.value;
var text = document.createTextNode(value);
var td = document.createElement("td");
var tr = document.createElement("tr");
var tbody = document.createElement("tbody");
td.appendChild(text);
tr.appendChild(td);
tbody.appendChild(tr);
var parNode = document.getElementById("table1");
parNode.insertBefore(tbody,parNode.firstChild);
}
-->
</script>
</head>
<body>
<form name="form1" method="post" action="">
<input type="text" id="str" name="str" value="" />
<input type="button" name="insert" value="留言" id="insert" onclick="insertStr();" />
</form>
<table width="400" border="0" cellspacing="0" cellpadding="0" id="table1">
<tbody>
  <tr>
    <td  height="25">网友留言列表:</td>
  </tr>
  </tbody>
</table>

</body>
</html>

五 使用DOM对象操作XML文档
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>加载XML文档</title>
<script language="javascript">
<!--
function loadXml(handler){
var url = "employees.xml";
if(document.implementation && document.implementation.createDocument){
var xmldoc = document.implementation.createDocument("","",null);
xmldoc.onload=handler(xmldoc,null);
xmldoc.load(url);
}
else if(window.ActiveXObject){
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.onreadystatechange=function(){
if(xmldoc.readyState==4)handler(xmldoc,url);
}
xmldoc.load(url);
}
}

function makeTalbe(xmldoc,url){
var talbe = document.createElement("table");
table.setAttribute("border",1);
table.setAttribute("width","600");
table.setAttribute("class","tab-content");
document.body.appendChild(table);
var caption = "Employee Data from " + url;
table.createCaption().appendChild(document.createTextNode(caption));
var header = table.createThead();
var headerrow = header.insertRow(0);
headerrow.insertCell(0).appendChild(document.createTextNode("姓名"));
headerrow.insertCell(1).appendChild(document.createTextNode("职业"));
headerrow.insertCell(2).appendChild(document.createTextNode("工资"));
var employees = xmldoc.getElementsByTagName("employees)";
for(var i=0;i<employees.length;i++){
var e = employees[i];
var name = e.getAttribute("name");
var job = e.getElementsByTagName("job")[0].firstChild.data;
var salary = e.getElementsByTagName("salary")[0].firstChild.data;
var row=table.insertRow(i+1);
row.insertCell(0).appendChild(document.createTextNode(name));
row.insertCell(1).appendChild(document.createTextNode(job));
row.insertCell(2).appendChild(document.createTextNode(salary));
}
}
-->
</script>
</head>

<body onLoad="loadXml(makeTalbe);">
</body>
</html>

分享到:
评论

相关推荐

    XML的DOM编程 实例

    在“XML的DOM编程实例”中,我们主要探讨如何利用DOM解析XML文件,并进行读取、修改、创建和删除XML元素。这个实例包含了一个带有图形用户界面(GUI)的应用程序,使用户能够直观地与XML数据交互。下面将详细解释...

    .net平台DOM解析实例

    本实例将深入探讨.NET中的DOM解析机制,以及如何结合.NET控件和枚举类型进行实际应用。 首先,DOM解析的基本原理是将整个XML文档加载到内存中,形成一棵由节点组成的树形结构,这棵树被称为DOM树。每个XML元素、...

    dom教程 dom文档对象实例教程

    实例是学习DOM的最佳途径,因为它们能帮助你理解理论知识在实际应用中的效果。在提供的"DOM教程"中,你可能会发现各种实用的代码示例,覆盖上述各个主题,让你能够动手实践并加深理解。 总之,DOM教程是JavaScript...

    Dom实例的运用

    此外,事件监听和属性修改也是DOM实例的重要应用,例如通过`addEventListener`添加事件处理函数,改变元素的`style`属性实现动态效果。 然而,DOM解析整个XML文档会消耗大量内存,对于大文件,可能不切实际。这时,...

    DOM解析xml文件实例讲解

    本篇文章将深入探讨DOM解析XML文件在Android中的应用实例。 首先,DOM解析的基本思想是将整个XML文件加载到内存中,形成一个树形结构,即DOM树。这样做的优点是解析后的数据可以方便地进行任意位置的查找和修改,但...

    很适用的DOM编程实例

    "很适用的DOM编程实例"提供了一个深入学习DOM操作的实用资源,尤其适合初学者和进阶者提升技能。这个压缩包包含的"DOM编程手册.chm"是一个完整的指南,详细介绍了DOM的基本概念、API以及丰富的示例代码。 一、DOM...

    JavaScript中Dom操作实例详解.docx

    JavaScript 中 Dom 操作实例详解 在 JavaScript 中,DOM 操作是指对 HTML 文档中的元素节点进行操作,包括增加、删除、修改和查找节点等。以下是 JavaScript 中 DOM 操作的实例详解。 一、增加节点 增加节点的...

    java dom 解析 xml 实例

    Java DOM 解析 XML 实例 Java DOM 解析 XML 实例是 Java 语言中常用的 XML 解析方法之一,使用 W3C 推荐的文档对象模型(Document Object Model,DOM)来解析 XML 文档。DOM 提供了一个树形结构的对象模型,通过...

    DOM JDOM dom4j 实例源码

    DOM模型将整个文档解析为一个树形结构,每个节点代表文档的一部分,如元素、属性、文本等。通过DOM,我们可以方便地对文档进行读取、修改和操作。 JDOM是Java特定的DOM实现,它的设计目标是为了解决原生DOM在处理...

    JS操作iframe里的dom(实例讲解)

    首先,要访问`iframe`内部的DOM,我们必须获取到`iframe`对象,然后通过`contentWindow`属性访问到`iframe`内部的`window`对象,再通过`document`属性获取其`document`对象。这样,我们就能够对`iframe`内的HTML元素...

    xml.dom解析实例(java)

    以下是一个简单的XML DOM解析实例: 首先,我们需要导入必要的库: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import ...

    25 完成工作单元创建 DOM 元素实例与收集副作用慕课专栏1

    在首次渲染时,React会为这些节点创建对应的DOM实例,并将它们存储在Fiber节点的`stateNode`属性上。而在后续的更新渲染中,React不会重复创建DOM,而是直接更新现有DOM元素的属性,以反映组件状态的变化。这通常...

    dom4j dom4j实例

    **DOM4J详解与实例应用** DOM4J是一款强大的Java XML处理库,它提供了一种灵活且高效的方式来处理XML文档。DOM4J以其简洁的API、高性能和丰富的功能,成为了许多Java开发者在处理XML时的首选工具。在这个实例中,...

    dom4j 解析xml实例

    在这个实例中,我们将深入探讨如何使用DOM4J解析XML文件,并通过`Dom4jTest1.java`这个示例程序来理解其工作原理。 首先,我们需要了解XML(Extensible Markup Language)是一种标记语言,常用于存储和传输数据。...

    dom4j解析xml实例

    **DOM4J解析XML实例详解** 在Java编程中,处理XML文档是一项常见的任务。DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML...

    CUMT Web DOM课件及实例

    通常,这些PPT会涵盖DOM的节点类型(如元素节点、文本节点、属性节点等)、遍历DOM树的方法、以及如何通过DOM来修改、添加和删除元素。 3. **实例演示** 压缩包中的实例文件(DOMEXA1.htm至DOMEXA5.htm)提供了...

    (JavaScript)Dom入门35个简单实例

    在这个"(JavaScript)Dom入门35个简单实例"的压缩包中,你将找到一系列帮助初学者理解DOM操作的实践教程。 1. **添加和删除元素**:在这些实例中,你将学习如何使用`createElement()`和`appendChild()`方法动态创建...

    dom,dom4j,sax 解析xml文件实例

    它不像DOM那样将整个XML加载到内存,而是逐行读取,遇到元素、属性等事件时触发回调函数。这种方式内存效率高,适用于大文件解析,但操作相对复杂,需要编写事件处理器。 在SAX解析中,我们需要实现`DefaultHandler...

    flex布局实例DOM

    实例DOM通常会包含多个具有不同flex属性的div元素,用于展示不同情况的效果,帮助开发者更好地理解和掌握flex布局的工作原理。例如,通过动态改变这些属性的值,我们可以观察到子元素的排列、大小和位置是如何根据...

    DOM解析XML应用实例(入门经典案例)

    本教程“DOM解析XML应用实例(入门经典案例)”旨在帮助初学者快速掌握DOM解析XML的基本方法和实践技巧。 XML(Extensible Markup Language)是一种标记语言,常用于存储和传输数据,特别是在Web应用程序中。它具有...

Global site tag (gtag.js) - Google Analytics