我有一个复选框列表。对于选中的复选框,我在提交前更改其名称。在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();
}
答案 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
行完全没必要。