13

回答完这个问题后,我想知道为什么removeChild需要父元素。毕竟,我们可以简单地做

node.parentNode.removeChild(node);

由于父节点应始终对 Javascript/DOM 引擎直接可用,因此不必提供要删除的节点的父节点。

我当然理解removeChildDOM节点方法的原理,但是为什么不document.removeNode存在类似的东西(仅接受任意节点作为参数)?

编辑:更清楚地说,问题是:如果 JS 引擎已经具有要删除的(唯一)节点,为什么它根本需要父节点?

4

2 回答 2

7

我认为它使设计保持简单。一个节点可能是孤立存在的,但更有趣的情况是 DOM 树。使用removeChild,要删除的节点必须是调用该方法的节点的子节点。

获取所有孩子的列表并对每个孩子进行手动比较并不是那么昂贵的操作。但是,在所有后代中搜索要删除的节点确实很昂贵。

编辑:为了响应您的更新,浏览器只是实现了DOM 规范,该规范定义removeChildNode. 在我看来,规范必须是明确的并且没有假设。从这个角度来看,它类似于依赖注入。DOM Core 规范使用 Node、Element 等构建块对树进行建模。removeNode在这些构建块中的某个位置添加单独的方法意味着该方法对其环境具有隐含的知识——它may是某个节点的子节点,并且它如果是的话,应该从那里删除。

w3 的任务是创建一个非常健壮的 API,使大多数事情成为可能。他们不应该担心语法糖,因为如果写得好,它们总是可以围绕原生 API 编写。

于 2010-08-06T09:26:06.830 回答
1

混淆可能是因为您可能认为删除元素意味着杀死或破坏它。

在此处输入图像描述

但实际上,删除的概念基本上意味着打破孩子与其父母之间的关系。这只是一个支队。

在此处输入图像描述

因此,删除没有父节点的元素是没有意义的。合理的是,如果你想打破父母和孩子之间的联系,你需要参考两者。

也就是说,确实有时您只想将孩子从其父母中移除,而根本不关心该父母。这就是为什么 DOM Level 4 引入了ChildNode提供remove方法的接口。

该接口由DocumentType,Element和实现CharacterData,因此您可以在doctypes元素TextComment、 和节点上使用它。ProcessingInstruction

假设node是其中之一,您可以使用

node.remove();

如果它已经没有父节点,则什么也不会发生。

于 2016-03-15T00:22:25.043 回答