2008-08-27 4 views
6

昨日私はDOM実装の話題について議論に巻き込まれ、Text.splitTextとElement.normaliseの振る舞いに関する興味深い質問が出てきました。 DOM Level 1 CoreIDを与えるためにDOM splitTextとnormalizeを作成する必要がありますか?

、Text.splitText指定兄弟の両方のツリーに保ち、オフセット2つのテキスト・ノードにこのテキストノード

ブレーク...として定義されます。このノードには、オフセットポイントまでのすべてのコンテンツのみが含まれます。このノードの次の兄弟として挿入される新しいTextノードには、オフセットポイント以降のすべてのコンテンツが含まれます。ノーマライズは

...

は、「通常の」形態のみマークアップ(例えば、タグ、コメント、処理中にこの素子の下のサブツリーの全深さにあるすべてのテキストノードを置きます命令、CDATAセクション、およびエンティティ参照)は、テキストノードを区切ります。つまり、隣接するテキストノードはありません。これは、ドキュメントのDOMビューが保存され再ロードされた場合と同じであることを保証するために使用され、特定のドキュメントツリー構造に依存する操作(XPointerルックアップなど)が使用される場合に便利です。だから、

、私はtextNodeで参照の "Hello World" を含むテキストノードを、取り、

textNode.splitText(3) 

textNodeは今コンテンツ "こんにちは"、および "World" を含む新しい兄弟を持っていない場合

私はその後、

textNode.parent.normalize() 

textNode何ですか?この仕様では、textNodeが以前の親の子である必要があることを明確にしていません。隣接するすべてのテキストノードを含むように更新されただけです(削除されます)。隣接するすべてのテキストノードを削除し、値の連結を持つ新しいノードを再作成し、textNodeがツリーの一部ではないものを指し示すようにすることは、コンコンロールの動作のようです。あるいは、splitTextと同じ方法でtextNodeを更新することができるので、ツリー位置を保持して新しい値を取得します。

動作の選択は実際にはまったく異なりますが、どちらが正しいのか、これが仕様上の見落としであるかはわかりません(レベル2またはレベル3では明確ではないようです)。そこにDOM/XMLの教祖はいくつかの光を放つことができますか?

答えて

3

私は初期のDOMワーキンググループに所属していました。私たちは新しい参加値を含むようにtextNodeためを意味確信しているが、我々はが、それは仕様でを言わなかった場合、それは、一部実装代わりtextNodeを再利用する新しいノードを作成することがありますいる可能性があります実装者にはもっと多くの作業が必要です。

疑わしいときは、防衛的にプログラムしてください。

1

これは合理的な仮定のように見えますが、仕様で明白に明示されていないことに同意します。私が追加できるのは、textNodeか、新しい兄弟(つまり、戻り値はsplitText)のいずれかのいずれかで、新しい結合値が含まれているということです。サブツリーのすべてのノードが挿入されます。サブツリーが新しい構造に正規化されているわけではありません。私は唯一の安全なことは、正規化する前に親に参照を保持することだと思います。

1

私はすべての賭けがここにあると思います。私は確かに与えられた行動に依存しないでしょう。唯一安全なことは、親ノードを再び取得することです。

関連する問題