2011-05-22 53 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應用於複選框。修正你的標記。