2011-05-22 39 views
-1

下面的代码是导致该问题:问题的getElementsByClassName方法

var CheckBoxes = document.getElementsByClassName('DeleteCheckBox') 

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

好,复选框仍然选择了这个运行后。它运行,因为我检查了我的变量,它正在计数。

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

解决:

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

使用InputAttributes.Add(“class”,“DeleteCheckBox”); (asp.net代码隐藏)

+0

它看起来应该工作 - 你确定问题是与getElementsByClassname()?如果您使用document.getElementsByTagName('input'),它会起作用吗? – Guss 2011-05-22 14:56:20

+3

你能证明这个“不工作”吗? – 2011-05-22 14:56:56

+0

那么,复选框仍然被选中... – 2011-05-22 15:02:45

回答

0

那么如果你有副本粘贴的代码:';'缺少 - 建议您使用console.log来检查问题出在哪里[代码是否运行或者在选择时是否是错误]。

+1

从第一行末尾丢失的分号不会是由[分号插入](http://inimino.org/~inimino/blog/javascript_semicolons)引起的任何问题的原因。 – josh3736 2011-05-22 15:13:33

-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;   
} 

在每次迭代的输入变量将得到更新到一个新的号码,但既然你倒计时了,这应该没问题。

+0

这完全不正确。这个清单在你描述的方式上没有任何意义上的“活”。 – Pointy 2011-05-22 15:20:20

+0

幸运的是,您正在缓存该值,然后更改缓存的值。否则,它不会工作,因为'inputs.length'不会改变(因为节点不会去任何地方)。 – 2011-05-22 15:37:51

+0

* HTMLcollection *确实发生了变化,值l不会改变b/c它的缓存和inputs.length不会改变b/c我不会删除className。但是,getElementsByClassName实际上是在循环的每一次循环中运行b/c输入被访问。这里有一个演示给你两个审查http://jsfiddle.net/RWXp6/ – Drew 2011-05-23 02:17:02

1

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