在IE8中遍历DOM断点的递归JavaScript函数

在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++) {

我一直推迟在这里发帖,因为我觉得我还没有能力回馈社区,但这一次让我完全难堪

我有一个递归JavaScript函数,它在节点树中所有id和name元素的末尾追加一个计数器。该功能适用于FF、Chrome、Safari和IE9,但不适用于IE8

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 IE8
For loop
看起来是最好的选择。为什么必须重新影响counterAppend的返回?显然,您只需要更改名称和ID,因此这种装模作样是可选的。@jbabey-如果我要修改的树超过一层,我不需要节点列表吗?可以!谢谢我没有意识到这个函数会影响原始变量,而不是创建另一个同名的局部变量。