2012-12-22 192 views
13

可能重複:
use remove() on multiple elements通過標籤名稱刪除元素

我想刪除具有的「標籤」標籤名稱的所有元素。我有以下代碼。它在某種程度上起作用,但它只能刪除1個標籤。其他5個仍然存在。如何更改代碼以刪除所有「標籤」標籤?

element = document.getElementsByTagName("label"); 
for (index = 0; index < element.length; index++) { 
    element[index].parentNode.removeChild(element[index]); 
} 

回答

31
var element = document.getElementsByTagName("label"), index; 

for (index = element.length - 1; index >= 0; index--) { 
    element[index].parentNode.removeChild(element[index]); 
} 
+2

我已經扭轉了計數器,因爲如果你增加它,它永遠不會停止:-) – AlfonsoML

+0

@Alfonso感謝您的編輯,這就是我其實是當然的。 :) – Tomalak

2

當您從文檔中刪除節點,你剛剛從getElementsByTagName()獲得的節點列表被更新過,以避免揮之不去的引用,所以你應該保持除去第一點,直到沒有剩餘。

var nodes = document.getElementsByTagName("label"); 

for (var i = 0, len = nodes.length; i != len; ++i) { 
    nodes[0].parentNode.removeChild(nodes[0]); 
} 

這裏,緩存nodes.length的值;否則它會繼續下降,你最終只能刪除一半:)

28

問題是,document.getElementsByTagName()返回NodeList,而不是Array。當您從NodeList中的DOM中刪除元素時,NodeList的內容和長度會更新。因此,當您刪除第一個元素時,NodeList變短,並且新的第一個元素佔用index 0.因此,在循環中更新index因此會使您錯過至少一個元素,可能更多取決於結果的長度。

嘗試是這樣的:

var elements = document.getElementsByTagName('label') 
while (elements[0]) elements[0].parentNode.removeChild(elements[0]) 
+2

+1很好解釋。也比反向循環短。 – Tomalak

+2

不是所有的NodeList都是現場更新:) –

+1

只是踢:'while(elem = elements.pop()){elem.parentNode.removeChild(elem); }(當然,你應該事先聲明'elem') – Zirak

1

「問題」 是.getElementsByTagName()返回直播節點列表。因此,當您移除頭部(第一個)入口時,尾部填滿並且向左移動,可以這麼說。

它不是一個真實的JavaScript數組這將按預期工作。要創建這樣的凍結陣列我們可以去像

var element = Array.prototype.slice.call(document.getElementsByTagName("label"),0); 

for (var index = 0, len = element.length; index < len; index++) { 
    element[index].parentNode.removeChild(element[index]); 
} 
0

爲什麼不使用jQuery?然後,它只是

$("label").remove(); 
相關問題