龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

JavaScript DOM文档遍历实战(1)(3)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
一个比较通用的方法: script type = text/javascript functiontext(elem){ var t = ; //如果传入的是元素,则继续遍历其子元素 //否则假定它是一个数组 elem elem =elem.chi

一个比较通用的方法:

  1. <script type="text/javascript"> 
  2. function text(elem){  
  3.  var t="";  
  4.  //如果传入的是元素,则继续遍历其子元素  
  5.  //否则假定它是一个数组  
  6.  elemelem=elem.childNodes || elem;  
  7.  //遍历所有子节点  
  8.  for(var i=0; i<elem.length;i++){  
  9.      //如果不是元素,追加其文本值  
  10.   //否则,递归遍历所有元素的子节点  
  11.   t+=elem[i].nodeType !=1?elem[i].nodeValue:text(elem[i].childNodes);  
  12.    
  13.  }  
  14.     //返回比配的文本  
  15.     return t;  
  16. }  
  17. </script> 

用元素节点的DOM属性遍历DOM树

  1. <script type="text/javascript"> 
  2. window.onload=function(){  
  3.   /*定位想要的节点*/  
  4.   var nav=document.getElementById("nav");  
  5.   /*查找父节点*/  
  6.   var p_n=nav.parentNode;  
  7.   alert("父节点的元素名称:"+p_n.nodeName);  
  8.    
  9.   /*处理FF遍历节点中的#Text */  
  10.   removeWhitespace(nav);//移除所有的空Text节点  
  11.    
  12.   /*查找子节点*/    
  13.   var c_n_f=nav.firstChild;//第一个节点对象  
  14.   //var c_n_f=nav.childNodes[0];//同上一样的结果  
  15.   var c_n_l=nav.lastChild;//最后一个节点对象  
  16.   //var c_n_l=nav.childNodes[nav.childNodes.length-1];//同上一样的结果  
  17.   alert("第一个节点:"+c_n_f.nodeName+"  "+"最后一个节点 :"+c_n_l.nodeName);   
  18.   /*查找兄弟节点 或叫 相邻节点 */  
  19.   /*用nextSibling和PreviousSibling必须有一个参考点,这样指针才知道自己往那里移动*/  
  20.   var c_n_s=c_n_f.nextSibling;//第一个节点的下一个节点  
  21.   alert("第一个节点的下一个节点:"+c_n_s.innerHTML+ "n" + "节点中包含的HTML内容: "+c_n_s.nodeName);  
  22.    
  23. }  
  24. </script> 

写到这里,既然标准的previousSibling,nextSibling,firstChild,lastChild,parentNode遍历方法有浏览器不兼容问题。我上面的解决方案是去掉遍历元素的相关空的#Text节点,是一个好的解决方案,但是使用起来不方便,我们何不自己写一些遍历节点的方法来代替标准的的previousSibling,nextSibling,firstChild,lastChild,parentNode。

我们的思路是利用元素是nodeType属性来判断元素是节点类型中那种节点类型,在DOM节点中我最常用的是元素节点,文本节点,属性节点,对应的类型值是元素节点nodeType=1 or ELEMENT_NODE, 文本节点 nodeType=2 or ATTRIBUTE_NODE,属性节点 nodeType=3 or TEXT_NODE,但是IE中并不支持命名常量,那就用数值吧,再配合标准的遍历属性。完全可以自己生产一些辅助函数来取代标准的遍历方式。以下一系列的辅助函数可以帮助您,他们能取代标准的previousSibling,nextSibling,firstChild,lastChild,parentNode;

  1. <script type="text/javascript"> 
  2. //---------DOM 遍历,如果元素没找到则返回null---------//      
  3.     //---查找相关元素的前一个兄弟元素---//      
  4.    function prev(elem){      
  5.         do{      
  6.            elemelem=elem.previousSibling;      
  7.         }while(elem && elem.nodeType!=1);      
  8.         return elem;      
  9.     }      
  10.     //---查找相关元素的下一个兄弟元素---//      
  11.     function next(elem){      
  12.        do{      
  13.            elemelem=elem.nextSibling;      
  14.         }while(elem && elem.nodeType!=1);      
  15.         return elem;      
  16.     }      
  17.     //---查找第一个子元素的函数---//      
  18.     function first(elem){      
  19.         elemelem=elem.firstChild;      
  20.         return elem && elem.nodeType!=1 ?next(elem):elem;      
  21.     }      
  22.     //---查找最后一个子元素的函数---//      
  23.     function last(elem){      
  24.         elemelem=elem.lastChild;      
  25.         return elem && elem.nodeType!=1 ?prev(elem):elem;      
  26.     }      
  27.     //---查找父级元素的函数---//      
  28.     //num是父级元素的级次,parent(elem,2)等价于  
  29.    function parent(elem,num){      
  30.         numnum=num||1;      
  31.         for(var i=0; i<num; i++){      
  32.             if(elem!=null){      
  33.                 elemelem=elem.parentNode;      
  34.            }      
  35.         }      
  36.        return elem;      
  37.    }   
  38. </script> 

原文链接:http://cssrainbow.cn/tutorials/javascript/565.html

精彩图集

赞助商链接