JavaScript DOM实战:创建和克隆元素


  本文标签:JavaScript DOM

  DOM允许你创建自己的元素和文本节点,并把它们添加大文档树中  。理论上上说,你可以从树中移除所有的元素,创建新元素,或者重整文档树,从而完全改变页面  。但是在实践中,这个特性用起来有些限制  。DOM也允许你克隆现有的元素,已便你能方便地复制文档的某一部分并在文档中分发副本  。

  51CTO推荐阅读:JavaScript DOM的本质及操作方法

  createElement()和createTextNode()

  createElement()和createTextNode()做的事情正如它们的名字所说的那样  。最常见的JavaScript DOM方法实战-修改文档树中已经用过它们  。当时的目的是把新创建的元素添加到文档树里,使它成为某个元素的最后一个子节点  。

  1. //创建一个li新元素  
  2. var newChild=document.createElement(li);  
  3. //创建一个a 新元素  
  4. var newLink=document.createElement(a)  
  5. //创建一个 Text 节点  
  6. var newText=document.createTextNode(My Wiki);  

  newChild指向新创建的

  • 元素对象,newLink指向新创建的元素对象,而newText指向新创建的文本节点对象  。这些节点都还没有被插入文档中  。最常见的JavaScript DOM方法实战-修改文档树中,用到的appendChild()或insertBefore()将它们附加到文档树中  。例如:

    1. var nav=document.getElementById("nav");  
    2. //创建一个li新元素  
    3. var newChild=document.createElement(li);  
    4. //创建一个a 新元素  
    5. var newLink=document.createElement(a)  
    6. //创建一个 Text 节点  
    7. var newText=document.createTextNode(My Wiki);  
    8. //把Text添加到a元素节点中  
    9. newLink.appendChild(newText);  
    10. //给a元素节点设置属性href和内容  
    11. newLink.setAttribute(href,"#");  
    12. //把a元素节点添加到新的li元素节点中  
    13. newChild.appendChild(newLink);  
    14. //把新的li元素节点添加到 ul 元素节点里  
    15. nav.appendChild(newChild);  

      这先将文本节点附加到中,然后再将包含文本节点的附加到

  • 中,最后把包含和文本的
  • 附加到
      中  。此时我的导航条ul中多了一个li子节点  。

        createTextNode()和HTML实体

        createTextNode()有一个问题:它不能创建类似于€(� 欧元符号)¥(¥ 人民币符号) © (© 版权符号)“(“左双引号)”(” 右双引号)等,这样的HTML实体元素  。它会按字面创建文本,而不是创建你所需要的符号   。

      1. <script  type="text/javascript"> 
      2. window.onload=function(){  
      3.  var x=document.createTextNode("© Copyrights reserved");  
      4.  document.getElementById("test").appendChild(x);  
      5. }  
      6. script>  

        不过,我们可以使用innerHTML来代替:

      1. <script  type="text/javascript"> 
      2. window.onload=function(){   
      3. document.getElementById("test").innerHTML="© 
      4. Copyrights reserved";  
      5. }  
      6. script>  

        关于innerHTML属性的用法,我们会在下一节中作为专题来具体的讨论  。

        cloneNode()

        cloneNode()方法克隆一个节点,即它能对节点做一个完美的复制,使你可以在随后将其插入到文档树中  。导航条HTML代码:

      1. <div id="menu"> 
      2.     <h1>我的导航条h1>            
      3.     <ul id="nav"> 
      4.        <li><a href="#">HOMEa>li> 
      5.        <li><a href="#">(X)Html / Cssa>li> 
      6.        <li><a href="#">Ajax / RIAa>li> 
      7.        <li><a href="#">GoFa>li> 
      8.        <li><a href="#">JavaScripta>li> 
      9.        <li><a href="#">JavaWeba>li> 
      10.        <li><a href="#">jQuerya>li> 
      11.        <li><a href="#">MooToolsa>li> 
      12.        <li><a href="#">Pythona>li> 
      13.        <li><a href="#">Resourcesa>li> 
      14.     ul> 
      15. div>  

        测试cloneNode()

      1. <script  type="text/javascript"> 
      2. window.onload=function(){  
      3.      var nav_list=[];  
      4.   var nav=document.getElementById("nav");  
      5.      navnav_list=nav.getElementsByTagName("li");  
      6.   var x=nav_list[0];  
      7.   var y=x.cloneNode(true);  
      8.   nav.appendChild(y);  
      9. }  
      10. script> 

        要想正确的使用cloneNode(),你必须了解它的一下二个特征:

        1. cloneNode()接受一个可选值为true或false的参数  。True 表示克隆元素和它的所有子节点  。False表示克隆元素但不包含它的子节点  。通常,我们在实践中用true,我从来没有遇到过想要克隆一个节点但不包含它的子节点的情形  。

        2. cloneNode()不会克隆事件处理程序  。这相当的让人恼火,不知道这个方法是怎么定义的(原因我也不知道)所以每次你克隆一个节点,你不得不在克隆上重新定义事件处理程序  。

        原文地址:http://cssrainbow.cn/tutorials/javascript/589.html