我使用以下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' );
}
这适用于FF和IE,[但是,我想,如果IE 名称并且 colspan 属性未使用setAttribute设置。但不确定]。
现在,当我必须删除动态创建的所有行时,我使用: -
dynamicTRObjs = document.getElementsByName('dynamicTR');
if ( dynamicTRObjs ){
parentObj = approvedDisapprovedTableObj.getElementsByTagName('tbody')[0];
for ( i = 0 ; i < dynamicTRObjs.length; i++ ){
parentObj.removeChild ( dynamicTRObjs[i] );
extraTr++;
}
}
此代码删除所有动态创建的TR。它在FF中工作正常,但在IE中却没有
同样,在IE dynamicTRObjs.length
始终为0的情况下,而在FF dynamicTRObjs.length
中,它给出了正确的行数。请告诉我这里缺少什么。
答案 0 :(得分:9)
HTML4规范list of attributes列出了可以设置 name 属性的元素。表和表元素不在列表中。
是最明显的选择之一Firefox正确地使用了getElementsByName,IE不是其他人也遇到过的东西。我完全避免在这里使用 name 。
答案 1 :(得分:1)
http://www.quirksmode.org/dom/w3c_core.html
getElementsByName()在IE6-8中运行不正常
如果您想要跨浏览器可用性,我建议您使用其他方法来识别该元素。
答案 2 :(得分:1)
我知道,这有点偏离主题,但是让我给你一个关于在浏览器中使用getElementsByName功能的小建议。它无法帮助您解决当前问题(这是因为TR不能具有Name属性),但它肯定会帮助您防止将来遇到的问题。
getElementsByName返回集合,它始终使自己与DOM树保持同步。这意味着,在您使用removeChild删除一个项目时,收集的SIZE将减少。因此,如果要删除节点并继续依赖集合的长度,则不会删除所有节点。
检查你的for循环的这个例子:
选择您想解决的任何解决方案,但请尽量避免依赖于getElementsByTagName返回的Collection的长度。
祝你好运答案 3 :(得分:1)
因为我并不是唯一一个建议避免使用低级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, ' ')
.append(mkTd(15, $('#postingDivObj').html()))
);
}
var dropRows = function ()
{
$('.dynamicTR').remove();
}
注意表达式$('.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++;
}
}
IMO很明显,这些好处是巨大的。