JavaScript DOM修改文档树方法实例 - Go语言中文社区

JavaScript DOM修改文档树方法实例


在我们工作中大多数DOM脚本的主要任务就是在DOM文档中插入,删除和移动节点。W3C DOM 提供了4种方法来修改文档树。常用的是appendChild()和insertBefore(),而removeChild() 和replaceChild()很少用到。

一般用法

修改文档提供的4个方法,都是指向它们所作用的节点的引用。导航条实例:

  1. <div id="menu"> 
  2.     <h1>我的导航条</h1>            
  3.     <ul id="nav"> 
  4.        <li><a href="#">HOME</a></li> 
  5.        <li><a href="#">(X)Html / Css</a></li> 
  6.        <li><a href="#">Ajax / RIA</a></li> 
  7.        <li><a href="#">GoF</a></li> 
  8.        <li><a href="#">JavaScript</a></li> 
  9.        <li><a href="#">JavaWeb</a></li> 
  10.        <li><a href="#">jQuery</a></li> 
  11.        <li><a href="#">MooTools</a></li> 
  12.        <li><a href="#">Python</a></li> 
  13.        <li><a href="#">Resources</a></li> 
  14.     </ul> 
  15. </div>  

appendChild()

appendChild()方法让你添加一个节点并使其成为某个元素的***一个子节点。如果添加的该节点已经存在于文档中,它会从当前位置移除。该节点的子节点保持不变,它们也被一起移动到新的位置。

  1. <script type="text/javascript"> 
  2. window.onload=function(){  
  3.   /*为一个元素添加子元素*/  
  4.   var nav=document.getElementById("nav");  
  5.   //创建一个li新元素  
  6.   var newChild=document.createElement('li');  
  7.   //创建一个a 新元素  
  8.   var newLink=document.createElement('a')  
  9.   //创建一个 Text 节点  
  10.   var newText=document.createTextNode('My Wiki');  
  11.   //把Text添加到a元素节点中  
  12.   newLink.appendChild(newText);  
  13.   //给a元素节点设置属性href和内容  
  14.   newLink.setAttribute('href',"#");  
  15.   //把a元素节点添加到新的li元素节点中  
  16.   newChild.appendChild(newLink);  
  17.   //把新的li元素节点添加到 ul 元素节点里  
  18.   nav.appendChild(newChild);  
  19.    
  20.   /*<li>从原始位置上被移除,成为ul的***一个子节点。它的a 元素节点和文本节点HODE也被移了过来*/  
  21.   navnav_list=nav.getElementsByTagName("li");//返回相同的一组元素  
  22.   nav.appendChild(nav_list[0]);  
  23. }  
  24. </script>  

创建新DOM元素的通用函数

  1. <script type="text/javascript"> 
  2. function create( elem ) {  
  3.     return document.createElementNS ?  
  4.         document.createElementNS( 'http://www.w3.org/1999/xhtml', elem ) :  
  5.         document.createElement( elem );  
  6. }  
  7.    
  8. </script>  

我们看到结果:

添加好的子节点

从原始位置上被移除,成为ul的***一个子节点

insertBefore()

insertBefore()方法允许你在其他节点的前面插入一个节点,所以当你想要添加一个子节点,但又不希望该节点成为***一个子节点的时候,就可以使用此方法。就像appendChild()方法一样,如果插入的节点已经存在于文档之中,它会被从当前位置移除,而且该节点在被插入之后乃保持它的子节点结构。

  1. <script type="text/javascript"> 
  2. window.onload=function(){  
  3.   var nav=document.getElementById("nav");  
  4.   navnav_list=nav.getElementsByTagName("li");//返回相同的一组元素  
  5.   //***个节点  
  6.   var x=nav_list[0];  
  7.   //***一个节点  
  8.   var y=nav_list[nav_list.length-1]  
  9.   //在x元素对象之前插入y元素对象  
  10.   nav.insertBefore(y,x);  
  11.   //在x元素对象之前插入新生产的newChild元素对象  
  12.   nav.insertBefore(newChild,x);//newChild元素对象的创建请参考上面的代码  
  13. }  
  14. </script>  

在其他节点的前面插入一个节点

replaceChild()

replaceChild()方法允许你把一个节点替换为另一个节点。就像appendChild()和insertBefore()一样,如果插入的节点已经存在于文档之中,它会被从当前位置移除,而且该节点在被插入之后乃保持它的子节点结构。

  1. <script type="text/javascript"> 
  2. window.onload=function(){  
  3.   var nav=document.getElementById("nav");  
  4.   navnav_list=nav.getElementsByTagName("li");//返回相同的一组元素  
  5.   //***个节点对象  
  6.   var x=nav_list[0];  
  7.   //x节点对象被newChild新节点对象替换了  
  8.   nav.replaceChild(newChild,x);  
  9. }  
  10. </script>  

把一个节点替换为另一个节点

removeChild()

removeChild()方法允许你移除一个节点以及它的子节点们。

  1. <script type="text/javascript"> 
  2. window.onload=function(){  
  3.   var nav=document.getElementById("nav");  
  4.   navnav_list=nav.getElementsByTagName("li");//返回相同的一组元素  
  5.   //***一个节点  
  6.   var y=nav_list[nav_list.length-1]  
  7.   //移除***面的一个节点  
  8.   nav.removeChild(y);  
  9. }  
  10. </script>  

你移除一个节点以及它的子节点们

移除所有的子节点

有的时候你需要把一个元素清除干净;你想在添加新节点前清除原来的所有子点。有两个简单的方法来做这件事情:

  1. <script type="text/javascript"> 
  2.  while (x.childNodes[0]){  
  3.   x.removeChild(x.childNodes[0]);  
  4.  }  
  5.    
  6.  /*  
  7.  //我们可以使用firstChild来代替childNodes[0]  
  8.   while (x.firstChild){  
  9.   x.removeChild(x.firstChild);  
  10.  }  
  11.  * /  
  12. </script>  

这是一个简单的while()循环,只要元素存在***个节点(childNodes[0]),它就移除这个节点,接着节点集合立即更新。所以(原来的)第二个节点成为了***个节点,循环就会一直重复,直到X没有子节点为止。另一个方法就简单了

  1. <script type="text/javascript"> 
  2. x.innerHTML='';  
  3. </script>  

辅助函数

appendChild()和insertBefore()都有2个参数,但是我们在应用的时候,还要注意参数的先后顺序。既然这么麻烦我们还是自己写一些辅助函数来代替原有的appendChild()和insertBefore()。在另一个元素之前插入元素的函数:

  1. <script type="text/javascript"> 
  2. //insertBefore()的代替方法  
  3. function before( parent, before, elem ) {  
  4.     // Check to see if no parent node was provided  
  5.  //检查parent是否传入  
  6.     if ( elem == null ) {  
  7.         elem = before;  
  8.         before = parent;  
  9.         parent  = before.parentNode;  
  10.     }  
  11.    
  12.     // Get the new array of elements  
  13.  //获取元素的新数组  
  14.     var elems = checkElem( elem );  
  15.    
  16.     // Move through the array backwards,  
  17.     // because we’re prepending elements  
  18.  //向后遍历数组  
  19.  //因为我们向前插入元素  
  20.     for ( var i = elems.length - 1; i >= 0; i-- ) {  
  21.         parent.insertBefore( elems[i], before );  
  22.     }  
  23. }  
  24. </script>  

为另一个元素添加一个子元素:

  1. <script type="text/javascript"> 
  2. //appendChild()的代替方法  
  3. function append( parent, elem ) {  
  4.     // Get the array of elements  
  5.  //获取元素数组  
  6.     var elems = checkElem( elem );  
  7.    
  8.     // Append them all to the element  
  9.  //把它们所有都追加到元素中  
  10.     for ( var i = 0; i <= elems.length; i++ ) {  
  11.         parent.appendChild( elems[i] );  
  12.     }  
  13. }  
  14. </script>  

before和append的辅助函数:

  1. <script type="text/javascript"> 
  2. function checkElem( elem ) {  
  3.     // If only a string was provided, convert it into a Text Node  
  4.  //如果只提供字符串,那就把它转换为文本节点  
  5.     return elem && elem.constructor == String ?  
  6.    document.createTextNode( elem ) : elem;  
  7. }  
  8. </script>  

注意:constructor的用法。

有时你可能需要对变量进行类型检查,或者判断变量是否已定义。有两种方法可以使用:typeof函数与constructor属性。typeof可以检查到变量是否有定义,而construct只能检查已定义变量的类型。

移除所有的子节点的辅助函数:

  1.  <script type="text/javascript"> 
  2. function empty( elem ) {   
  3.  while (elem.firstChild){  
  4.    remove(elem.firstChild);  
  5.  }  
  6.  /*  
  7.  //我们可以使用firstChild来代替childNodes[0]  
  8.  while (elem.childNodes[0])  
  9.   remove(elem.childNodes[0]);  
  10.  * /  
  11. }  
  12.    
  13. function remove( elem ) {  
  14.     if ( elem ) elem.parentNode.removeChild( elem );  
  15. }  
  16. </script> 

版权声明:本文来源51CTO,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:http://developer.51cto.com/art/201009/225491.htm
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 03:28:38
  • 阅读 ( 511 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢