DOMのsplitTextとnormalizeを構成してIDを与える必要がありますか?

StackOverflow https://stackoverflow.com/questions/30049

  •  09-06-2019
  •  | 
  •  

質問

昨日、私は DOM 実装の癖についての議論に巻き込まれ、Text.splitText と Element.normalise の動作、およびそれらがどのように動作するべきかに関する興味深い質問が生まれました。

DOM レベル 1 コア, Text.splitText は次のように定義されています...

この Text ノードを指定されたオフセットで 2 つの Text ノードに分割し、両方を兄弟としてツリー内に保持します。このノードには、オフセット ポイントまでのすべてのコンテンツのみが含まれます。そして、このノードの次の兄弟として挿入される新しい Text ノードには、オフセット ポイント以降のすべてのコンテンツが含まれます。

ノーマライズとは…

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

したがって、textNode で参照される「Hello World」を含むテキスト ノードを取得し、次のようにすると、

textNode.splitText(3)

textNode にはコンテンツ「Hello」と、「World」を含む新しい兄弟が追加されました。

もし私がそのとき

textNode.parent.normalize()

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

動作の選択は実際にはかなり異なっており、どちらが正しいのか、それともこれが単に仕様上の見落としなのか、明確な説明が見つかりません (レベル 2 または 3 では明確になっていないようです)。DOM/XML の専門家は、何か光を当ててくれるのでしょうか?

役に立ちましたか?

解決

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

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top