/[pub]/suikawiki/sw4data/ids/2/151.txt
Suika

Contents of /suikawiki/sw4data/ids/2/151.txt

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (hide annotations) (download)
Tue Jan 21 07:58:47 2014 UTC (10 years, 10 months ago) by wakaba
Branch: MAIN
CVS Tags: HEAD
Changes since 1.9: +47 -29 lines
File MIME type: text/plain
updated by (anon)

1 wakaba 1.2
2    
3     * [CODE(DOMa)@en[write]] メソッド (HTML DOM)
4    
5    
6     ** HTML 5
7    
8     @@ TBW
9    
10     [[#comment]]
11    
12    
13     ** HTML 4
14    
15     [1] 仕様書:
16     - [[HTML 4]]
17     -- [CITE[18.2.4 Dynamic modification of documents]]
18     <IW:HTML4:"interact/scripts.html#idx-document">
19     -- [CITE[18.2.3 Intrinsic events]]
20     <IW:HTML4:"interact/scripts.html#idx-control">
21    
22     [2] HTML 4 の 18.2.4 は文書読込み時に実行される[[スクリプト]]による文書内容の動的な編集について触れています。
23     そこでは [CODE(JS)[[[document]].write]]
24     はその実現手段の一例として挙げられていますが、
25     実用的なレベルで存在したもので該当するのは他になかったでしょうし、
26     [[DOM]] が整理される以前の規定ですから、
27     [CODE(JS)[document.write]] と HTML 文書・UA の関係に関する規定と捉えてよいでしょう。
28     また、一般の DOM による操作等は想定範囲外でしょうから、
29     拡大して解釈することには慎重であるべきと考えられます。
30    
31     さて、 18.2.4 によれば、文書の動的な編集は次の通りモデル化できるそうです。
32     = すべての [CODE(HTMLe)[[[script]]]] が、
33     文書の読込まれる順序で評価されます。
34     = [[SGML]] [CODE(SGML)[[[CDATA]]]] を生成する [CODE(HTMLe)[[[script]]]]
35     要素中のスクリプト構造がすべて評価されます。
36     その生成文を結合したものが文書中の [CODE(HTMLe)[[[script]]]]
37     要素の場所に挿入されます。
38     = 生成された [CODE(SGML)[CDATA]] が再評価されます。
39    
40     このモデルは、 SGML 構文解析器で HTML 文書から木構造を抽出し、
41     それを HTML 仕様書の規定する意味と表現によってレンダリングするという
42     SGML 的に本来あるべき UA の処理方法ではなく、 HTML
43     文書を適当に読込みながら適当に解析しつつ適当にレンダリングし続けるという
44     WWW ブラウザの伝統的な処理方法に依拠しているように思えます。
45    
46     [18]
47     HTML 4 仕様書に示された例によれば、
48     [PRE(HTML example code)[
49     <TITLE>Test Document</TITLE>
50     <SCRIPT type="text/javascript">
51     document.write("<p><b>Hello World!<\/b>")
52     </SCRIPT>
53     ]PRE]
54    
55    
56     [PRE(HTML example code)[
57     <TITLE>Test Document</TITLE>
58     <P><B>Hello World!</B>
59     ]PRE]
60    
61     という HTML マークと同じ効果を持ちます。[Q[効果]]という曖昧な言葉を使っているため、
62     何を指しているのか (レンダリング結果? 出来上がる構造?) はっきりとはしませんが、
63     ともかくある意味においてこの2例は HTML 的に等価です。
64    
65     ところが、 SGML 的には、前者は
66     [PRE(HTML invalid example code)[
67     <HTML><HEAD> <TITLE>Test Document</TITLE>
68     <SCRIPT type="text/javascript">
69     document.write("<p><b>Hello World!<\/b>")
70     </SCRIPT>
71     </HEAD></HTML>
72     ]PRE]
73    
74     と等価 (完全に交換可能) であり、
75    
76     ;; 注: これだけでは [CODE(HTMLe)@en[[[body]]]] [[要素]]がないので、
77     [[非妥当]]です。
78    
79     後者は
80     [PRE(HTML example code)[
81     <HTML><HEAD> <TITLE>Test Document</TITLE>
82     </HEAD><BODY><P><B>Hello World!</B>
83     </BODY></HTML>
84     ]PRE]
85    
86     と等価ですから、両者は異なる構造を持っています。そして、
87     [CODE(JS)[document.write]] の結果は常に [CODE(HTMLe)[[[body]]]]
88     内に書込まれるとか (これは先のモデルと矛盾します。)、
89     [CODE(HTMLe)[[[head]]]] 内にも [CODE(HTMLe)[[[p]]]] 要素が含められるとか
90     (これは HTML DTD と矛盾します。) の仮定を置かない限り、
91     適切な結果が得られません。
92    
93     [3] HTML 4 は、次のようにも述べています。
94    
95     > HTML 文書は、 [CODE(HTMLe)[script]] 要素の処理の前後いずれにおいても
96     HTML DTD に適合するよう制約されます。
97    
98     [CODE(HTMLe)[script]] の出力であるからといって
99     [CODE(HTMLe)[[[ul]]]] 要素の子供に [CODE(HTMLe)[[[td]]]]
100     要素があっても困りますから、これは当然の規定といえましょう。
101     しかし、ここで、 >>2 とも関係しますが、
102     処理後の適合性は何について判断するのかという疑問が生じます。
103    
104     [PRE(HTML)[
105     <TITLE>Test Document</TITLE>
106     <SCRIPT type="text/javascript">
107     document.write("<p><b>Hello World!<\/b>")
108     </SCRIPT>
109     ]PRE]
110    
111     が >>2 の SGML 的解釈のように
112     [PRE(HTML invalid example code)[
113     <HTML><HEAD> <TITLE>Test Document</TITLE>
114     <p><b>Hello World!</b>
115     </HEAD></HTML>
116     ]PRE]
117    
118     となるなら、 ([CODE(HTMLe)@en[[[body]]]] [[要素]]がないことには目をつぶっても)
119     [CODE(HTMLe)@en[[[head]]]] [[要素]]内に [CODE(HTMLe)@en[[[p]]]]
120     [[要素]]を入れることはできないので、[[非妥当]]です。しかし、
121     一旦
122     [PRE(HTML example code)[
123     <TITLE>Test Document</TITLE>
124     <p><b>Hello World!</b>
125     ]PRE]
126    
127     となり、更に
128     [PRE(HTML example code)[
129     <HTML><HEAD> <TITLE>Test Document</TITLE>
130     </HEAD><BODY><p><b>Hello World!</b>
131     </BODY></HTML>
132     ]PRE]
133    
134     と解釈されるなら、この文書片は[[妥当]]です。
135    
136     また、
137     [PRE(HTML)[
138     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
139     [INS[...]]
140     <script type="text/javascript">
141     document.write ('<p>');
142     </script>
143     A paragraph.
144     [INS[...]]
145     ]PRE]
146    
147     は、果たして
148     [PRE(HTML)[
149     <p>
150     A paragraph?
151     </p>
152     ]PRE]
153    
154     でしょうか、
155     [PRE(HTML)[
156     <p></p>
157     A paragraph?
158     ]PRE]
159    
160     でしょうか。 (この例はどちらの解釈でも結果は[[妥当]]です。)
161    
162     [4] '''スクリプト実行結果の静的妥当性検証''':
163     >>2-3 のような仕様の解釈に関する問題があるとはいえ、
164     ある解釈を選べば、ある文書がスクリプト実行後に DTD
165     妥当であるか否かはスクリプトを実際に実行してみれば容易に判断できます。
166    
167     一方で、スクリプトを実行せずとも出力が妥当であるかどうかを検証できれば、
168     ([CODE(JS)[document.write]] はもう使われなくなっていますが、
169     [[CGIスクリプト]]などにも応用できますから) 便利かもしれません。
170     実際にその方法を研究していた人もいたようですが、
171     良い方法は見つかっていません。
172    
173     [5] '''スクリプト実行後の文書構造''':
174     現代の UA などは文書をその構造によって保持しています。 HTML
175     文書は読込まれると構文解析されて [[DOM]]
176     などのモデルによる木として記憶上で持っているか、
177     持っているかのように操作できるようになっています。
178    
179     そうすると、 >>2 の規定を忠実に解釈すると、結果の文書木に
180     [CODE(HTMLe)[script]] 要素は含まれないことになってしまいます。
181    
182     ?? WinIE や Gecko はどうしている ??
183    
184     また、 [CODE(JS)[document]] 物体は DOM の [CODE(DOMi)[[[Document]]]]
185     界面の物体 ([[文書要素]]に対応する物体) として再定義されてしまったので、
186     文書木が完成する前には存在しない虞があります (解析しながら木を作っているなら、
187     あるかもしれません)。
188    
189     [6] [[内在事象取扱器]]で [CODE(JS)[document.write]] すると、
190     新しい文書が作られてそこに書かれるそうです [SRC[18.2.3 Note]]。
191     それもまたおかしな話です。
192    
193    
194     ** DOM2 HTML
195    
196     @@ TBW
197    
198     [[#comment]]
199    
200    
201     ** XHTML1 との関係
202    
203     [8]
204     [CITE@ja[空繰再繰 - application/xhtml+xmlなページでdocument.writeを動作させる #2]] ([CODE[2007-05-01 11:21:43 +09:00]] 版) <http://nyarla.net/blog/javascript-tips6>
205     ([[名無しさん]] [WEAK[2007-05-01 02:24:18 +00:00]])
206    
207     [50] [CITE@ja[document.writeを完全にDOM仕様にする - 空繰再繰]] ([TIME[2009-01-10 14:15:20 +09:00]] 版) <http://blog.nyarla.net/2007/11/17/1>
208    
209    
210     ** メモ
211    
212     [7]
213     [CITE[d:id:quaa]] ([CODE[2006-11-28 10:39:05 +09:00]] 版) <http://d.hatena.ne.jp/quaa/20061227#p1>
214     ([[名無しさん]] [WEAK[2006-12-28 01:52:17 +00:00]])
215    
216     [11]
217     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0Adocument.write%20('%3Cstyle%3E%20p%20%7Bcolor%3A%20green%20%7D%20%3C%2Fst')%3B%0A%3C%2Fscript%3Eyle%3E%0A%3Cp%3EPASS%20iff%20green%3C%2Fp%3E>
218    
219     [[Firefox]] 2 も [[WinIE]] 7 も PASS。
220    
221     [12]
222     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0Adocument.write%20('%3Cstyle%3E%20p%20%7Bcolor%3A%20gr')%3B%0A%3C%2Fscript%3Eeen%20%7D%20%3C%2Fstyle%3E%0A%3Cp%3EPASS%20iff%20green%3C%2Fp%3E>
223    
224     [[Firefox]] 2 も [[WinIE]] 7 も PASS。
225    
226     [13]
227     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cp%3EFAIL%3C%2Fp%3E%0A%3Cscript%20defer%3E%0A%20%20document.write%20('%3Cstyle%3Ep%20%7Bcolor%3A%20green%7D%3C%2Fstyle%3E')%3B%0A%3C%2Fscript%3E%0A%3Cscript%20defer%3E%0A%20%20document.write%20('%3Cp%3EPASS%20iff%20green%3C%2Fp%3E')%3B%0A%3C%2Fscript%3E%20%0A%3Cstyle%3E%0Ap%20%7B%20color%3A%20red%20%7D%0A%3C%2Fstyle%3E>
228    
229     [[WinIE 7]] は DOM view はただしいが、なぜか Rendered view
230     には何もレンダリングされない。
231    
232     [[Firefox]] 2 は FAIL ([CODE(HTMLa)@en[[[defer]]]] 未対応)。
233    
234     [14]
235     >>13 の [[WinIE 7]] で[[レンダリング]]されないのは
236     [CODE(HTMLe)@en[[[script]]]] が2つあるかららしく、
237     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cp%3EFAIL%3C%2Fp%3E%0D%0A%3Cscript%20defer%3E%0D%0A%20%20document.write%20('%3Cstyle%3Ep%20%7Bcolor%3A%20green%7D%3C%2Fstyle%3E')%3B%0D%0A%20%20document.write%20('%3Cp%3EPASS%20iff%20green%3C%2Fp%3E')%3B%0D%0A%3C%2Fscript%3E%20%0D%0A%3Cstyle%3E%0D%0Ap%20%7B%20color%3A%20red%20%7D%0D%0A%3C%2Fstyle%3E>
238     なら[[レンダリング]]される。
239    
240     [15]
241     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cp%3EFAIL%3C%2Fp%3E%0D%0A%3Cscript%20defer%3E%0D%0A%20%20document.write%20('%3Cstyle%3Ep%20%7Bcolor%3A%20green%7D%3C%2Fstyle%3E')%3B%0D%0A%20%20document.write%20('%3Cp%3EPASS%20iff%20green%3C%2Fp%3E')%3B%0D%0A%3C%2Fscript%3E%20%0D%0A%3Cscript%3E%0D%0A%20%20document.write%20('%3Cstyle%3Ep%20%7B%20color%3A%20red%20%7D%3C%2Fstyle%3E')%3B%0D%0A%20%20document.write%20('%3Cp%3EFAIL%3C%2Fp%3E')%3B%0D%0A%3C%2Fscript%3E>
242    
243     「CODE(JS)@円「「「document]].[[write]]]] というより
244     [CODE(HTMLa)@en[[[defer]]]] のテスト。
245     [[WinIE 7]] は PASS。
246    
247     後の [CODE(HTMLe)@en[[[script]]]] 内に 「CODE(DOMm)@en[[[alert]]()]] を入れれば、
248     ちゃんと後の [CODE(HTMLe)@en[[[script]]]] も実行されていることが確認できる。
249    
250     [16]
251     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.write%20('%3Cscript%3E%20document.write%20(%22aa%22)%3B%20%3C%2Fsc')%3B%0A%20%20document.write%20('ript%3E')%3B%0A%3C%2Fscript%3E>
252    
253     [[Firefox]] 2 でも [[WinIE 7]] でも、 [CODE(HTMLe)@en[[[script]]]]
254     内の [CODE(HTMLe)@en[[[script]]]] が実行され、[Q[aa]] と[[レンダリング&#65379;&#65379;されます。]]
255     [[HTML 5]] の[[構文解析算法]]でも、ややこしいですがおそらく、
256     [Q[aa]] と&#65378;&#65378;レンダリング]]されるのが正しい動作です。
257     (1つ目の [CODE(JS)@en[[[[document]].[[write]]]]
258     によって行われる[[構文解析]]で、与えられた&#65378;&#65378;引数]]の末尾に到達したところで、
259     [[挿入点]]に到着したということで[[字句化器]]が停止します。
260     [[木構築段階]]は [CODE(HTMLe)@en[[[script]]]]
261     [[開始タグ]]が現れると[[文字字句]]を集め続けますが、
262     それは[[字句化器]]が停止したところで一旦終わるので、
263     [CODE(HTMLe)@en[</[[script]]]] [[終了タグ&#65379;&#65379;の直前までいきます。ここで、 [CODE(JS)@en[[[document]].[[write]]]] は[[返る]]のですが、]]
264     それによって外側の[[構文解析]]が再開されます。そして、
265     次の[[字句]]が [CODE(HTMLe)@en[[[script]]]] の[[終了タグ]]になるので、
266     [[木構築段階]]の [CODE(HTMLe)@en[[[script]]]] [[開始タグ]]の処理の続きで、[[スクリプト]]が実行されます。)
267    
268     [17]
269     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.write%20('%3Cstyle%3E%20p%20%7B')%3B%0Aw(document.documentElement.innerHTML)%3B%0A%20%20document.write%20('color%3A%20gree')%3B%0Aw(document.documentElement.innerHTML)%3B%20%0A%20%20document.write%20('n%20%7D')%3B%0A%3C%2Fscript%3E%3C%2Fstyle%3E%3Cp%3Exxxx>
270    
271     [[WinIE 7]] でも [[Firefox]] 2 でも、緑の[Q[xxxx]]が[[レンダリング]]されます。
272    
273     [19]
274     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.write%20('%3Cstyle%3E')%3B%0Aw%20(document.documentElement.innerHTML)%3B%0A%20%20document.write%20('color%3A%20gree')%3B%0Aw%20(document.documentElement.innerHTML)%3B%20%0A%20%20document.write%20('n%20%7D')%3B%0A%3C%2Fscript%3E%3C%2Fstyle%3E%3Cp%3Exxxx%0A%3Cscript%3E%0Aw%20(document.documentElement.innerHTML)%3B%20%0A%3C%2Fscript%3E%0A%3Cpre%3E%0Axxxx>
275    
276     [CODE(JS)@en[[[document]].[[write]]]] による追加分が [[DOM]] [[木]]に反映されるのはいつか?
277     (ここでは [CODE(DOMa)@en[[[innerHTML]]]] を使用。)
278    
279     - 通常の[[要素]]なら、直前の [CODE(JS)@en[[[document]].[[write]]]]
280     で与えられたものすべてが既に反映済み
281     - [CODE(HTMLe)@en[[[style]]]] [[要素]]の場合、
282     -- [[WinIE 7]] では [CODE(HTMLe)@en[[[style]]]] [[要素]]自体は追加されるが、
283     その[[内容]]は[[終了タグ]]を処理するまで[[空]]のまま
284     -- [[Firefox]] 2 では[[終了タグ]]が処理されるまで
285     [CODE(HTMLe)@en[[[style]]]] [[要素]]自体が追加されない
286    
287     ([[名無しさん]])
288    
289     [20]
290     >>19 [[WinIE 7]] で [CODE(HTMLe)@en[[[style]]]]
291     [[要素]]の [CODE(DOMa)@en[[[sheet]]]]
292     [[属性]]は [CODE(DOM)@en[[[null]]]] になっているようです。
293     ([[名無しさん]])
294    
295     [21]
296     >>20 訂正: [CODE(DOMa)@en[[[styleSheet]]]] [[属性]]。
297     ([[名無しさん]])
298    
299     [22]
300     >>19 [[Opera]] 9.27、[[Safari]] 3.1.1 では、
301     [[WinIE 7]] 同様、[[終了タグ]]を処理するまでは空のままのようです。
302     [CODE(DOMa)@en[[[sheet]]]] [[属性]]は空の[[スタイル・シート]]になっているようです。
303     ([[名無しさん]])
304    
305     [23]
306     >>22 [CODE(DOMa)@en[[[sheet]]]] [[属性]]の指す[[スタイル・シート]]は[[終了タグ]]が処理されるまでずっと空のままのようです。
307    
308     ;; <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0D%0A%20%20document.write%20('%3Cstyle%3E')%3B%0D%0A%20%20document.write%20('p%20%7B%20color%3A%20green%20%7D')%3B%0D%0A%20%20w%20(document.getElementsByTagName%20('style')%5B0%5D.sheet.cssRules.length)%3B%0D%0A%3C%2Fscript%3E%3C%2Fstyle%3E>
309    
310     ([[名無しさん]])
311    
312     [24]
313     [CODE(JS)@en[[[document]].[[write]] ('<pre>\na</pre>')]]
314     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0D%0A%20%20document.write%20('%3Cpre%3E%5Cna%3C%2Fpre%3E')%3B%0D%0A%3C%2Fscript%3E>
315    
316     [[WinIE 7]], [[Firefox]] 2, [[Opera]] 9.27, [[Safari]] 3.1.1 のいずれも、
317     [[開始タグ]]直後の[[改行]]を無視。
318     ([[名無しさん]])
319    
320     [25]
321     [CODE(JS)@en[[[document]].[[write]] ('<pre>'); [[document]].[[write]] ('\na</pre>')]]
322     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.write%20('%3Cpre%3E')%3B%0A%20%20document.write%20('%5Cna%3C%2Fpre%3E')%3B%0A%3C%2Fscript%3E>
323    
324     >>24 の4ブラウザ中、[[Firefox]] 2 だけは[[改行]]を無視''せず''。
325     ([[名無しさん]])
326    
327     [26]
328     [CODE(JS)@en[[[document]].[[write]] ('<pre>', '\na</pre>');]]
329     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.write%20('%3Cpre%3E'%2C%20'%5Cna%3C%2Fpre%3E')%3B%0A%3C%2Fscript%3E>
330    
331     これなら [[Firefox]] 2 も[[改行]]を無視する。
332     ([[名無しさん]])
333    
334     [27]
335     [CODE(JS)@en[[[document]].[[writeln]] ('<pre>'); [[document]].[[write]] ('a</pre>');]]
336     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.writeln%20('%3Cpre%3E')%3B%0A%20%20document.write%20('a%3C%2Fpre%3E')%3B%0A%3C%2Fscript%3E>
337    
338     だけどこっちは [[Firefox]] 2 が[[改行]]を[[無視]]しない。
339     ([[名無しさん]])
340    
341     [28]
342     [[Opera]] 9.27 と [[Safari]] 3.1.1 の結果
343    
344     >>11、>>12 PASS
345    
346     >>13、>>15 FAIL ([CODE(HTMLa)@en[[[defer]]]] 未対応)
347    
348     >>16 同じ (実行される)
349    
350     ([[名無しさん]])
351    
352     [29]
353     >>19 みたいなことを [CODE(HTMLe)@en[[[script]]]]
354     [[要素]]を書き出す場合でやってみた
355     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0Aw%20(document.documentElement.innerHTML)%3B%0A%20%20document.write%20('%3Cscript%3E%20document.')%3B%0Aw%20(document.documentElement.innerHTML)%3B%0A%20%20document.write%20('write%20(%22a%22)%3B%20%3C%2F'%20%2B%20'script%3E')%3B%0Aw%20(document.documentElement.innerHTML)%3B%0A%3C%2Fscript%3E>
356    
357     4ブラウザとも、 [CODE(HTMLe)@en[[[script]]]] [[要素]]が
358     [CODE(DOMa)@en[[[innerHTML]]]] に現れるのは[[終了タグ]]が処理されたあとのようです。
359    
360     この例だと [[Safari]] だけは3番目の [CODE[w]] で生成された
361     [CODE(HTMLe)@en[[[script]]]] [[要素]]によって書き込まれた
362     [CODE[a]] が反映されていないのですが、
363     これはその [CODE(HTMLe)@en[[[script]]]] [[要素]]が実行されていないわけではなく、
364     [[文字データ]]を書いても次の[[タグ]]などが現れるまで
365     [[DOM]] に追加されないという ([[Safari]] だけの) 動作のためのようです。
366     ([[名無しさん]])
367    
368     [30]
369     >>29
370    
371     書き出される [CODE(HTMLe)@en[[[script]]]] [[要素]]が実行される時点での
372     [CODE(DOMa)@en[[[innerHTML]]]] は?
373     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0D%0A%20%20document.write%20('%3Cscript%3E%20w%20(document.documentElement.innerHTML)%3B%20document.')%3B%0D%0A%20%20document.write%20('write%20(%22a%22)%3B%20%3C%2F'%20%2B%20'script%3E')%3B%0D%0A%3C%2Fscript%3E>
374    
375     書き出された [CODE(HTMLe)@en[[[script]]]] [[要素]]が [[DOM]]
376     に追加された状態の [CODE(DOMa)@en[[[innerHTML]]]] が出てくるようです。
377     ([[名無しさん]])
378    
379     [31]
380     >>30 は4ブラウザとも。
381     ([[名無しさん]])
382    
383     [32]
384     [CODE(HTMLe)@en[[[script]]]] の途中からが外側の
385     [CODE(HTMLe)@en[[[script]]]] [[要素]]の後にいっていてもよいのか?
386     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.write%20('%3Cscript%3E%20w%20(document.documentElement.innerHTML)%3B%20document.')%3B%0A%20%20document.write%20('write%20(%22a')%3B%0A%3C%2Fscript%3E%22)%3B%20%3C%2Fscript%3E>
387    
388     4ブラウザともおk ([CODE(HTMLe)@en[[[script]]]]
389     [[要素]]の続きとみなす) のようです。
390     ([[名無しさん]])
391    
392     [33]
393     わけがわからないくらい複雑な例 with [CODE(HTMLe)@en[[[script]]]] [CODE(HTMLa)@en[[[src]]]]
394     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%20src%3D%22javascript%3A'%20document.write%20(%26quot%3Baaaaa%26quot%3B)%3B%20'%22%3E%3C%2Fscript%3E%0A%3Cscript%3E%0A%20%20document.write%20(%22%3Cscript%3Edocument.write%20('%3Cscript%20src%3Djavascript%3A%26apos%3Bdocument.write(%26quot%3Baaaaa%26quot%3B)%3B%26apos%3B%3E%3C%2F'%2C%20'script%3E%3Cscript%3E%20document.wri')%3B%3C%2F%22%2C%20%22script%3E%22)%3B%0A%3C%2Fscript%3Ete%20('ccc')%3B%20%3C%2Fscript%3E>
395    
396     [[Firefox]] 2 では、最初の
397     [CODE(HTMLe)@en[[[script]]]] [[要素]]があるかないか
398     ([CODE(URI)@en[[[javascript]]:]] [[URI]] を使っていることに起因している模様)、
399     [[Live DOM Viewer]] 内で見るかどうか、
400     [[Live DOM Viewer]] でも直接入力か permalink 使用かによって結果が変わってくる
401     (2つ目の [CODE(HTMLe)@en[[[script]]]] による書き込みが反映されたりされなかったりする、というか [CODE(HTMLe)@en[[[script]]]] が [[DOM]]
402     に現れなかったり、 [CODE(HTMLe)@en[[[body]]]] が2つでてきたり、よくわからん。) ようです。
403    
404     ;; [[Live DOM Viewer]] かどうかで結果が変わるのは、
405     [[Live DOM Viewer]] 自体が [CODE(JS)@en[[[document]].[[write]]]] を使っているせいでしょう。
406    
407     ([[名無しさん]])
408    
409     [34]
410     >>33 他の3ブラウザはいずれも [Q[ccc]] とだけでてきます。
411     [[Safari]] と [[WinIE]] は、
412     [CODE(HTMLa)@en[[[src]]]] 内の [CODE(URI)@en[[[javascript]]:]]
413     [[URI]] を実行していないようです。 [[Opera]] は外部スクリプト内の
414     [CODE(JS)@en[[[document]].[[write]]]] を実行していないようです。
415     ([[名無しさん]])
416    
417     [35]
418     >>34 [[Opera]] は [CODE(JS)@en[[[document]].[[write]]]] を実行しないのではなく、
419     [CODE(HTMLa)@en[[[javascript]]:]] [[URI]] を実行はするのですが、
420     最後に得られた[[文字列]]を外部スクリプトとみなすのではないようで、
421     [[エラーコンソール]]に
422     [Q[リンク先のスクリプトを読み込むことができません]]とでてきます。
423     ([[名無しさん]])
424    
425     [36]
426     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%20src%3D%22javascript%3A%20document.write%20('x')%3B%20%22%3E%3C%2Fscript%3E%20%20%20>
427    
428     [[Opera]] では [Q[x]] が [CODE(HTMLe)@en[[[body]]]] [[要素]]中にでてきます。
429    
430     [[Firefox]] の [CODE(HTMLa)@en[[[src]]]] 内の [CODE(URI)@en[[[javascripot]]:]]
431     [[URI]] の実行される文脈では文書本体の [CODE(JS)@en[[[Global]]]]
432     [[物体]]とは違うものを使っているようで、
433     [CODE(JS)@en[[[window]]]] にも [CODE(JS)@en[[[document]]]]
434     にもその他[[大域変数]]にもアクセスできません
435     ([CODE(JS)@en[[[ReferenceError]]]] になります)。
436     ([[名無しさん]])
437    
438     [37]
439     [CITE@en[Hixie's Natural Log: Tag Soup: Blocks-in-inlines]] ([CODE[2008-04-25 22:46:42 +09:00]] 版) <http://ln.hixie.ch/?start=1138169545&count=1>
440     ([[名無しさん]])
441    
442     [38]
443     [CITE@en[Hixie's Natural Log: Why document.write() doesn't work in XML]] ([CODE[2008-04-25 22:48:57 +09:00]] 版) <http://ln.hixie.ch/?start=1091626816&count=1>
444     ([[名無しさん]])
445    
446     [39]
447     [CITE@en[Hixie's Natural Log: Tag Soup: appendChild() of a script that calls document.write()]] ([CODE[2008-04-25 22:49:24 +09:00]] 版) <http://ln.hixie.ch/?start=1155195074&count=1>
448     ([[名無しさん]])
449    
450     [40]
451     [CITE[Index of /tests/adhoc/dom/level0/write]] ([CODE[2008-04-25 23:07:32 +09:00]] 版) <http://hixie.ch/tests/adhoc/dom/level0/write/>
452     ([[名無しさん]])
453    
454     [41]
455     んー、カオス。
456     ([[名無しさん]])
457    
458     [42]
459     [CODE(JS)@en[[[document]].[[write]]]] で始まった
460     [CODE@en[[[CDATA]]]] [[内容モデル旗]]とその[[スクリプト]]の[[終了タグ]]の関係は?
461     <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0A%20%20document.write%20(%22%3Cstyle%3E%20p%20%7B%22)%3B%0A%20%20w%20(document.documentElement.innerHTML)%3B%0A%3C%2Fscript%3E%20color%3A%20green%3B%0A%3Cscript%3E%0A%20%20document.write%20('%7D%20%3C%2Fstyle%3E')%3B%0A%3C%2Fscript%3E%3Cp%3Exxxx%0A>
462    
463     4ブラウザとも、[CODE(HTML)@en[</[[script]]>]] 以後も[[内容モデル旗]]は
464     [CODE@en[[[CDATA]]]] にしたまま処理を続行するようで、
465     次の [CODE(HTML)@en[<[[script]]>]] [[開始タグ]]は[[開始タグ]]ではなく、
466     [[文字データ]]として処理します。
467    
468     ([[名無しさん]])
469    
470     [43]
471     [CITE@en[Live Scripting HTML Parser]] ([CODE[2008-04-27 20:27:04 +09:00]] 版) <http://suika.fam.cx/www/markup/html/scripting-parser/parser>
472     ([[名無しさん]])
473    
474     [44]
475     [CITE[Bug 95487 &#8211; JavaScript-generated table never completes]] ([CODE[2008-06-18 09:05:55 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=95487>
476     ([[名無しさん]])
477    
478     [45]
479     [CITE@ja[document.write()の実行タイミングをずらす方法]] ([CODE[2008-06-22 15:16:43 +09:00]] 版) <http://p2b.jp/index.php?UID=1153728573>
480     ([[名無しさん]])
481    
482     [46]
483     [CITE[最速インターフェース研究会 :: ページレンダリングを妨げないdocument.writeの実装]] ([CODE[2008-06-22 15:21:04 +09:00]] 版) <http://la.ma.la/blog/diary_200612061928.htm>
484     ([[名無しさん]])
485    
486     [47]
487     [CITE[Fenrir's BLog: Ajaxでdocument.writeするJavaScriptへの対策]] ([CODE[2008-06-02 14:24:53 +09:00]] 版) <http://fenrir.naruoka.org/archives/000555.html>
488     ([[名無しさん]])
489    
490     [48]
491     [CITE@ja-JP[野ログはノロキュアMaxHeart - document.writeをバッファリングするJavaScript]] ([[nog]] 著, [CODE[2008-04-18 09:41:41 +09:00]] 版) <http://cureblack.com/20080418.html#p01>
492     ([[名無しさん]])
493    
494    
495     [49]
496     [CITE[Javascriptの外部ファイル内でdocument.writeしたら文字化け(Mac IE 4.5編)]] ([TIME[2007-02-19 06:57:31 +09:00]] 版) <http://www.shtml.jp/mojibake/macie45.html>
497     ([[名無しさん]])
498    
499    
500     [[#comment]]
501    
502    
503 wakaba 1.10 * メモ
504    
505     [51] [CITE@en[Web Applications 1.0 r5616 Change how document.write() is ignored.Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=9767]]
506     ( ([TIME[2010-10-13 06:20:00 +09:00]] 版))
507     <http://html5.org/tools/web-apps-tracker?from=5615&to=5616>
508    
509     [52] [CITE[IRC logs: freenode / #whatwg / 20101013]]
510     ( ([TIME[2010-10-23 23:42:03 +09:00]] 版))
511     <http://krijnhoetmer.nl/irc-logs/whatwg/20101013>
512    
513     [53] [CITE@en[Web Applications 1.0 r6924 More tweaks to the text (including a comment that describes one of the situations in question).Fixing https://www.w3.org/Bugs/Public/show_bug.cgi?id=14275]]
514     ( ([TIME[2012-01-27 09:30:00 +09:00]] 版))
515     <http://html5.org/tools/web-apps-tracker?from=6923&to=6924>
516    
517     [54] [CITE[''''''[''''''whatwg'''''']'''''' HTMLLinkElement.disabled and HTMLLinkElement.sheet behavior]]
518     ( ([TIME[2012-08-28 04:46:43 +09:00]] 版))
519     <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-August/037001.html>
520    
521     [55] [CITE@en[Web Applications 1.0 r7290 Change how <script> is handled in re-entrant parser situations when there's a blocking style sheet.]]
522     ( ([TIME[2012-08-28 13:48:00 +09:00]] 版))
523     <http://html5.org/tools/web-apps-tracker?from=7289&to=7290>
524    
525     [56] [CITE@en[Web Applications 1.0 r7757 Try to define when document.open() doesn't work more precisely.]]
526     ( ([TIME[2013-03-16 07:41:00 +09:00]] 版))
527     <http://html5.org/tools/web-apps-tracker?from=7756&to=7757>
528    
529     [57] [CITE@en[Web Applications 1.0 r7869 Make document.write() a no-op on non-active documents.]]
530     ( ([TIME[2013-05-29 05:47:00 +09:00]] 版))
531     <http://html5.org/tools/web-apps-tracker?from=7868&to=7869>
532    
533     [FIG[
534     [FIGCAPTION[
535     [58]
536     [CITE[新暦と旧暦の変換計算(長期)]] ([TIME[2006-05-28 08:57:13 +09:00]] 版) <http://koyomi8.com/9reki/9rekicgi.htm>
537    
538     ;; [59] [CODE(HTMLa)@en[[[action]]]] を可変にするために [CODE(JS)@en[[[document.write]]]]
539     が使われています。なお[[終了タグ]]は直接 [[HTML]] として記述されています。
540     ]FIGCAPTION]
541    
542     [PRE(HTML code)[
543     <SCRIPT Language="JavaScript">
544     <!--
545     document.writeln('<form NAME="9reki" method="POST" action="' + CGISERVER + 'cgi/9reki_f.cgi">');
546     // -->
547     </SCRIPT>
548     ]PRE]
549     ]FIG]

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24