[21] script
要素の defer
属性は、構文解析が完了してからスクリプトを実行するべきことを表します。
[8] defer
属性は、
スクリプトがどう処理されるべきかを指定するものです。 >>7
[10] script
要素の種別が古典スクリプトの場合で、
async
属性が指定されない場合には、
defer
属性が指定されると、
構文解析と並列に fetch が行われ、
構文解析が完了してから評価されます。
async
属性も defer
属性も指定されない場合には、 fetch と評価が直ちに行われ、
その後構文解析が再開されます。 >>7
[12] script
要素の種別が古典スクリプトで、
async
属性が指定されていない時、
defer
属性が効果を持ちます。
[17] defer
属性は、 async
属性が指定されている場合であっても、 async
未対応の利用者エージェントでの動作を考慮して、指定することができます >>7。
しかしどの Webブラウザーも async
に対応した現在となっては、その必要ももう無さそうです。
HTMLScriptElement
インターフェイス defer
属性[29] HTMLScriptElement
インターフェイスの
defer
IDL属性は、
defer
内容属性を反映しなければなりません
>>6。これはブール値として反映するものです。
[15] HTML4 時代には defer
属性は定義こそされていましたが、
スクリプトの処理モデル自体が規定されていないため仕様書の説明もほとんど意味不明でした。
そのためか世間に流布している解説の類も混乱していました。唯一 IE
が実装していましたが、それが仕様書と合致しているのかもよくわからない状況でした。
[1] HTML の script
要素の
defer
属性は、
そのスクリプトが文書内容を生成しないことを示します。
[2] 仕様書:
[22]
HTML 4 DTD の注釈 (参考) には
UA may defer execution of script
と書かれています。
[4] この属性が指定されていると、そのスクリプトが文書の内容を生成しないことを意味します。
JavaScript の document.write
が文書内容生成に該当します。
UA はこの属性が指定されていれば、構文解析とレンダリングを続行できます。
HTML 4 18.2.1
[14] 仕様書は当たり前だと思って書いていないのでしょうが、
文書を読み込みながら構文解析しながらスクリプトを実行しつつレンダリングするという処理モデルが念頭にあるのだと思われます。
レンダリングする文書の内容は普通は鯖から送られてきたものですが、
script
要素によって動的に生成されるかもしれません。
ですから、 script
要素まで読取り・構文解析・レンダリングが到達したら、
そのスクリプトを実行して結果を反映して続きの構文解析・レンダリングを行わなければなりません。
しかし、スクリプトの内容が関数の定義や事象取扱器の登録なら、
その時点で行う必要はありません。そこで defer
と指定しておけば、 UA は文書全体をレンダリングしてから実行することができます。
Indicates that the user agent can defer processing of the script. See the defer attribute definition in HTML 4.0.
Indicates that the user agent can defer processing of the script. See the defer attribute definition in HTML 4.01.
[20] ishinao.net/mylog - deferとWScript.Shell.Runの第3引数 <http://mylog.ishinao.net/id/1190>
ishinao.net/mylog - deferとWScript.Shell.Runの第3引数 <http://web.archive.org/web/20050302231327/http://mylog.ishinao.net/id/1190>
<script type="text/javascript" defer> var shell = new ActiveXObject("WScript.Shell"); shell.run("notepad.exe", 1, true); alert("end"); </script>みたいなスクリプトで、shell.runの第3引数がtrue(終了するまで待つ)になっているのが効かないのはどうしてだろう? よりローカルな設定ほど強力であるというのが一般的だと思うんだけど、defer設定は何よりも強力ってことなのかなー。
いってることがよくわからない。
[27]
Ian Hickson は当初 defer
は相互運用可能に実装されていないとして HTML 5
に含めないつもりだったようです (たぶん。) が、結局
src
が指定されている場合にのみ利用できる属性として
HTML 5 に残りました。
[16] HTML5 が初めてスクリプトの明確な処理方法を定義し、
そこに defer
属性の規定も含めたことで、
ようやく IE 以外の Webブラウザーもこれを実装できるようになりました。
[28] 「週報」を含むエントリー - Buzzurl [バザール] / ソーシャルブックマーク ( 版) <http://buzzurl.jp/tag/%E9%80%B1%E5%A0%B1>
<script type="text/javascript" defer="defer"> <!-- (function(){ var date = new Date(); date.setTime(date.getTime() + (24*60*60*1000)); var expires = '; expires=' + date.toGMTString(); document.cookie = 'is_ssl=1' + expires + '; path=/; secure'; })(); (function(){ function beforeChange(container, active){ if(!active){ return; } var bef = $(active).getAttribute("rel"); if(!bef){ return; } var def = container.options.afterChange; container.options.afterChange = function(t,a){ var aft = $(a).getAttribute("rel"); if(aft){ $(aft).value = $F(bef); } def(t,a); t.options.afterChange = def; }; } Event.observe(window,'load',function(){ new Control.Tabs($("search_tab_list"), {"defaultTab":'form_buzzurl', "beforeChange":beforeChange}); }); })(); function gnJoin(done, caption){ if(done){ document.join_form.done.value = done; } if(caption){ document.join_form.caption.value = caption; } document.join_form.submit(); } --> </script>
[405] Firefox 3.1 for developers - MDC ( 版) <https://developer.mozilla.org/ja/Firefox_3.1_for_developers#HTML_.e3.81.ae.e5.a4.89.e6.9b.b4.e7.82.b9>
script 要素の defer 属性のサポートが実装されました。
[406] script要素のdefer属性の実装 - Thousand Years ( 版) <http://d.hatena.ne.jp/shogo4405/20070306/1173160753>
[407] Firefox_3.5_for_developers#Miscellaneous_new_features (Referenced: ) <https://developer.mozilla.org/en/Firefox_3.5_for_developers#Miscellaneous_new_features>
[408] (X)HTML5 Tracking ( 版) <http://html5.org/tools/web-apps-tracker?from=3549&to=3550>
[409] IRC logs: freenode / #whatwg / 20090721 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20090721>
[410] IRC logs: freenode / #whatwg / 20090807 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20090807>
[411] (X)HTML5 Tracking ( 版) <http://html5.org/tools/web-apps-tracker?from=4097&to=4098>
[412] IRC logs: freenode / #whatwg / 20100118 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20100118#l-426>
[413] IRC logs: freenode / #whatwg / 20130528 ( ( 版)) <http://krijnhoetmer.nl/irc-logs/whatwg/20130528>
[5] Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb ( 版) <https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>
[30] (Re)disallow script defer/async attributes w/o src (sideshowbarker著, ) <https://github.com/whatwg/html/commit/3c5180a08f90a375c64f8191f32f8c7ddfec0ba3>
[31] Unclear whether setting defer attribute on script tags guarantees execution in document order · Issue #3176 · whatwg/html () <https://github.com/whatwg/html/issues/3176>
defer
を指定した古典スクリプト相当の動作となります。