* script 要素 defer 属性 (HTML, XHTML 1)
[1] [[HTML]] の [CODE(HTMLe)[[[script]]]] 要素の
[DFN[[CODE(HTMLa)[defer]] 属性]]は、
そのスクリプトが文書内容を生成しないことを示します。
[2] 仕様書:
- [[HTML 4]]
--
[22]
HTML 4 DTD の[[注釈]] (参考) には
[Q[UA may defer execution of script]]
と書かれています。
** 属性値
[3] この属性は[[真偽値属性]]です。指定すれば真、
省略すれば偽です。
[[#comment]]
** UA による利用
[4] この属性が指定されていると、そのスクリプトが文書の内容を生成しないことを意味します。
[[JavaScript]] の [CODE(JS)[[[document]].[[write]]]] が文書内容生成に該当します。
UA はこの属性が指定されていれば、構文解析とレンダリングを続行できます。
[SRC[HTML 4 18.2.1]]
仕様書は当たり前だと思って書いていないのでしょうが、
文書を読み込みながら構文解析しながらスクリプトを実行しつつレンダリングするという処理モデルが念頭にあるのだと思われます。
レンダリングする文書の内容は普通は鯖から送られてきたものですが、
[CODE(HTMLe)[script]] 要素によって動的に生成されるかもしれません。
ですから、 [CODE(HTMLe)[script]] 要素まで読取り・構文解析・レンダリングが到達したら、
そのスクリプトを実行して結果を反映して続きの構文解析・レンダリングを行わなければなりません。
しかし、スクリプトの内容が関数の定義や[[事象取扱器]]の登録なら、
その時点で行う必要はありません。そこで [CODE(HTMLa)[defer]]
と指定しておけば、 UA は文書全体をレンダリングしてから実行することができます。
[[#comment]]
** 不思議解釈
[19] ''JavaScript質問スレ''
> 703 名前: Name_Not_Found 投稿日: 03/01/31 21:13 ID:???
[PRE[
defer
【誤答例】
スクリプトに文書の表示を生成する要素を含まないことを宣言します。
この要素内のスクリプトが、文書の内容となるものを一切生成しない
(例えば、"document.write" などを使用していない)ことを表わします。
【正答例】
ブロック内にインラインスクリプトがなく、関数だけを含んでいることを示す。
スクリプトが必要になるまでその解析を延期することにより、
ドキュメントのロード時間が短くなり、結果的にパフォーマンスが良くなる
]PRE]
> 704 名前: Name_Not_Found 投稿日: 03/01/31 22:08 ID:???
[PRE[
>>703
http://www.w3.org/TR/1999/REC-html401-19991224/interact/scripts.html#adef-defer
http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/defer.asp
http://www.microsoft.com/japan/developer/library/jpisdk/dhtml/references/html/SCRIPT.htm
つまり誤答例の HTML4 Spec. はウ゛ァカ仕様で
「関数だけを含む」と書いてないMSDN本家も厨房マニュアルで
正答例のMSDN日本語版スハ゛ラシイ!ってことでよろしいか?
]PRE]
[[#comment]]
** 歴史
[27]
[[Ian Hickson]] は当初 [CODE(HTMLa)@en[[[defer]]]]
は相互運用可能に実装されていないとして [[HTML 5]]
に含めないつもりだったようです (たぶん。) が、結局
[CODE(HTMLa)@en[[[src]]]] が指定されている場合にのみ利用できる[[属性]]として
[[HTML 5]] に残りました。
[[#comment]]
** メモ
[23]
> Indicates that the user agent can defer processing of the script. See the defer attribute definition in HTML 4.0.
;;
[24]
> Indicates that the user agent can defer processing of the script. See the defer attribute definition in HTML 4.01.
;;
[20]
[CITE[ishinao.net/mylog - deferとWScript.Shell.Runの第3引数]]
[26] >>20 は [CODE(HTTP)[[[404]]]] なので...
[CITE[ishinao.net/mylog - deferとWScript.Shell.Runの第3引数]]
>
[PRE(example code)[
]PRE]
> みたいなスクリプトで、shell.runの第3引数がtrue(終了するまで待つ)になっているのが効かないのはどうしてだろう? よりローカルな設定ほど強力であるというのが一般的だと思うんだけど、defer設定は何よりも強力ってことなのかなー。
いってることがよくわからない。
[28]
[CITE@ja[「週報」を含むエントリー - Buzzurl '''['''バザール''']''' / ソーシャルブックマーク]] ([TIME[2008-06-08 00:26:54 +09:00]] 版)
[PRE(HTML example code)[
]PRE]
[405] [CITE@en-us[Firefox 3.1 for developers - MDC]] ([TIME[2009-02-08 18:25:06 +09:00]] 版)
>script 要素の defer 属性のサポートが実装されました。
[406] [CITE[script要素のdefer属性の実装 - Thousand Years]] ([TIME[2009-02-03 20:39:32 +09:00]] 版)
[407] [CITE[Firefox_3.5_for_developers#Miscellaneous_new_features]] (Referenced: [TIME[2009-07-12T21:29:47+09:00]])
[408] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-08-08 01:13:50 +09:00]] 版)
[409] [CITE[IRC logs: freenode / #whatwg / 20090721]]
([TIME[2009-09-26 21:27:34 +09:00]] 版)