为什么这个javascript在IE中不起作用?

为什么这个javascript在IE中不起作用?,javascript,html,dynamic,Javascript,Html,Dynamic,我使用以下javascript在表中动态添加行:- var trObj = document.createElement('tr'); trObj.setAttribute('name', 'dynamicTR'); var tdObjEmpty = document.createElement('td'); tdObjEmpty.setAttribute('colspan', '2'); tdObjEmpty.innerHTML = '&nbs

我使用以下javascript在表中动态添加行:-

    var trObj = document.createElement('tr');
    trObj.setAttribute('name', 'dynamicTR');

    var tdObjEmpty = document.createElement('td');
    tdObjEmpty.setAttribute('colspan', '2');
    tdObjEmpty.innerHTML = ' '
    trObj.appendChild ( tdObjEmpty );

    var tdObj = document.createElement('td');
    tdObj.setAttribute('colspan', '15');
    tdObj.innerHTML = postingDivObj.innerHTML; // <-- copy the innerHTML
    trObj.appendChild ( tdObj );    
    parentObj = approvedDisapprovedTableObj.getElementsByTagName('tbody')[0];               
    targetElementObj = getNthTr ( parentObj, rowIndex1 - extraTr ); // <-- it will just return the trObject, 
    if ( targetElementObj ){
        parentObj.insertBefore(trObj, targetElementObj.nextSibling )
    }else{
        //alert ( 'targetElementObj is null' );
    }
var-trObj=document.createElement('tr');
setAttribute('name','dynamicTR');
var tdObjEmpty=document.createElement('td');
tdObjEmpty.setAttribute('colspan','2');
tdObjEmpty.innerHTML=“”
trObj.appendChild(tdObjEmpty);
var tdObj=document.createElement('td');
tdObj.setAttribute('colspan','15');
tdObj.innerHTML=postingDivObj.innerHTML;//

getElementsByName()在IE6-8中工作不正常

如果您想要跨浏览器的可用性,我建议您使用其他方法来识别该元素。

HTML4规范列出了可以设置名称属性的元素。表和表元素不在列表中。最明显的选择是

  • 保留对您创建的所有TR的引用,这样您就不必在DOM中找到它们
  • 在TRs上设置一个类名,并使用选择器查找它们

Firefox使用getElementsByName“正确”,而IE没有,这也是其他人遇到的问题。我只想在这里完全避免使用名称。

我知道,这有点离题,但让我给你一个关于在浏览器中使用getElementsByName功能的小建议。它不会帮助您解决当前的问题(这是因为TR不能有Name属性),但它肯定会帮助您防止将来遇到的问题

getElementsByName返回集合,该集合始终保持DOM树的最新状态。这意味着,当您使用removeChild删除一个项目时,集合的大小将减小。因此,如果要删除节点并继续依赖集合的长度,则并非所有节点都将被删除

检查for循环的以下示例:

  • 集合长度为3,您的i变量为0,i 你把孩子带走
  • 集合长度为2,您的i变量为1,i 你把孩子带走
  • 集合长度为1,您的i变量为2。
    条件i
选择任何您想要修复此问题的解决方案,但尽量避免依赖getElementsByTagName返回的集合长度


祝你好运

因为我不是唯一一个建议避免低级DOM操作的人,这里有一个例子:一个未经测试的jquery实现。不完全是对您的问题的回答,但注释将丢失格式

var mkTd = function (colspan, html)
{
    return $('<td />')
        .attr('colspan', colspan)
        .html(html)
    ;
}

var addRow = function (rowNr)
{
    var target = $('#approvedDisapprovedTableObj tbody tr:eq('+rowNr+')');
    if (!target.length) {
        //alert ( 'target is null' );
        return;
    }
    target.after(
        $('<tr />')
            .addClass('dynamicTR')
            .append(mkTd(2, '&nbsp;')
            .append(mkTd(15, $('#postingDivObj').html()))
    );
}
var dropRows = function ()
{
    $('.dynamicTR').remove();
}

在我看来,它的好处是巨大的。

你不使用e有什么原因吗。Gjquery?你的代码不仅要短80%,而且很可能可以跨浏览器工作。没有具体的原因。问题是“我如何在JS中工作”,而不是“我如何在jQuery中工作”。@Michiel Kalkman:jQuery是一个JS库,不是另一种语言。避免使用帮助快速、可靠地完成任务的工具在我看来是一项糟糕的工程。您缺少的是getElementsByName的规范是,它只在xhtml中返回该名称的“表单控件”。我肯定会在dom节点上设置一个类,并查找具有该类名的元素。应该明确使用jquery、ext、prototype或其他东西。编写自己的代码来搜索节点每次都是在重新发明轮子。如果您不喜欢libs,至少可以推出自己的方法来执行dom查询。ff已经有了getElementsByClassName。哦,太好了,现在我该怎么办?请建议Mikeyou可以给他们一个公共id
你可以给他们一个公共id
让我试试这个tooID属性必须是每个文档实例唯一的。函数是document.getElementById()-singular。我总是在内存中保留一个动态对象数组,因为以后查找它们是一个扩展过程。尽可能避免使用DOM。+1
在您的TR上设置一个类名,并使用选择器查找它们
我现在要使用它,我认为应该可以。var arr=document.getElementsByClassName('dynamicTR');#=>应执行此操作的tr数组。
getElementsByClassName
在IE中不起作用:(@Rakesh Juyal:doh!我忘了。如果你不介意污染全局范围,你可以将所有动态tr推到那里的一个数组中。我承认不是很干净,但它会工作的。+1用于使用框架编写代码,尽管我们不得不同意在框架的普遍应用上存在分歧。
var mkTd = function (colspan, html)
{
    return $('<td />')
        .attr('colspan', colspan)
        .html(html)
    ;
}

var addRow = function (rowNr)
{
    var target = $('#approvedDisapprovedTableObj tbody tr:eq('+rowNr+')');
    if (!target.length) {
        //alert ( 'target is null' );
        return;
    }
    target.after(
        $('<tr />')
            .addClass('dynamicTR')
            .append(mkTd(2, '&nbsp;')
            .append(mkTd(15, $('#postingDivObj').html()))
    );
}
var dropRows = function ()
{
    $('.dynamicTR').remove();
}
dynamicTRObjs = document.getElementsByName('dynamicTR');
if ( dynamicTRObjs ){
    parentObj = approvedDisapprovedTableObj.getElementsByTagName('tbody')[0];
    for ( i = 0 ; i < dynamicTRObjs.length; i++ ){                          
        parentObj.removeChild ( dynamicTRObjs[i] );                      
        extraTr++;
    } 
}