2012-01-31 67 views
0

我的javascript函數只改變了四個類中的兩個。如果再次單擊它,則會更改第三個,但完全忽略最後一個。javascript改變一個類的名字

function move(obj,obj2) { 
    var _elements = document.getElementsByClassName(obj); 
    document.getElementsByClassName(obj2).className = 'none'; 

    for(var i = 0; i < _elements.length; i ++){ 
     _elements[i].className ='none'; 
    } 
} 
<a href="javascript: move('bigbox','bigbox_submit');" id="closebigbox" >Clear</a> 

<form> 
    <input type="text" class="bigbox" /><br/> 
    <input type="text" class="bigbox" /><br/> 
    <input type="text" class="bigbox" /><br/> 
</form> 
<a href="javascript:" class="bigbox_submit" >Submit</a> 

我如何使它停止這樣做,並在同一時間執行。

+1

您可以通過實際詢問問題來改善這一點。至少請說明你想要的結果。 – jessegavin 2012-01-31 21:29:31

回答

4

方法document.getElementsByClassName()返回一個NodeList,這是一個「活」的對象。也就是說,隨着DOM的變化,NodeList實例也隨之改變。因此,每次更改節點列表中某個元素的類時,該元素將從節點列表中刪除,因爲它不再與該類相匹配。您可以使用while循環,而不是:

var _elements = document.getElementsByClassName(obj); 
while (_elements.length) { 
    _elements[0].className ='none'; 
} 

的第二個問題是,你分配一個名爲classNameNodeList對象屬性。這不會影響該對象中的任何元素。您需要設置NodeList中元素的className

document.getElementsByClassName(obj2)[0].className = 'none'; 
+0

擊敗我。這是一個免費的演示:http://jsfiddle.net/j49vB/1/ – paislee 2012-01-31 21:42:11

2

.getElementsByClassName()方法應該返回一個NodeList(儘管根據MDN大多數瀏覽器返回一個HTMLCollection),這意味着您需要像訪問數組一樣訪問它。所以你不能直接在返回設置.className和替代:

document.getElementsByClassName(obj2).className = 'none'; 

您需要:

var els = document.getElementsByClassName(obj2), 
    i; 
for (i = els.length - 1; i >= 0; i--) 
    els[i].className = 'none'; 

// or if you know there will always be exactly one element returned: 
document.getElementsByClassName(obj2)[0].className = 'none', 

我已經設置循環倒計時的原因是一個節點列表應該是活的,所以如果你開始修改列表中的元素,他們可能會從列表中消失並弄亂你的櫃檯。