JavaScript DOM修改文档树方法实例
创始人
2024-07-13 13:51:02
0

在我们工作中大多数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.  

 

【编辑推荐】

  1. JavaScript DOM实战:创建和克隆元素
  2. XML DOM新手入门指南
  3. 在JavaScript中如何实现DOM操作 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
规避非法攻击 用好路由器远程管... 单位在市区不同位置设立了科技服务点,每一个服务点的员工都通过宽带路由器进行共享上网,和单位网络保持联...
范例解读VB.NET获取环境变... VB.NET编程语言的使用范围非常广泛,可以帮助开发人员处理各种程序中的需求,而且还能对移动设备进行...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...