在回答this question后,我想知道为什么removeChild
需要父元素。毕竟,我们可以简单地做
node.parentNode.removeChild(node);
由于父节点应始终可直接用于Javascript / DOM引擎,因此不一定要提供要删除的节点的父节点。
当然我理解removeChild
是DOM节点的方法的原则,但为什么不存在document.removeNode
之类的东西(只接受任意节点作为参数)?
编辑:为了更清楚,问题是:为什么JS引擎根本就需要父节点,如果它已经有要删除的(唯一)节点?
答案 0 :(得分:7)
我认为它使设计变得简单。节点可能孤立存在,但更有趣的情况是DOM树。对于removeChild
,要删除的节点必须是调用该方法的节点的子节点。
获取所有孩子的列表并对每个孩子进行手动比较并不是那么昂贵的操作。但是,在所有后代中搜索要删除的节点确实很昂贵。
修改:为了响应您的更新,浏览器只是实施DOM spec,它在Node
上定义了removeChild
方法。规范在我看来,必须是明确的,没有假设。从这个角度来看,它类似于Dependency Injection。 DOM Core规范使用诸如Node,Element等构建块对树进行建模。在这些构建块中的某处添加单独的方法(例如removeNode
意味着该方法具有关于其环境的隐式知识 - 它{{1}成为某个节点的子节点,如果是,则应该从那里删除。
w3的任务是创建一个非常强大的API,使大多数事情成为可能。他们不应该担心语法糖,因为如果写得很好,它们总是可以用原生API编写。
答案 1 :(得分:1)
混淆可能是因为您可能认为删除元素意味着杀死或破坏它。
但事实上,removal的概念基本上意味着打破孩子与其父母之间的关系。它只是一个分支。
因此,删除没有父节点的元素是没有意义的。如果你想打破父母和孩子之间的联系,你需要引用这两者,这是合理的。
那就是说,有时候你只想把一个孩子从父母那里移走,而根本不关心那个父母。这就是为什么DOM Level 4引入了ChildNode
接口,它提供了remove
方法。
该界面由DocumentType
,Element
和CharacterData
实施,因此您可以在doctypes,elements和Text
上使用该界面, Comment
和ProcessingInstruction
nodes。
假设node
是其中之一,您可以使用
node.remove();
如果它已经没有父节点,则没有任何反应。