getElementsByClassName的问题

时间:2011-05-22 14:51:20

标签: javascript

以下代码导致问题:

var CheckBoxes = document.getElementsByClassName('DeleteCheckBox')

for (var i = 0; i < CheckBoxes.length; i++) {
    CheckBoxes[i].checked = false;        
}

嗯,此次运行后仍然会选中复选框。它运行,因为我检查了i变量,它正在计数。

这里有什么问题?顺便说一句,只有复选框有“DeleteCheckBox”类,因此getElementsByClassName只返回复选框。

解决:

我发现了问题。我正在使用asp.net,框架似乎将类分配给复选框的“标签”(它创建一个span标签),而不是输入。

使用InputAttributes.Add(“class”,“DeleteCheckBox”)修复; (asp.net codebehind)

3 个答案:

答案 0 :(得分:1)

你的代码非常好。在网页上,右键单击并检查源。如果您没有看到<input type="checkbox" class="DeleteCheckBox" ...>,那么您正在查找错误的地方。您的JS代码假定类DeleteCheckBox应用于复选框。修复你的标记。

答案 1 :(得分:0)

好吧,如果你复制粘贴代码:';'缺少 - 建议您使用console.log来检查问题所在[在选择时代码是否运行或是他们的错误]。

答案 2 :(得分:-1)

由于我没有时间编写完整的演示版,我正在考虑这个问题。 getElementsByClassName创建一个称为HTMLcollection的东西。 HTML集合是实时列表,这意味着每次访问它们时,它们都会重新运行用于生成集合的查询。

每次更新checked属性时,都会运行getElementsByClassName并生成一个新集合。因此,如果有10个输入框,则删除一个此类,现在有9个,变量更新为9.如果将此更改为getElementsByTagName('input'),此方法将起作用,因为当重新运行查询时没有任何更改。但是,您可能不希望点击页面上的每个输入。此外,由于您构建循环的方式,性能仍然很糟糕。

在这里阅读更多内容 https://developer.mozilla.org/en/DOM/HTMLCollection

以下是如何重构并使其运行速度提高1000%并且它应该像您期望的那样“正常工作”

var inputs = document.getElementsByClassName('DeleteCheckBox'),
    l = inputs.length;
while( l-- ) {
  inputs[ l ].checked = false;        
}

在每次迭代中,输入变量将更新为新数字,但由于你倒计时这应该没问题。