8

昨日、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の専門家が光を当てることができますか?

4

3 に答える 3

5

私は初期の DOM ワーキング グループに参加していました。確かに、textNode に新しい結合された値を含めることを意図していたのは確かですが、仕様でそれを述べていない場合、実装によって textNodeを再利用する代わりに新しいノードを作成する可能性があります。実装者。

疑わしい場合は、防御的にプログラムしてください。

于 2008-09-05T13:51:00.943 に答える
2

ここではすべての賭けが外れていると思います。私は確かに、特定の行動に依存することはありません。唯一の安全な方法は、ノードをその親から再度取得することです。

于 2008-09-05T13:34:43.790 に答える
2

合理的な仮定のように思えますが、仕様で明示的に明確化されていないことに同意します。私が追加できるのは、私がそれを読む方法、またはその新しい兄弟のいずれtextNodeか (つまり、 からの戻り値splitText) に新しい結合された値が含まれるということだけです。ステートメントは、サブツリー内のすべてのノードが通常の形式ではなく、サブツリーが新しい構造に正規化されていること。唯一安全なことは、正規化する前に親への参照を保持することだと思います。

于 2008-08-29T08:52:14.900 に答える