2012-11-25 25 views
4

可能重複:
Remove all elements with a certain class with JavaScript從節點與同一類中刪除所有的孩子,純JS

如題,谷歌搜索給了我所有的jQuery效果。有沒有這樣的方法?恩。

<div id="container"> 
    <div class="dontdelete">...</div> 
    <div class="deleteme>...</div> 
    <div class="dontdelete">...</div> 
    <div class="deleteme>...</div> 
    <div class="dontdelete">...</div> 
    <div class="deleteme>...</div> 
</div> 

是否有一個純JavaScript的方法來刪除所有具有「deleteme」類的子?提前致謝。

+1

具體上上面鏈接的問題,見http://stackoverflow.com/ a/10842510/541091 –

+0

是的,也許wh我是googling我提到'小孩',所以郵政沒有彈出。 – wtsang02

+0

沒關係 - 我實際上必須非常仔細地搜索以找到適當的問題鏈接到。有_many_相關的jQuery問題,但不是很多普通的JS。 –

回答

10

由於element.getElementsByClassName回報現場節點列表,您可以通過列表需要循環以某種方式(因爲從DOM移除它們從列表中刪除它們爲好)。嘗試是這樣的:

var container = document.getElementById("container"); 
var elements = container.getElementsByClassName("deleteme"); 

while (elements[0]) { 
    elements[0].parentNode.removeChild(elements[0]); 
} 

DEMO:http://jsfiddle.net/sR2zT/1/

或者你可以使用類似element.querySelectorAll選擇的元素,在這裏你可以做這樣的事情:

document.querySelectorAll("#container .deleteme") 
// or 
document.getElementById("container").querySelectorAll(".deleteme") 

在這場景中,你不需要需要做特殊循環,因爲querySelectorAll不包含直播節點列表。

參考文獻:

+1

非常感謝您的回答。 – wtsang02

3

您可能正在尋找getElementsByClassName以獲得您的所有元素。然後你可以使用類似removeChild的東西刪除節點。

​var elements = document.getElementById("container") 
        .getElementsByClassName("deleteme"); ​​​ 

while (elements.length > 0) { 
    elements[0].parentNode.removeChild(elements[0]); 
} 

工作實施例:http://jsfiddle.net/ja4Zt/1/

瀏覽器支持:

這種解決方案的唯一要注意的是,它有在IE有限的支持。根據this table,getElementsByClassName在IE版本9以上實現。

爲了彌補這一點,您可以選擇所有具有ID容器的元素的子節點,遍歷它們並檢查它們是否具有類「deleteme」 ,然後才刪除它們。

+0

是的,這是我一直在尋找。感謝您的回答。 – wtsang02

+0

這不完全正確 - 您的小提琴會引發錯誤(如果您確實關閉了HTML中的引號)。這是因爲'getElementsByClassName'返回一個活動節點的匹配列表。因此,當從0循環到其長度並刪除元素(影響實際列表)時,該項目實際上也會從列表中刪除,並且出現超出界限的錯誤。嘗試使用while循環或從其長度循環到0. – Ian

+0

@Ian謝謝你,我沒有想到這一點!相應地更新我的答案。 –

-1
var divs = document.getElementsByClassName("deleteme"); 
for (var idx = 0; idx != divs.length; idx++) { 
    var div = divs[idx]; 
    while (div.firstChild) 
    div.removeChild(div.firstChild); 
} 

+1

這將獲得文檔中的所有元素,而不是那些僅在#container – Popnoodles

+0

@popnoodles中的問題中未指定的元素。 –

2

這個版本避免了使用哪一個作爲其他人所說的在某些版本的IE不支持.getElementsByClassName()

var divs = document.getElementById("container").childNodes; 
var i = divs.length; 
while(i--) { 
    if(divs[i].className && divs[i].className.indexOf("deleteme") > -1) { 
     divs[i].parentNode.removeChild(divs[i]); 
    } 
}​ 

這也遍歷了結果數組,因此刪除節點不會影響下一次迭代。

小提琴here

+0

我不介意downvote,但它可能很高興知道爲什麼,即使它只是所以我不會在未來使用上述錯誤:) – Bruno

+1

我沒有投票,但你的' - - 我應該是'我 - '。現在的方式,你總是會跳過集合中的第一個項目。 http://jsfiddle.net/BShu4/2/ –

+2

@ user1689607謝謝你給我一個改正它的機會。 – Bruno

相關問題