来自JS的剩余复选框名称导致IE运行缓慢,而不是FF?

时间:2009-07-09 16:48:43

标签: javascript html internet-explorer firefox dom

我有一个复选框列表。对于选中的复选框,我在提交前更改其名称。在FF中功能有效。在IE中我得到:

  

此页面上的脚本导致Internet Explorer运行缓慢。如果它   继续运行,你的电脑可能会   变得反应迟钝。

     

您想要中止脚本吗? YES / NO

不确定为什么这个循环在IE中导致问题而不是FF?

 function sub()
{

    var x=document.getElementsByName("user");
    for (i = 0; i < x.length; i++) //for all check boxes
    {
        if (x[i].checked == true)
        {
            x[i].name="id"; //change name of data so we know it is for an id
            //By renaming the first element of the list, we have reduced the length of the list by one 
            //and deleted the first element. This is why we need to keep i at it's current position after a name change.
            i=i-1;  
        }

    }//end for

    document.checks.submit();

}

4 个答案:

答案 0 :(得分:2)

我会避免编写这样的脚本 - 就像有一个for / i ++循环调用一个函数来改变索引作为副作用 - 这是不可预测的。在从循环内部修改列表的同时,通过NodeList运行迭代器。在您恰好知道NodeList的实现方式之前,您无法确定它是否有效。

这很不愉快,但我会先将列表复制到“真正的”数组中,然后重命名。

答案 1 :(得分:1)

Internet Explorer是错误的。它不返回实时节点列表,只返回快照。

使用jQuery等框架是实现完全兼容性的最佳选择。

答案 2 :(得分:1)

这应该适用于实时列表和非实时列表。

但就个人而言,我试图找到输出原始页面的方法,以便服务器可以找出要使用的元素,而不是依赖于javascript来实现它。

 function sub()
{

    var x=document.getElementsByName("user");
    var nodesToChangeIndex=0;
    var nodesToChange=new Array();
    for (i = 0; i < x.length; i++) //for all check boxes
    {
        if (x[i].checked == true)
        {
                nodesToChange[nodesToChangeIndex++] = x[i];
        }

    }//end for

    for(i=0; i < nodesToChangeIndex; i++)
    {
        nodesToChange[i].name="id";
    }
    document.checks.submit();

}

答案 3 :(得分:-1)

编辑:这是错的,尼克是对的。虽然我看起来更加难以确保IE实际上正确地实现了NodeList,因为它仍然听起来像你正在遇到的是IE中的无限循环。

感谢排队,尼克,我今天学到了新东西。 Javascript永远不会让我感到惊讶:)


只是重命名数组中的元素不会将其从数组中删除 - getElementsByName不会持续运行,只是调用它的初始时间。所以IE陷入无限循环,它一直在反复检查相同的已检查元素。老实说,我不确定为什么Firefox也不会陷入同样的​​无限循环中。

据我了解,i=i-1行完全没必要。