Javascript删除div/节点的所有子体

Javascript删除div/节点的所有子体,javascript,memory-leaks,tree,Javascript,Memory Leaks,Tree,我已经研究Javascript中的一些内存泄漏问题一段时间了。我已经到了一个地步,我觉得解决至少一些泄漏的唯一方法是删除一个给定的div,然后删除它的所有后代。指孩子、孙子等 现在我的印象是,如果我想这样做,我需要一个递归函数,但我对Javascript还是有点陌生。我甚至不知道递归在Javascript中的工作方式是否与我习惯的相同 我愿意接受任何关于如何做这样一件事的想法,也许我对递归的想法有点不理解。我不知道我是否完全理解您想要的最终结果,但是将div的innerHTML设置为空白屏幕可以

我已经研究Javascript中的一些内存泄漏问题一段时间了。我已经到了一个地步,我觉得解决至少一些泄漏的唯一方法是删除一个给定的div,然后删除它的所有后代。指孩子、孙子等

现在我的印象是,如果我想这样做,我需要一个递归函数,但我对Javascript还是有点陌生。我甚至不知道递归在Javascript中的工作方式是否与我习惯的相同


我愿意接受任何关于如何做这样一件事的想法,也许我对递归的想法有点不理解。

我不知道我是否完全理解您想要的最终结果,但是将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 _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>
点击我

因为它不能很好地分离关注点,很难维护,不能正确地传递事件,并且只能附加一个方法。如果你这样做的话,你基本上需要自己做垃圾收集。

递归的工作原理是一样的——只是要小心使用
var
声明的局部变量,而不是全局变量。(记住变量有函数作用域而不是通常的块作用域)可能的重复,如果没有,这个问题有有用的答案?我知道jQuery有一个
empty()。如果Prototype/MooTools等中没有对等的工具,我会感到惊讶。