Pourquoi removeChild a-t-il besoin d'un noeud parent?

Après avoir répondu à cette question, je me demande pourquoi removeChild besoin d'un élément parent. Après tout, nous pourrions tout simplement faire

 node.parentNode.removeChild(node); 

Comme le nœud parent devrait toujours être directement disponible pour le moteur Javascript / DOM, il n'est pas strictement nécessaire de fournir le nœud parent du nœud qui doit être supprimé.

Bien sûr, je comprends le principe selon lequel removeChild est une méthode d'un noeud DOM, mais pourquoi n'existe-t-il pas quelque chose comme document.removeNode (qui n'accepte qu'un noeud arbitraire en tant que paramètre)?

EDIT: Pour être plus clair, la question est la suivante: pourquoi le moteur JS a-t-il besoin du noeud parent, s'il possède déjà le noeud (unique) qui doit être supprimé?

Je pense qu'il garde le design simple. Un noeud peut exister isolément, mais le cas le plus intéressant est l'arbre DOM. Avec removeChild , le nœud à enlever doit être un enfant du noeud sur lequel la méthode a été appelée.

Obtenir une liste de tous les enfants et faire une comparaison manuelle par rapport à chacun n'est pas une opération coûteuse. Cependant, la recherche de tous les descendants pour un noeud à enlever est en effet coûteuse.

Edit : En réponse à votre mise à jour, un navigateur implique simplement la spécification DOM , qui définit une méthode removeChild sur Node . La spécification, à mon avis , doit être sans ambiguïté et sans hypothèses. Il est similaire à l' Injection de dépendance dans cette perspective. La spécification DOM Core modèle un arbre en utilisant des blocs de construction tels que Node, Element, etc. L'ajout d'une méthode isolée telle que removeNode quelque part dans ces blocs de construction signifie que la méthode a une connaissance implicite de son environnement – qu'il may être un enfant de certains nœuds, Et il devrait être retiré de là, s'il l'est.

La tâche de w3 est de créer une API très robuste qui rend la plupart des choses possibles. Ils ne devraient pas s'inquiéter du sucre syntaxique car ils peuvent toujours être écrits autour des API natives s'ils sont bien écrits.

La confusion pourrait être parce que vous pourriez penser à supprimer un élément signifie quelque chose comme le tuer ou le détruire.

Entrez la description de l'image ici

Mais en fait, le concept de suppression implique essentiellement de briser la relation entre un enfant et son parent. C'est juste un détachement.

Entrez la description de l'image ici

Par conséquent, la suppression d'un élément qui n'a aucun noeud parent n'a aucun sens. Et il est raisonnable que, si vous voulez briser cette connexion entre un parent et un enfant, vous avez besoin d'une référence aux deux.

Cela dit, il est vrai que parfois vous voulez simplement enlever un enfant de son parent, sans s'occuper de ce parent. C'est pourquoi DOM Level 4 introduit l'interface ChildNode , qui fournit la méthode de remove .

Cette interface est implémentée par DocumentType , Element et CharacterData , de sorte que vous pouvez l'utiliser sur les doctypes , les éléments et les nœuds Text , Comment et ProcessingInstruction .

En supposant que le node est l'un de ces éléments, vous pouvez utiliser

 node.remove(); 

Dans le cas où il n'a déjà aucun noeud parent, rien ne se produit.