我一直在使用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