Frage

Gestern war ich in eine Diskussion über die Eigenheiten der DOM-Implementierung verwickelt, die eine interessante Frage zum Verhalten von Text.splitText und Element.normalise aufwarf und wie sie sich verhalten sollten.

In DOM Level 1 Core, Text.splitText ist definiert als...

Teilt diesen Textknoten am angegebenen Offset in zwei Textknoten auf und behält beide als Geschwister im Baum bei.Dieser Knoten enthält dann nur noch den gesamten Inhalt bis zum Versatzpunkt.Und ein neuer Textknoten, der als nächster Geschwisterknoten dieses Knotens eingefügt wird, enthält den gesamten Inhalt am und nach dem Versatzpunkt.

Normalisieren ist...

Bringt alle Textknoten in der gesamten Tiefe des Unterbaums unter diesem Element in eine „normale“ Form, in der nur Markup (z. B. Tags, Kommentare, Verarbeitungsanweisungen, CDATA-Abschnitte und Entitätsverweise) Textknoten trennt, d. h. es gibt keine angrenzenden Textknoten.Dies kann verwendet werden, um sicherzustellen, dass die DOM-Ansicht eines Dokuments dieselbe ist, als ob es gespeichert und erneut geladen würde, und ist nützlich, wenn Vorgänge (z. B. XPointer-Suchen) verwendet werden sollen, die von einer bestimmten Dokumentbaumstruktur abhängen.

Wenn ich also einen Textknoten nehme, der „Hello World“ enthält, auf den in textNode verwiesen wird, und das tue

textNode.splitText(3)

textNode hat jetzt den Inhalt „Hello“ und einen neuen Geschwisterknoten, der „World“ enthält.

Wenn ich dann

textNode.parent.normalize()

Was ist textNode??Aus der Spezifikation geht nicht klar hervor, dass textNode immer noch ein untergeordnetes Element des vorherigen übergeordneten Elements sein muss, das lediglich aktualisiert wird, um alle angrenzenden Textknoten zu enthalten (die dann entfernt werden).Es scheint ein konformes Verhalten zu sein, alle angrenzenden Textknoten zu entfernen und dann einen neuen Knoten mit der Verkettung der Werte neu zu erstellen, sodass textNode auf etwas zeigt, das nicht mehr Teil des Baums ist.Oder wir können textNode auf die gleiche Weise wie in splitText aktualisieren, sodass es seine Baumposition beibehält und einen neuen Wert erhält.

Die Wahl des Verhaltens ist wirklich ganz anders, und ich kann keine Klarstellung dazu finden, welches richtig ist oder ob es sich lediglich um ein Versehen in der Spezifikation handelt (es scheint in den Stufen 2 oder 3 nicht geklärt zu sein).Können irgendwelche DOM/XML-Gurus da draußen etwas Licht ins Dunkel bringen?

War es hilfreich?

Lösung

Ich war in den Anfangstagen Mitglied der DOM-Arbeitsgruppe;Ich bin sicher, wir gemeint damit textNode den neuen verbundenen Wert enthält, aber wenn wir das nicht getan haben sagen es in der Spezifikation, es ist möglich, dass manche Implementierung könnte Erstellen Sie einen neuen Knoten, anstatt textNode wiederzuverwenden, obwohl dies mehr Arbeit für die Implementierer erfordern würde.

Im Zweifelsfall sollten Sie defensiv programmieren.

Andere Tipps

Obwohl dies eine vernünftige Annahme zu sein scheint, stimme ich zu, dass sie in der Spezifikation nicht ausdrücklich klargestellt wird.Ich kann nur hinzufügen, dass ich es so lese, dass es eines von beidem ist textNode oder es ist ein neues Geschwisterchen (d. h.Rückgabewert von splitText) würde den neuen verbundenen Wert enthalten – die Anweisung gibt an, dass alle Knoten im Unterbaum werden in Normalform gebracht, nicht dass der Unterbaum auf eine neue Struktur normalisiert wird.Ich denke, die einzig sichere Sache besteht darin, vor der Normalisierung einen Verweis auf das übergeordnete Element beizubehalten.

Ich denke, hier ist alles möglich;Ich würde mich auf keinen Fall auf ein bestimmtes Verhalten verlassen.Die einzig sichere Möglichkeit besteht darin, den Knoten erneut von seinem übergeordneten Knoten abzurufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top