为什么removeChild需要父节点?
-
26-09-2019 - |
题
回答后 这个问题 我想知道为什么 removeChild
需要一个父元素。毕竟,我们可以简单地做
node.parentNode.removeChild(node);
由于父节点应该始终可直接供 Javascript/DOM 引擎使用,因此并不严格需要提供要删除的节点的父节点。
我当然明白这个道理 removeChild
是 DOM 节点的方法,但为什么不类似 document.removeNode
存在(仅接受任意节点作为参数)?
编辑: 更清楚地说,问题是:如果 JS 引擎已经具有要删除的(唯一)节点,为什么它还需要父节点?
解决方案
我认为它使设计保持简单。一个节点 可能 孤立存在,但更有趣的情况是 DOM 树。和 removeChild
, ,要删除的节点必须是调用该方法的节点的子节点。
获取所有孩子的列表并对每个孩子进行手动比较并不是那么昂贵的操作。然而,在所有后代中搜索要删除的节点确实是昂贵的。
编辑: :为了响应您的更新,浏览器只是实现 DOM规范, ,它定义了一个 removeChild
方法上 Node
. 。规格, 在我看来, ,必须是明确的并且没有假设。它类似于 依赖注入 从这个角度来看。DOM Core 规范使用 Node、Element 等构建块对树进行建模。添加一个单独的方法,例如 removeNode
这些构建块中的某个位置意味着该方法对其环境具有隐式知识 - 即它 may
是某个节点的子节点,如果是,则应将其从该节点中删除。
w3 的任务是创建一个非常强大的 API,使大多数事情成为可能。他们不应该担心语法糖,因为如果编写得好,语法糖总是可以围绕本机 API 编写。
其他提示
造成混乱的原因可能是您可能认为删除一个元素意味着杀死或销毁它。
但事实上,这个概念 移动 基本上意味着破坏孩子与其父母之间的关系。这只是一个支队而已。
因此,删除没有父节点的元素是没有意义的。如果你想打破父母和孩子之间的联系,你需要对两者的引用,这是合理的。
也就是说,有时您确实只想将孩子从其父母中删除,而根本不关心该父母。这就是为什么 DOM Level 4 引入了 ChildNode
接口,它提供了 remove
方法。
该接口的实现是 DocumentType
, Element
和 CharacterData
, ,所以你可以使用它 文档类型, 元素 和 Text
, Comment
, , 和 ProcessingInstruction
节点.
假设 node
是其中之一,您可以使用
node.remove();
如果它已经没有父节点,则不会发生任何事情。