代码之家  ›  专栏  ›  技术社区  ›  Marcel Korpel

为什么removechild需要父节点?

  •  13
  • Marcel Korpel  · 技术社区  · 14 年前

    回答后 this question 我不知道为什么 removeChild 需要父元素。毕竟,我们可以

    node.parentNode.removeChild(node);
    

    由于父节点应该总是直接对javascript/dom引擎可用,因此不必严格提供要删除的节点的父节点。

    当然,我明白这一原则 搬迁儿童 是一个dom节点的方法,但是为什么 document.removeNode 存在(只接受任意节点作为参数)?

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

    2 回复  |  直到 8 年前
        1
  •  7
  •   Anurag    14 年前

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

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

    编辑 :为了响应您的更新,浏览器只需实现 DOM spec ,它定义了 removeChild 方法对 Node . 规格, 在我看来 ,必须是明确的,没有任何假设。它类似于 Dependency Injection 从这个角度来看。dom核心规范使用构建块(如节点、元素等)为树建模。添加了一个单独的方法,如 removeNode 在这些构建块中的某个地方,意味着该方法对其环境具有隐含的知识——它 may 是某个节点的子节点,如果是,则应将其从该节点中移除。

    W3的任务是创建一个非常健壮的API,使大多数事情成为可能。他们不应该担心语法上的甜头,因为如果本地API写得好的话,这些甜头总是可以写在它们周围的。

        2
  •  1
  •   Oriol    8 年前

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

    但事实上, removal的概念基本上意味着破坏子级和其父级之间的关系。这只是一种超脱。

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

    也就是说,有时候你只是想把孩子从父母身边带走,而根本不关心父母。这就是为什么DOM Level 4引入了 childnode >a>interface,which provides the remove >a>method.

    该接口是由 documenttype= , element. and characterdata. ,因此,您可以在 doctypes , 元素a>和 comment ,and processinginstruction nodes.

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

    node.remove();
    < /代码> 
    
    

    如果它已经没有父节点,则不会发生任何事情。

    enter image description here

    但事实上,removal基本上意味着打破孩子和父母之间的关系。只是一种超然。

    enter image description here

    因此,删除没有父节点的元素是没有意义的。如果你想打破父母和孩子之间的联系,你需要一个对父母和孩子的引用,这是合理的。

    也就是说,有时候你只是想把孩子从父母身边带走,而根本不关心父母。这就是为什么DOM级别4引入了ChildNode接口,它提供remove方法。

    该接口由DocumentType,ElementCharacterData,这样您就可以在doctypes,elementsText,CommentProcessingInstructionnodes.

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

    node.remove();
    

    如果它已经没有父节点,则不会发生任何事情。