昨日、DOM 実装の癖に関する議論に巻き込まれ、Text.splitText と Element.normalise の動作と、それらがどのように動作するかに関する興味深い質問が生じました。
DOM Level 1 Coreでは、 Text.splitText は次のように定義されています...
この Text ノードを指定されたオフセットで 2 つの Text ノードに分割し、ツリー内で両方を兄弟として保持します。このノードには、オフセット ポイントまでのすべてのコンテンツのみが含まれます。また、このノードの次の兄弟として挿入される新しい Text ノードには、オフセット ポイント以降のすべてのコンテンツが含まれます。
ノーマライズは…
この Element の下のサブツリーの深さ全体にあるすべての Text ノードを、マークアップ (タグ、コメント、処理命令、CDATA セクション、およびエンティティ参照など) のみが Text ノードを分離する「通常の」形式にします。隣接する Text ノードはありません。これは、ドキュメントの DOM ビューが保存されて再ロードされた場合と同じであることを保証するために使用でき、特定のドキュメント ツリー構造に依存する操作 (XPointer ルックアップなど) が使用される場合に役立ちます。
したがって、「Hello World」を含むテキスト ノードを取得し、textNode で参照すると、
textNode.splitText(3)
textNode のコンテンツが「Hello」になり、新しい兄弟に「World」が含まれるようになりました
私なら
textNode.parent.normalize()
textNode とは何ですか? 仕様では、textNode が以前の親の子である必要があることを明確にしておらず、隣接するすべてのテキスト ノードを含むように更新するだけです (その後削除されます)。隣接するすべてのテキストノードを削除してから、値を連結して新しいノードを再作成し、textNode がツリーの一部ではなくなったものを指すようにすることは、準拠した動作のようです。または、splitText と同じ方法で textNode を更新して、ツリーの位置を保持し、新しい値を取得することもできます。
動作の選択は実際にはかなり異なり、どちらが正しいか、またはこれが単に仕様の見落としである場合 (レベル 2 または 3 で明確化されていないようです) についての明確化を見つけることができません。そこにDOM / XMLの専門家が光を当てることができますか?