为什么removeChild需要父节点?

问题描述:

应答后this question我在想,为什么removeChild需要父元素。毕竟,我们可以简单地做为什么removeChild需要父节点?

node.parentNode.removeChild(node); 

由于父节点应该总是直接提供给Javascript/DOM引擎,它不是严格需要提供所要删除的节点的父节点。

当然我明白removeChild是DOM节点的方法,但为什么不存在像document.removeNode这样的东西(它只接受任意节点作为参数)?

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

+1

DOM是一个面向对象的概念。这意味着,如果存在'Node.prototype.remove'来移除节点本身比存在'Document.prototype.removeNode'来移除文档中的节点更有意义。因为后者只需通过调用节点父节点上的'removeChild'来实现。 – Gumbo 2010-08-06 09:29:58

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

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

编辑:在回答你的更新,浏览器简单地实现DOM spec,它定义了一个Node方法removeChild。在我看来,的规范必须是明确的,并且没有任何假设。从这个角度来看,它类似于Dependency Injection。 DOM核心规范使用诸如节点,元素等构建块对树进行建模。在这些构建块中的某处添加诸如removeNode等孤立方法意味着该方法具有关于其环境的隐含知识 - 它是某个节点的子节点,如果是的话,它应该从那里删除。

W3的任务是制作一个非常强大的API,它使大多数事情成为可能。他们不应该担心语法糖,因为如果写得很好的话,它总是可以在本地API上编写。

+0

+1这是我认为的更好/正确的解释。 – Sarfraz 2010-08-06 09:27:44

+0

只有一个方面说明:迭戈佩里尼[说](http://twitter.com/diegoperini/status/20580063920)IE和Opera实际上支持['removeNode'](http://msdn.microsoft.com/ en-us/library/ms536708%28VS.85%29.aspx)方法。 – 2010-08-10 12:43:10

混淆可能是因为你可能认为删除元素意味着杀死或摧毁它。

enter image description here

但事实上,removal概念基本上意味着打破一个小孩子与其父之间的关系。这只是一个分队。

enter image description here

因此,去除不具有父节点的元件是没有意义的。如果你想打破父母和孩子之间的联系,那么你需要对两者都有一个参考,这是合理的。

这就是说,有时候你只是想从孩子的父母身上移除一个孩子,而不关心那个父母。这就是DOM Level 4引入ChildNode接口的原因,该接口提供了remove方法。

这个接口是由DocumentTypeElementCharacterData实施,这样你就可以doctypeselementsTextCommentProcessingInstructionnodes使用它。

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

node.remove(); 

在情况下,它已经没有父节点,没有任何反应。