2013-07-23 86 views
2

我正在與我正在處理的JavaScript函數作鬥爭。變量變成未定義的循環內

在for循環中,我遍歷所有具有類「可見」的元素,在該循環中 我正在執行兩個操作。

  1. elements [i] .removeAttribute(「class」);
  2. elements [i] .setAttribute(「class」,「hidden」);

由於某些原因,只有1是有效的。 2產生錯誤說:

Uncaught TypeError: Cannot call method 'setAttribute' of undefined 

即使我使用console.log記錄元素[i];之後第一個console.log調用 該元素存在,但在第二個console.log元素[i]是'undefined'

我到底錯過了什麼,這讓我瘋狂,如果我的筆記本電腦不是'如此昂貴的 它現在會被打破。說明:(

這裏的功能:。

function hide_visable_elements() 
{ 
    // remove body EventListener 
    var body = document.getElementsByTagName("body"); 
    body[0].removeEventListener("click", hide_visable_elements, true); 

    var elements = document.getElementsByClassName("visible"); 

    for (var i = 0; i < elements.length; i++) 
    { 
     console.log(elements[i]); // Works like a swiss clock 

     elements[i].removeAttribute("class"); 

     console.log(elements[i]); // why elements[i] is 'undefined' now ??? 

     elements[i].setAttribute("class", "hidden"); // << turns to useless code 
    } 
} 
+1

只是一個猜測。當你刪除'class'時,元素會從數組中刪除,因爲它不再符合條件。你有沒有想過使用jQuery?它會讓事情變得更容易。 –

+1

如果你已經從元素中移除了''''類,你也將它從具有該類的元素集中移除了。基本上,你擦除了這個元素。 – DevlshOne

+0

如果使用Jquery的.removeClass(),則更簡單。 –

回答

1

getElementsByClassName是一個生活NodeList如此改變className的項目立即影響整個名單。我會推薦使用querySelectorAll insead。

Plus而不是var body = document.getElementsByTagName("body");使用document.body

+0

你能再次提供querySelectorAll的例子嗎?我正在學習。 –

+1

當然,http://jsfiddle.net/DchvR/ – dfsq

+0

謝謝。順便說一句,爲什麼我應該使用document.body?性能?編輯:使用document.body沒有找到任何身體標籤。 –

6

這是因爲getElementsByClassName返回NodeList,這是現場也就是說,它更新自身時,它指的元素來改變

當您從NodeList中的某個元素中刪除class屬性時,它將從該列表中刪除(因爲它不再具有visible類名稱)。

您實際上並不需要刪除該屬性。只要設定它就可以完成這項工作。但由於NodeList正在改變,因爲你操縱它包含的元素,需要通過它倒數(如每次更改它的一個元件,它被移除,使得所述長度減少一個):

for (var i = elements.length - 1; i >= 0; i--) { 
    elements[i].setAttribute("class", "hidden"); 
} 
+0

這兩個操作是強制性的,以實現css轉換。如果這就是你的意思。 –

1

由於您使用類getElementsByClassName("visible");選擇了元素,因此我認爲問題是elements[i].removeAttribute("class");。我想是的,當你從元素中完全刪除類屬性時,事情就會出錯。

嘗試使用代碼進行一些調整。 如果您打算使用使用類屬性選擇的相同元素,則不會刪除屬性類。