【问题标题】:If I remove a node's children without removing *their* children first, what happens to these grandchildren?如果我删除一个节点的子节点而不先删除 *他们的 * 子节点,这些孙子节点会发生什么?
【发布时间】:2017-11-01 02:06:52
【问题描述】:

我有一个容器节点,我在其中附加了许多标签,每个标签都有自己的子节点:

var container = document.getElementById("my_container");
var my_label, some_element, other_element;
for (let i=0;i<some_number;i++) {
    container.appendChild(my_label);
    my_label.appendChild(some_element);
    my_label.appendChild(other_element);
}

在某个时候,我从容器中删除了 my_label 的所有实例,因此我可以将其他元素添加到容器中:

while (container.hasChildNodes()) {
     container.removeChild(container.lastChild);
}

请注意,这样做时,我不会删除 some_element 和 other_element 的任何实例。 my_label 的这些孩子会怎样?我的代码是否干净,还是应该先删除 my_label 的所有子项,然后再删除 my_label?

提前感谢您的智慧!

【问题讨论】:

  • 问题代码有什么问题?
  • 只要没有东西持有对它们的引用(例如存储在某个变量中),它们迟早会被垃圾收集。请注意,如果您将 my_label 设置为相同的元素,它仍将持有对该元素及其子元素的引用,因此在变量被清除/垃圾收集之前,两者都不会被垃圾收集
  • guest271314:我不确定我的代码是否确实存在问题——这就是我问这个问题的原因。我是 Javascript 新手。
  • Patrick Evans:感谢您的提醒。

标签: javascript html nodes children


【解决方案1】:

my_label 的这些孩子会怎样?

什么都没有。它们不再被任何脚本变量或 DOM 引用,因此它们将与标签一起被垃圾收集。

我的代码干净吗?

是的。

我是否应该先删除 my_label 的所有子项,然后再删除 my_label?

不,您不需要递归遍历整个 DOM 子树并将所有内容分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多