2011-02-09 71 views
0

我一直在使用Javascript的一些內存泄漏一段時間了。我已經到了一個地步,我覺得至少有一些泄漏的唯一解決方案是刪除給定的div,然後刪除它的所有後代。意思是孩子,孫輩等JavaScript刪除div /節點的所有後代

現在我感覺我需要一個遞歸函數,如果我想這樣做,但我還是有點新的Javascript。我甚至不知道遞歸在JavaScript中是否與我習慣的一樣。

對於如何做這樣的事情我有任何想法,也許我的想法是遞歸的方式。

+0

遞歸的工作原理是一樣的 - 只需要小心使用用`var`聲明的局部變量而不是全局變量。 (請記住,變量具有函數範圍而不是通常的塊範圍) – hugomg 2011-02-09 20:47:00

回答

1

這將迅速破壞節點及其所有子:

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> 

,因爲它不是關注點分離效果好,這是難以維持,它不能正常傳遞的事件,你可以只連接一個方法。如果你這樣做,你基本上需要做你自己的垃圾收集。

0

我不知道我完全理解你期望的最終結果,但在div的innerHTML設置爲空白屏幕有效地擺脫所有的子節點:

document.getElementById('test').innerHTML = ''; 
0

你可以這樣做:

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); 
    } 
} 

後面的選項可能會更好。