2011-02-09 69 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); 
    } 
} 

后面的选项可能会更好。