name属性是个比较复杂的属性
一般这样认为:
用getElementsByName或通过form.name去找一个对象只能用生成DOM树时name的值,其后对name的修改只引起值的改变,而不会改变它在DOM树中的索引值(相当于修改时只是赋了一新name值,而其在DOM树中保存的索引是不变的)。仔细想想字符串的处理,有这样的效果也不足为怪。

解决方案 »

  1.   

    那我要改name的数值怎么做呢
    我name不改的话,提交给jsp得到的东西是错误的
    jsp不能通过id得到数值
      

  2.   

    提交时使用的是页面的值,也就是说DOM树跟提交是没有关系的。
    即:
    提交时使用的name是你页面中对其修改后的值,只是DOM树的索引值不会改变。
    只是使用更改后的值来getElement不行,如果你只管IE的话,有一个属性你可以试下改用:uniqueID
    这个uniqueID是只读的,改不了它,也可以通过getElementById找到它,而它又跟提交那些一点关系都没有。
      

  3.   

    嗯 真是谢谢你我现在把我程序的功能和问题描述些:
    程序功能:
    一:动态增加一行(行的顺序h,行中的列数顺序i),里面的控件名字是f_h_i.

      

  4.   

    关键在于创建上,如果你想让动态创建的元素能被getElementsByName找到的话,必须在创建时指定name属性,也只有这一个属性有这么怪。
    举例:
    var txt = document.createElement("<input name='txt1'/>");
    txt.type = "text";//type需要在append之前设置好,一量append入DOM,就不能再修改
    document.body.appendChild( txt );像这样写才行。
      

  5.   

    另:id属性不涉及这些问题,而我看你注释掉的alert(... .length),这里写的是length,我想你应该试下value。
      

  6.   


    程序功能:
    一:动态增加一行(行的顺序h,行中的列数顺序i),里面的控件名字是f_h_i.
       (例:第一行.第一列为name=f_1_1,第二行,第三列name=f_2_3)
    二:把每行的tr标签的id 设置成行号(例:表头的tr.id=0,第一行的tr.id=1);
    三:删除一样,如果是删除的不是最后一行,就要把从删除后的左右行的名字向前移动.
       (例:我删除第二行,就要把第三行的name=f_3_1,变成f_2_1,
           把第四行的name=f_4_1,变成f_3_1.
           并把tr.id也由4->3,3->2
        )
    //////////
    js代码:
    function inner(tr,num,value) ///设置表头显示的行号第一个td
    {
    var com = tr.childNodes;   //[num];
    com[num].innerHTML = value;
    }
    function reComName(comid,value)  
    ////改控件的名字和id(comid=要修改的控件id,value=修改后的)
    {
    var com = getComm(comid); ///下面的方法
    com.id = value;
    com.name = value;
    alert("com.name="+com.name+"   com.id = value="+com.id );//这里显示的是对的就是name改变了

    }function getComm(comid) ///得到comid的控件
    {
    var com = document.getElementById(comid);
    //alert("getComm...."+com.length)
    return com;
    }
    //////////////删除不适合最后一行的代码
    function delrow1(r)
    {
    var o = r.parentNode.parentNode.parentNode;
    var num = tbody.getElementsByTagName("tr").length ; //tr number
    var delrowid = o.id;
    tbody.removeChild( document.getElementById( o.id ) );
    var trs = tbody.getElementsByTagName("tr");    ///all tr
    ("rowid="+delrowid+"<br>trs.length="+trs.length);
    for( var x = delrowid ; x< trs.length ;x++  )
    {
    inner(trs[x] ,0,x);
    reComName("f1_"+(parseInt(x,"10")+1)+"_1","f1_"+x+"_1");
    alert(x+"==="+document.getElementById("f1_"+x+"_1").name);
    }
    xh = trs.length;
    alert("out___"+document.getElementById("f1_2_1").name)
    }
      

  7.   

    我这边的错误信息就是null对象
    是由于name没有设置,但是id设置了
    删除后显示的是
    <TD style="BORDER-RIGHT: rgb(0,0,0) 1px groove; BORDER-BOTTOM: rgb(0,0,0) 1px groove"><TEXTAREA class=textarea1 id=f1_3_1 name=f1_4_1 rows=5 cols=31></TEXTAREA></TD>
    这样在得到对象的时候,就是null
      

  8.   

    你写得太复杂了,你改用table对象的rows集合,row对象的cells集合,很容易处理的。删除的时候只需要table.rows[i].removeNode(true);
    改变id,name变就是了,假设input 直接位于<td>下级,则:
    inputObj.id = inputObj.name = "f_" + inputObj.parentNode.parentNode.rowIndex + "_" input.parentNode.cellIndex;
      

  9.   

    alert("getComm...."+com.value); 显示没有东西getComm....value没有数值
      

  10.   

    为什么不能所有的id和name都等于f1
    下一个页面,当数组整个取出来,不就可以了吗?
    LZ到底想干嘛?没看出来