replaceWholeText(Document Object Model Core)

分かり辛いという噂。あちこちに書かれた命題を整理してみる。replaceWholeTextメソッドを呼ぶと:

  • 当該ノードのテキストと、全てのlogically-adjacentなTextノード(CSSの匿名ブロックを連想すると分かりやすい)を明示されたテキストで置換する
  • 当該ノードが置換テキストの容器でない限り、全てのlogically-adjacentなTextノードは削除される(<p>spam<![CDATA[eggs]]></p>において、当該ノードがspamをdataにもつTextノードだったら、隣のCDATASectionノードは削除されるということ)
  • 置換テキストが空文字列だった場合、nullが返る
  • 当該ノードが読み取り専用である場合(親がEntityReferenceの場合しかないよな)を除き、当該ノードが返る
  • (当該ノードが読み取り専用だった場合?)置換位置に挿入された当該ノードと同じタイプの、新たなテキストノード(Text または CDATASection)が返る
  • 削除されるノード達がEntityReferenceの読み取り専用の子孫であるなら、そのEntityReferenceはそれらの読み取り専用ノード達の代わりに削除されなければならない
  • 削除されるEntityReferenceが、EntityReference、Text、CDATASectionのいずれでもない子孫を持っているなら、replaceWholeTextメソッドは文書の変更を行う前に、NO_MODIFICATION_ALLOWE_ERRコードのDOMExceptionを発生させて失敗しなければならない

ここまではいいとして。

  • NO_MODIFICATION_ALLOWED_ERRコードのDOMExceptionが発生するのは、置換されようとしているTextノードの一つが読み取り専用だった場合

「置換されようとしているTextノードが読み取り専用だった場合」は、親のEntityReferenceが削除されて新しいTextノードが作成されるンじゃあないのかい。そのEntityReferenceの子供にEntityReference、Text、CDATASection以外の子供がいたら、その時にDOMExceptionが発生する……って上に書いてあるじゃねえか。だから、置換されようとしているTextノードが読み取り専用だったとしても、DOMExceptionが発生するとは限らない筈なのに。

それとも、親がEntityReferenceでないのに読み取り専用のTextノードがあるということなのか……。

因みにlogically-adjacentなTextノード達というのは、あるTextノードを出発点と考えた時、preceding軸、following軸、ancestor軸とdescendant軸を、Element、Comment、ProcessingInstructionノードにぶつからない限り遡及的に辿っていった時のTextまたはCDATASectionノード達。要するにCSSでは一つの匿名ブロックとして扱われるノード達のこと。EntityReferenceノードを扱う場合、この匿名ブロックが糞ややこしいツリー構造を持ちうる。その糞ややこしい匿名ブロックという単位でテキストを置換できるのがreplaceWholeTextメソッド。

実況、解説者へ
  • 「まあ、」で始めずとも会話は出来ることを教えてやる
  • 「ねえ」で終えずとも会話は出来ることを教えてやる