在IE8中遍历DOM断点的递归JavaScript函数
我一直推迟在这里发帖,因为我觉得我还没有能力回馈社区,但这一次让我完全难堪 我有一个递归JavaScript函数,它在节点树中所有id和name元素的末尾追加一个计数器。该功能适用于FF、Chrome、Safari和IE9,但不适用于IE8在IE8中遍历DOM断点的递归JavaScript函数,javascript,internet-explorer-8,Javascript,Internet Explorer 8,我一直推迟在这里发帖,因为我觉得我还没有能力回馈社区,但这一次让我完全难堪 我有一个递归JavaScript函数,它在节点树中所有id和name元素的末尾追加一个计数器。该功能适用于FF、Chrome、Safari和IE9,但不适用于IE8 function counterAppend(nodes,counter) { var newField = nodes.childNodes; for (var i=0;i<newField.length;i++) {
function counterAppend(nodes,counter)
{
var newField = nodes.childNodes;
for (var i=0;i<newField.length;i++)
{
var theName = newField[i].name;
if (theName)
{
newField[i].name = theName + counter;
}
var theId = newField[i].id;
if (theId)
{
newField[i].id = theId + counter;
}
//recursive part
if(newField[i].childNodes.length>0)
{
newField[i] = counterAppend(newField[i],counter);
}
}
return nodes;
}
函数计数器追加(节点、计数器)
{
var newField=nodes.childNodes;
对于(var i=0;i0)
{
newField[i]=计数器追加(newField[i],计数器);
}
}
返回节点;
}
我在这行中得到了错误:
newField[i]=计数器追加(newField[i],计数器)
在调试中,它说:
断开JS运行时错误-对象不支持此属性或方法
IE8和其他浏览器之间有什么不同,我如何修改它以解决错误?问题:另外,您收到错误时是否检查过?在收到错误之前,您循环了多少次(如果有)?尝试一些输出语句 在DOM中漫游的一些替代算法: 请记住,您可能会遇到以下问题 IE在子节点中不包括仅空白的文本节点 nodeList和其他浏览器一样。我建议你用 改为getElementsByTagName()。这样你也不必这么做 在代码中手动遍历每一级节点 通过
大多数浏览器将正确地查看标签之间的空白 仅包含空白字符(如空格、, 行中断或tab),即使空白空间未被呈现,例如 标签与标签之间的间隙或标签与标签之间的空白间隙 标签。但是,有些浏览器(主要是Internet Explorer 8-)和9+在 怪癖模式)根本不会将此空白区域视为文本节点
通过为什么要将函数的返回赋值回
新字段[i]
?我不知道你希望这能做什么。如果代码只是修改ID/名称,则不需要返回值。我应该认为这是令人困惑的IE,我不知道为什么它不会让其他浏览器困惑…也许这会有所帮助:这可能与childNodes
给你一个数组,而不是数组有关。我有类似的想法,比如@jbabey。尝试将节点列表
转换为数组。你可以找到例子。For IE8For loop
看起来是最好的选择。为什么必须重新影响counterAppend的返回?显然,您只需要更改名称和ID,因此这种装模作样是可选的。@jbabey-如果我要修改的树超过一层,我不需要节点列表吗?可以!谢谢我没有意识到这个函数会影响原始变量,而不是创建另一个同名的局部变量。