Hello World! ]PRE] という HTML マークと同じ効果を持ちます。[Q[効果]]という曖昧な言葉を使っているため、 何を指しているのか (レンダリング結果? 出来上がる構造?) はっきりとはしませんが、 ともかくある意味においてこの2例は HTML 的に等価です。 ところが、 SGML 的には、前者は [PRE(HTML)[
Hello World! ]PRE] と等価ですから、両者は異なる構造を持っています。そして、 [CODE(JS)[document.write]] の結果は常に [CODE(HTMLe)[[[body]]]] 内に書込まれるとか (これは先のモデルと矛盾します。)、 [CODE(HTMLe)[[[head]]]] 内にも [CODE(HTMLe)[[[p]]]] 要素が含められるとか (これは HTML DTD と矛盾します。) の仮定を置かない限り、 適切な結果が得られません。 [3] HTML 4 は、次のようにも述べています。 > HTML 文書は、 [CODE(HTMLe)[script]] 要素の処理の前後いずれにおいても HTML DTD に適合するよう制約されます。 [CODE(HTMLe)[script]] の出力であるからといって [CODE(HTMLe)[[[ul]]]] 要素の子供に [CODE(HTMLe)[[[td]]]] 要素があっても困りますから、これは当然の規定といえましょう。 しかし、ここで、 >>2 とも関係しますが、 処理後の適合性は何について判断するのかという疑問が生じます。 [PRE(HTML)[
Hello World!
]PRE] となるなら、当然適合しません。しかし、 [PRE(HTML)[Hello World! ]PRE] となり、更に [PRE(HTML)[
Hello World! ]PRE] と解釈されるなら、この文書片は[[妥当]]です。 また、 [PRE(HTML)[ [INS[...]] A paragraph. [INS[...]] ]PRE] は、果たして [PRE(HTML)[
A paragraph?
]PRE] でしょうか、 [PRE(HTML)[ A paragraph? ]PRE] でしょうか。 (この例はどちらの解釈でも結果は[[妥当]]です。) [4] '''スクリプト実行結果の静的妥当性検証''': >>2-3 のような仕様の解釈に関する問題があるとはいえ、 ある解釈を選べば、ある文書がスクリプト実行後に DTD 妥当であるか否かはスクリプトを実際に実行してみれば容易に判断できます。 一方で、スクリプトを実行せずとも出力が妥当であるかどうかを検証できれば、 ([CODE(JS)[document.write]] はもう使われなくなっていますが、 [[CGIスクリプト]]などにも応用できますから) 便利かもしれません。 実際にその方法を研究していた人もいたようですが、 良い方法は見つかっていません。 [5] '''スクリプト実行後の文書構造''': 現代の UA などは文書をその構造によって保持しています。 HTML 文書は読込まれると構文解析されて [[DOM]] などのモデルによる木として記憶上で持っているか、 持っているかのように操作できるようになっています。 そうすると、 >>2 の規定を忠実に解釈すると、結果の文書木に [CODE(HTMLe)[script]] 要素は含まれないことになってしまいます。 ?? WinIE や Gecko はどうしている ?? また、 [CODE(JS)[document]] 物体は DOM の [CODE(DOMi)[[[Document]]]] 界面の物体 ([[文書要素]]に対応する物体) として再定義されてしまったので、 文書木が完成する前には存在しない虞があります (解析しながら木を作っているなら、 あるかもしれません)。 [6] [[内在事象取扱器]]で [CODE(JS)[document.write]] すると、 新しい文書が作られてそこに書かれるそうです [SRC[18.2.3 Note]]。 それもまたおかしな話です。 [7] [CITE[d:id:quaa]] ([CODE[2006-11-28 10:39:05 +09:00]] 版)