[12] [CODE(HTMLe)@en[[[script]]]] [[要素]]の [DFN[[CODE(HTMLa)@en[[[async]]]]]]
[[属性]]は、[[外部スクリプト資源]]を[[非同期的]]に取得して、
その準備ができ次第実行するべきことを表します。

* 仕様書

[REFS[
- [1] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-16 01:30:20 +09:00]] 版) <https://html.spec.whatwg.org/#the-script-element>
-- [2] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#attr-script-async>'''
-- [13] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#dom-script-async>
-- [32] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#non-blocking>
]REFS]

* 意味

[3] [CODE(HTMLa)@en[[[async]]]] [[属性]]は、[[スクリプト]]がどう評価されるか指定するものです
[SRC[>>2]]。

[6] [[古典スクリプト]]の場合、[[構文解析]]と[[並列に]]
[[fetch]] が行われてから、準備ができ次第すぐに ([[構文解析]]が未完であっても)
評価することを求めるものです。指定されなかった場合は 
[CODE(HTMLa)@en[[[defer]]]] [[属性]]の指示によります。 [SRC[>>2]]

[7] [[モジュールスクリプト]]の場合、
[[モジュールスクリプト]]およびその依存物は[[構文解析]]と[[並列に]]
[[fetch]] が行われてから、準備ができ次第すぐに ([[構文解析]]が未完であっても)
評価することを求めるものです。指定されなかった場合も[[構文解析]]と[[並列に]]
[[fetch]] が行われますが、評価は[[構文解析]]が完了してからとなります。 [SRC[>>2]]

* 文脈

[4] [CODE(HTMLe)@en[[[script]]]] [[要素]]の種別が[[古典スクリプト]]や[[モジュールスクリプト]]の時、
指定できます [SRC[>>2]]。

[9] [CODE(HTMLe)@en[[[script]]]] [[要素]]の種別が[[データブロック]]の時は、
[CODE(HTMLa)@en[[[async]]]] [[属性]]を使っては[['''なりません''']] [SRC[>>1]]。

* 処理

[5] [CODE(HTMLe)@en[[[script]]]] 参照。

[33] [CODE(HTMLa)@en[[[async]]]] [[属性が追加]]された時、
[CODE(HTMLe)@en[[[script]]]] [[要素]]の[F[[[「非ブロッキング」]]フラグ]]が設定されていたら、
そのフラグを削除しなければ[['''なりません''']] [SRC[>>32]]。

[28] なお、初回処理時の値が使われるので、動的に変更しても、意味を持ちません [SRC[>>2]]。

* [CODE(DOMi)@en[HTMLScriptElement]] インターフェイス [CODE(DOMa)@en[async]] 属性

[15] [CODE(DOMi)@en[[[HTMLScriptElement]]]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[[[async]]]]]] [[IDL属性]]は、
[[スクリプト]]が[[非同期的]]に実行されるかどうかを表します [SRC[>>13]]。

[16] [[取得時]]には、次のようにしなければ[['''なりません''']] [SRC[>>13]]。

[FIG(steps)[
= [17] [[文脈オブジェクト]]の[F[[[「非ブロッキング」]]フラグ]]が設定されていれば、
== [18] [[真]]を返します。
= [26] それ以外なら、
== [27] [CODE(HTMLa)@en[[[async]]]] [[内容属性]]を[[ブール値]]として[[反映]]する[[IDL属性]]の[[取得器]]の処理を行います。
]FIG]

[19] [[設定時]]には、[VAR[指定値]]について次のようにしなければ[['''なりません''']] [SRC[>>13]]。

[FIG(steps)[
= [20] [[文脈オブジェクト]]の[F[[[「非ブロッキング」]]フラグ]]が設定されていれば、
== [21] [[文脈オブジェクト]]の[F[[[「非ブロッキング」]]フラグ]]を削除します。
== [22] [VAR[指定値]]が[[真]]なら、
=== [23] [[文脈オブジェクト]]の [F[[CODE(HTMLa)@en[[[async]]]] [[内容属性]]]]を、
[[空文字列]]に設定します。
== [24] それ以外なら、
=== [25] [[文脈オブジェクト]]の [F[[CODE(HTMLa)@en[[[async]]]] [[内容属性]]]]を削除します。
= [29] それ以外なら、
== [30] [CODE(HTMLa)@en[[[async]]]] [[内容属性]]を[[ブール値]]として[[反映]]する[[IDL属性]]の[[設定器]]の処理を[VAR[指定値]]について行います。
]FIG]

;; [31] [CODE(HTMLa)@en[[[async]]]] [[属性の追加]]では[[「非ブロッキング」フラグ]]が削除されることになっていますが、
本[[設定器]]経由の場合は[[属性]]が変更されない場合や削除される場合も[[「非ブロッキング」フラグ]]が削除されることになります。

* 関連

[11] [CODE(HTMLa)@en[[[defer]]]] も参照。

* 歴史

[8] [CITE[IRC logs: freenode / #whatwg / 20091009]]
([TIME[2009-12-08 00:45:57 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20091009>

[10] [CITE@en[Last Week: Asynchronous script execution and GPU Acceleration by default « Peter Beverloo]]
( ([TIME[2010-09-26 23:09:35 +09:00]] 版))
<http://peter.sh/2010/09/last-week-asynchronous-script-execution-and-gpu-acceleration-by-default/>

[14] [CITE@en[Bug 22696 – inline <script async>]]
( ([TIME[2014-09-28 09:03:14 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=22696>

[43] [CITE@en[Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb]]
([TIME[2016-01-21 22:16:06 +09:00]] 版)
<https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>

[34] [CITE@en[(Re)disallow script defer/async attributes w/o src]]
([[sideshowbarker]]著, [TIME[2017-04-05 21:04:55 +09:00]])
<https://github.com/whatwg/html/commit/3c5180a08f90a375c64f8191f32f8c7ddfec0ba3>

[35] [CITE@en[Fix authoring guidance to allow async="" on inline module scripts]]
([[domenic]]著, [TIME[2018-01-06 03:37:30 +09:00]])
<https://github.com/whatwg/html/commit/271f19c34786db04a17c16c24807a33113894a68>

[36] [CITE@en[async="" should be allowed on inline module scripts · Issue #3319 · whatwg/html]]
([TIME[2018-02-26 00:11:03 +09:00]])
<https://github.com/whatwg/html/issues/3319>

[37] [CITE@en[Fix authoring guidance to allow async="" on inline module scripts by domenic · Pull Request #3324 · whatwg/html]]
([TIME[2018-02-26 00:11:25 +09:00]])
<https://github.com/whatwg/html/pull/3324>



[38] [CITE@en[Editorial: improve async attribute description]]
([[co16353sidak]]著, [TIME[2019-02-11 17:36:58 +09:00]])
<https://github.com/whatwg/html/commit/2b1c10493d3a6f726aa1bcc032eee161ffd3f960>

[39] [CITE@en["async — Execute script when available, without blocking" · Issue #4171 · whatwg/html]]
([TIME[2019-06-20 18:11:28 +09:00]])
<https://github.com/whatwg/html/issues/4171>

[40] [CITE@en[Updated async short description by co16353sidak · Pull Request #4351 · whatwg/html]]
([TIME[2019-06-20 18:11:54 +09:00]])
<https://github.com/whatwg/html/pull/4351>

[41] [CITE@en[Allow `async` and `includes` as member names (#769)]]
([[saschanaz]]著, [TIME[2019-08-14 13:57:42 +09:00]])
<https://github.com/heycam/webidl/commit/94c320e0e090d1cab63ac9ef4622eb1c01b3092c>

[42] [CITE@en[Allow `async` and `includes` as member names by saschanaz · Pull Request #769 · heycam/webidl]]
([TIME[2020-01-12 18:07:21 +09:00]])
<https://github.com/heycam/webidl/pull/769>

[44] [CITE@en[Should `async` be allowed as an attribute name? · Issue #768 · heycam/webidl]]
([TIME[2020-01-12 18:08:10 +09:00]])
<https://github.com/heycam/webidl/issues/768>

[45] [CITE@en[The open() method's "async" argument is now invalid per IDL · Issue #251 · whatwg/xhr]]
([TIME[2020-01-12 18:08:28 +09:00]])
<https://github.com/whatwg/xhr/issues/251>