2010-08-06 19 views
13

Nach der Beantwortung this question Ich frage mich, warum removeChild braucht ein Elternelement. Immerhin konnten wir einfachWarum benötigt removeChild einen Elternknoten?

node.parentNode.removeChild(node); 

tun Da der übergeordnete Knoten immer direkt mit dem Javascript/DOM-Motor verfügbar sein sollte, ist es nicht unbedingt notwendig, den übergeordneten Knoten des Knotens zu liefern, die entfernt werden soll.

Natürlich verstehe ich das Prinzip, dass removeChild eine Methode eines DOM-Knotens ist, aber warum existiert so etwas wie nicht (das akzeptiert nur einen beliebigen Knoten als Parameter)?

EDIT: Um klarer zu sein, die Frage ist: Warum braucht die JS-Engine überhaupt den Elternknoten, wenn sie bereits den (eindeutigen) Knoten hat, der entfernt werden soll?

+1

Das DOM ist ein objektorientiertes Konzept. Das bedeutet, dass es sinnvoller wäre, wenn 'Node.prototype.remove' existieren würde, um den Knoten selbst zu entfernen, als wenn 'Document.prototype.removeNode' existieren würde, um einen Knoten aus dem Dokument zu entfernen. Weil letzteres einfach implementiert würde, indem 'removeChild' auf dem Elternknoten des Knotens aufgerufen wird. – Gumbo

Antwort

7

Ich denke, es hält das Design einfach. Ein Knoten kann isoliert existieren, aber der interessantere Fall ist der DOM-Baum. Bei removeChild muss der zu entfernende Knoten ein Kind des Knotens sein, auf dem die Methode aufgerufen wurde.

Eine Liste aller Kinder zu erhalten und einen manuellen Vergleich zu machen ist nicht so teuer eine Operation. Die Suche nach allen Nachkommen für einen Knoten, der entfernt werden soll, ist jedoch in der Tat teuer.

bearbeiten: Als Antwort auf das Update, ein Browser einfach die DOM spec Implementierung, die eine removeChild Methode auf Node definiert. Die Spezifikation, meiner Meinung nach, muss eindeutig und frei von Annahmen sein. Es ist vergleichbar mit Dependency Injection aus dieser Perspektive. Die DOM-Kernspezifikation modelliert einen Baum unter Verwendung von Bausteinen wie Knoten, Element usw. Das Hinzufügen einer einzelnen Methode wie removeNode irgendwo in diesen Bausteinen bedeutet, dass die Methode implizites Wissen über ihre Umgebung besitzt - dass sie may ein Kind eines Knotens ist. und es sollte von dort entfernt werden, wenn es ist.

Die Aufgabe von w3 ist es, eine sehr robuste API zu erstellen, die die meisten Dinge möglich macht. Sie sollten sich nicht um syntaktischen Zucker kümmern, da dieser immer um die nativen APIs geschrieben werden kann, wenn sie gut geschrieben sind.

+0

+1 Das ist besser/korrekte Erklärung, denke ich. – Sarfraz

+0

Nur noch eine Randbemerkung: Diego Perini [sagte] (http://twitter.com/diegoperini/status/20580063920), dass IE und Opera tatsächlich ein ['removeNode'] unterstützen (http://msdn.microsoft.com/) en-us/library/ms536708% 28VS.85% 29.aspx) Methode. –

1

Die Verwirrung könnte sein, weil Sie vielleicht denken, dass das Entfernen eines Elements etwas wie das Töten oder Zerstören bedeutet.

enter image description here

Aber in der Tat bedeutet der Begriff der removal grundsätzlich die Beziehung zwischen einem Kind und seinen Eltern zu brechen. Es ist nur eine Trennung.

enter image description here

daher ein Element zu entfernen, die keinen Elternknoten hat keinen Sinn macht. Wenn Sie diese Verbindung zwischen einem Elternteil und einem Kind aufheben möchten, benötigen Sie einen Verweis auf beide.

Das heißt, es ist wahr, dass Sie manchmal ein Kind einfach von seinem Elternteil entfernen möchten, ohne sich um diesen Elternteil überhaupt zu kümmern. Aus diesem Grund führt DOM Level 4 die Schnittstelle ChildNode ein, die die Methode remove bereitstellt.

Diese Schnittstelle implementiert wird durch DocumentType, Element und CharacterData, so dass Sie es auf doctypes, elements verwenden können und Text, Comment und ProcessingInstructionnodes.

node Unter der Annahme, eine davon ist, Sie

node.remove(); 

Im Fall können es bereits keinen übergeordneten Knoten hat, passiert nichts.

Verwandte Themen