JavaScriptDOM修改文档树方法实例

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

一般用法

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

 
 
 
  1.  
  2.     

    我的导航条

                
  3.      
  4.        
  5. HOME
  6.  
  7.        
  8. (X)Html / Css
  9.  
  10.        
  11. Ajax / RIA
  12.  
  13.        
  14. GoF
  15.  
  16.        
  17. JavaScript
  18.  
  19.        
  20. JavaWeb
  21.  
  22.        
  23. jQuery
  24.  
  25.        
  26. MooTools
  27.  
  28.        
  29. Python
  30.  
  31.        
  32. Resources
  33.  
  34.      
  

appendChild()

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

 
 
 
  1.  
  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.   /*
  21. 从原始位置上被移除,成为ul的***一个子节点。它的a 元素节点和文本节点HODE也被移了过来*/  
  22.   navnav_list=nav.getElementsByTagName("li");//返回相同的一组元素  
  23.   nav.appendChild(nav_list[0]);  
  24. }  
  25.   

创建新DOM元素的通用函数

 
 
 
  1.  
  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.   

我们看到结果:

添加好的子节点

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

insertBefore()

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

 
 
 
  1.  
  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.   

 #p#

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

replaceChild()

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

 
 
 
  1.  
  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.   

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

removeChild()

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

 
 
 
  1.  
  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.   

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

移除所有的子节点

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

 
 
 
  1.  
  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.   

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

 
 
 
  1.  
  2. x.innerHTML='';  
  3.   

 #p#

辅助函数

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

 
 
 
  1.  
  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.   

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

 
 
 
  1.  
  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.   

before和append的辅助函数:

 
 
 
  1.  
  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.   

注意:constructor的用法。

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

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

 
 
 
  1.   
  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.  

分享名称:JavaScriptDOM修改文档树方法实例
当前URL:http://www.mswzjz.cn/qtweb/news23/387523.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能

贝锐智能技术为您推荐以下文章

移动网站建设知识

同城分类信息