<table id="tbLinkman" border=1>
   <tr>
     <td>
         fsdfsdf
     </td>
   </tr>
 </table>
 <input id='uu' type="button" x_x_onClick="funn()" value="send"/><script type="text/javascript">
 var tableObj = document.getElementById('tbLinkman');
 rowObj = tableObj.rows[0].cloneNode(true);
 function funn(){  
 tmpTrObj = tableObj.lastChild.appendChild(rowObj);
 }
</script>
这样子写,点击按钮只能创建一个tr,再点击就不起作用
 <table id="tbLinkman" border=1>
    <tr>
       <td>
           fsdfsdf
       </td>
    </tr>
 </table>
 <input id='uu' type="button" x_x_onClick="funn()" value="send"/><script type="text/javascript">
 var tableObj = document.getElementById('tbLinkman');
 function funn(){
 rowObj = tableObj.rows[0].cloneNode(true); 
 tmpTrObj = tableObj.lastChild.appendChild(rowObj);
 
 }
</script>
这样子写可以随意创建。
据说appendchild会删除原元素,可是我是克隆出来的元素,而且(rowObj == tableObj.rows[0]) 是false,足以说明它不会删除table上现有的tr,那就没有办法解释这个问题了。
一.我想知道这是为什么。
二.我必须把cloneNode放到函数外面,因为第一行tr有可能被删掉,因此如果放到函数里面每次都克隆一遍,很有可能这时第一行已经没有了。
大家感兴趣的一块儿探讨吧。

解决方案 »

  1.   

    首先把你的table加上一个自标签tBody,把table的ID去掉放在tBody上。
    关于第一中文什么只添加一次,个人理解是这样:rowObj这个对象没有变更,你添加行实际上引用rowObj来添加,你每次都引用它添加,所以他只会有一行。所以你必须每次生成一个新对象。
    第二个问题你可以用两种方式解决:
    1、设置一个隐藏的行,让他不显示
    <tr style="display:none"><td>fsdfsdf</td></tr> 
    这样不可能删除掉它。然后复制它到rowObj,rowObj.style.display = "block";然后appendChild;
    2、动态的生成你的rowObj,用
     var tr = document.createElement("tr");
     var td = document.createElement("td");
     td.innerHTML=……;
     tr.appendChild(td);
     var td = document.createElement("td");
     td.innerHTML=……;
     tr.appendChild(td);
     ……
     tbody.appendChild(tr)这种形式。
      

  2.   

    我每次都引用它添加怎么会就添加一行呢,应该是添加出多个相同行才对啊.我不能设置隐藏,因为tr里的数据最终要post到服务器处理,隐藏之后还会post过去,当然我可以加判断,不过还是很麻烦.
    挨个创建td也是可以的,可是我的table的每个td栏位是读取数据库动态生成的,栏位有多少个也是后台设定的,栏位里会有日期控件,选人控件,等各种自己封装的控件.挨个儿td去生成还不如直接克隆第一个tr.
      

  3.   

    没啥好解释滴,多看看手册吧!L@_@K
      <table id="tbLinkman" border=1> 
      <tr> 
        <td> 
            fsdfsdf 
        </td> 
      </tr> 
    </table> 
    <input id='uu' type="button" onclick="funn()" value="send"/> <script type="text/javascript"> 
    function funn()
    {
        var tableObj = document.getElementById('tbLinkman');
        var rowObj = tableObj.rows[0].cloneNode(true);
        // NOTE: tableObj.firstChild 是 tBody,至少 IE 下如此!
        tableObj.firstChild.appendChild(rowObj);
        //alert(tableObj.innerHTML);

    </script> 送你三本手册! DHTML参考手册
    http://download.csdn.net/source/308913 样式表中文手册 
    http://download.csdn.net/source/304124 JScript语言参考 
    http://download.csdn.net/source/308916
      

  4.   

    手册当然看过了,yixianggao 加的那些注释我当然都明白,我提的问题你没回答啊。我自己已经想通了,appendchild(obj),实际上是把obj加到父元素中,而不是它的拷贝,如果再加obj,他会替换原先的,而不会再增加一个。
    谢谢 william3033 
      

  5.   

    你传什么东西呢?把代码发出来,看下用什么方法解决,csdn会帮你解决的。
      

  6.   

    终于解决这个问题了,
    rowObj = tableObj.rows[0].cloneNode(true);还是放到全局中,
    在funn()函数中再克隆一下,cloneRowObj = rowObj.cloneNode(true); 这样子每次appendchild中的参数都不一样就可以了。