Pourquoi removeChild besoin d'un nœud parent?
-
26-09-2019 - |
Question
Après avoir répondu à cette question Je suis à me demander pourquoi removeChild
a besoin d'un élément parent. Après tout, nous pourrions tout simplement faire
node.parentNode.removeChild(node);
En tant que nœud parent doit toujours être disponible directement au moteur Javascript / DOM, il n'est pas strictement nécessaire de fournir le nœud parent du nœud qui est à supprimer.
Bien sûr, je comprends le principe selon lequel removeChild
est une méthode d'un nœud DOM, mais pourquoi ne pas quelque chose comme exist de document.removeNode
(qui accepte simplement un noeud arbitraire en tant que paramètre)?
EDIT: Pour être plus clair, la question est: pourquoi le moteur JS besoin le nœud parent du tout, si elle a déjà le nœud (unique) qui est à supprimer
La solution
Je pense qu'il maintient le design simple. Un noeud peut existent dans l'isolement, mais le cas le plus intéressant est l'arbre DOM. Avec removeChild
, le nœud à supprimer doit être un enfant du nœud sur lequel la méthode a été appelée.
Obtenir une liste de tous les enfants et de faire une comparaison manuelle contre chacun n'est pas une opération coûteuse. Cependant, la recherche de tous les descendants d'un noeud qui doit être enlevé est en effet coûteux.
Modifier : En réponse à votre mise à jour, un navigateur met en œuvre simplement DOM spec , qui définit un removeChild
méthode sur Node
. Les spécifications, à mon avis , doit être sans ambiguïté et sans hypothèses. Il est similaire à injection de dépendances dans cette perspective. Les modèles spécifications DOM de base d'un arbre en utilisant des blocs de construction tels que le nœud, élément, etc. Ajout d'une méthode seule, comme quelque part de removeNode
dans ces blocs de construction signifie que la méthode a connaissance implicite de son environnement - qu'il may
être un enfant d'un noeud, et il doit être retiré de là si elle est.
La tâche de w3 est de faire une API très robuste qui fait la plupart des choses possibles. Ils ne devraient pas vous soucier de sucre syntaxique qui peut toujours être écrit autour des API natives si elles sont bien écrits.
Autres conseils
La confusion pourrait être parce que vous pourriez penser la suppression d'un moyen d'élément quelque chose comme tuer ou détruire.
Mais en fait, le concept de essentiellement des moyens rompre la relation entre un enfant et son parent. Il est juste un détachement.
Par conséquent, la suppression d'un élément qui n'a pas de noeud parent n'a aucun sens. Et il est raisonnable que, si vous voulez briser ce lien entre un parent et un enfant, vous avez besoin d'une référence à la fois.
Cela dit, il est vrai que, parfois, vous voulez juste retirer un enfant de son parent, sans se soucier de ce parent du tout. Voilà pourquoi DOM niveau 4 introduit ChildNode
interface, qui fournit les remove
procédé.
Cette interface est implémentée par DocumentType
, Element
et CharacterData
, de sorte que vous pouvez l'utiliser sur doctypes , et Text
, Comment
et ProcessingInstruction
noeuds .
En supposant node
est l'un de ceux-ci, vous pouvez utiliser
node.remove();
Dans le cas où il a déjà aucun nœud parent, rien ne se passe.