我一直在使用Javascript的一些內存泄漏一段時間了。我已經到了一個地步,我覺得至少有一些泄漏的唯一解決方案是刪除給定的div,然後刪除它的所有後代。意思是孩子,孫輩等JavaScript刪除div /節點的所有後代
現在我感覺我需要一個遞歸函數,如果我想這樣做,但我還是有點新的Javascript。我甚至不知道遞歸在JavaScript中是否與我習慣的一樣。
對於如何做這樣的事情我有任何想法,也許我的想法是遞歸的方式。
我一直在使用Javascript的一些內存泄漏一段時間了。我已經到了一個地步,我覺得至少有一些泄漏的唯一解決方案是刪除給定的div,然後刪除它的所有後代。意思是孩子,孫輩等JavaScript刪除div /節點的所有後代
現在我感覺我需要一個遞歸函數,如果我想這樣做,但我還是有點新的Javascript。我甚至不知道遞歸在JavaScript中是否與我習慣的一樣。
對於如何做這樣的事情我有任何想法,也許我的想法是遞歸的方式。
這將迅速破壞節點及其所有子:
var _dummyNode;
var destroy = function(node){
if(!_dummyNode) _dummyNode = document.createElement('div');
_dummyNode.appendChild(node.parentNode.removeChild(node));
_dummyNode.innerHTML = "";
}
destroy(nodeToDestroy);
它創建一個永遠不會被追加到該文檔,這樣不顯示虛擬DIV。該節點將從其父節點中移除並附加到虛擬節點上。然後用innerHTML消除它。
但是,如果仍然有對節點的變量引用,這將失敗。您應該使用一個良好的Ajax庫,並只使用適當的addEventListener來附加事件。你不應該做的事:
<div onclick="myFunction();">click me</div>
,因爲它不是關注點分離效果好,這是難以維持,它不能正常傳遞的事件,你可以只連接一個方法。如果你這樣做,你基本上需要做你自己的垃圾收集。
我不知道我完全理解你期望的最終結果,但在div的innerHTML設置爲空白屏幕有效地擺脫所有的子節點:
document.getElementById('test').innerHTML = '';
你可以這樣做:
function removeChildren(elem){
for(var i in elem.children){
removeChildren(elem.children[i])
elem.removeChild(elem.children[i])
}
}
OR
function removeChildren(elem){
while (elem.hasChildNodes()) {
removeChildren(elem.lastChild)
elem.removeChild(elem.lastChild);
}
}
後面的選項可能會更好。
遞歸的工作原理是一樣的 - 只需要小心使用用`var`聲明的局部變量而不是全局變量。 (請記住,變量具有函數範圍而不是通常的塊範圍) – hugomg 2011-02-09 20:47:00