[FIG(pull-quote)[
> 
[512] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[闇は深い]]。

[FIGCAPTION[
或る人曰く
]FIGCAPTION]
]FIG]

[1] [[HTML]] の [DFN[[CODE(HTMLe)@en[[[script]]]]]] [[要素]]は、動的な[[スクリプト]]や、
[[スクリプト]]が使う[[データ][スクリプトデータ]]を[[文書]]に埋め込むものです。

* 仕様書

[REFS[
- [130] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-16 01:30:20 +09:00]] 版) <https://html.spec.whatwg.org/#the-script-element>'''
- [413] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#scriptTag>
- [419] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#parsing-main-incdata>
- [422] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#scriptEndTag>
- [427] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#scriptForeignEndTag>
- [424] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#scriptTagXML>
- [482] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#stop-parsing>
- [503] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#HTMLScriptElement-partial>
]REFS]

* 意味

[131] [CODE(HTMLe)@en[[[script]]]] [[要素]]は、動的な[[スクリプト]]や、データブロックを[[文書]]に含めるために使うことができます。
[SRC[>>130]]

;; [134] どちらであるかは [CODE(HTMLa)@en[[[type]]]] [[属性]]や [CODE(HTMLa)@en[[[language]]]]
[[属性]]によって決まります。 [CODE(HTML)@en[[[<script type>]]]] を参照。

[132] [CODE(HTMLe)@en[[[script]]]] [[要素]]は[[利用者]]に対する[[内容]]を[[表現]]していません。 [SRC[>>130]]

[186] [CODE(HTMLe)@en[[[script]]]] [[要素]]は、次の通り分類されています。
[FIG(short list)[
- [[メタデータ内容]] [SRC[>>130]]
- [[フロー内容]] [SRC[>>130]]
- [[語句内容]] [SRC[>>130]]
- [[スクリプト支援要素]] [SRC[>>130]]
]FIG]

* 構文

[188] [[開始タグ]]も[[終了タグ]]も[[必須]]であり、省略できません [SRC[>>130]]。

* 文脈

[14] [CODE(HTMLe)@en[[[script]]]] [[要素]]は、
[[フロー内容]]、[[語句内容]]、[[スクリプト支援要素]]のいずれかが求められる場面で使うことができます
[SRC[>>130]]。つまり [[HTML文書]]のほとんどあらゆる場所で使うことができます。

[HISTORY[
[187] [[HTML4]] 時代も大部分で使うことが認められていました [SRC[HTML 4 18.2.1]]
が、 [[HTML5]] で更に制約が緩和され、[[構文解析器]]等の都合で困難な場面を除き、
ほとんどすべての場面で使えるようになりました。
]HISTORY]

* 属性

[FIG(short list)[ [9] [CODE(HTMLe)@en[script]] [[要素]]の[[内容属性]]
- [[大域属性]]
- [CODE(HTMLa)@en[async][<script async>]]
- [CODE(HTMLa)@en[charset][<script charset>]]
- [CODE(HTMLa)@en[[[crossorigin]]]]
- [CODE(HTMLa)@en[[[defer]]]]
- [CODE(HTMLa)@en[integrity]]
- [CODE(HTMLa)@en[nomodule]]
- [CODE(HTMLa)@en[[[nonce]]]]
- [CODE(HTMLa)@en[src][<script src>]]
- [CODE(HTMLa)@en[type][<script type>]]
- [CODE[referrerpolicy]]

[HISTORY[
- [CODE(HTMLa)@en[implements][<script implements>]]
- [CODE(HTMLa)@en[language][<script language>]]
- [CODE(HTMLa)@en[fptype]]
]HISTORY]
]FIG]

;; [135] [CODE(HTML)@en[[[<script type>]]]] 依存の制約もあります (そちらの項を参照)。

[HISTORY[
[189] 他に次の歴史的な[[属性]]があります。

[FIG(list short)[
,[CODE(HTMLa)[[[archive]]]]	,	,	,[NC4]
,[CODE(HTMLa)[[[classname]]]]	,[[逆ドメイン名]]	,	,級名	,[ECMA-290]
- [CODE(HTMLa)[[[event]]]]
- [CODE(HTMLa)[[[for]]]]
- [CODE(HTMLa)@en[x-mojo-version]]
- [CODE(HTMLa)[name]]
- [CODE(HTMLa)@en[pagespeed_no_defer]]
,[CODE(HTMLa)[[[purpose]]]]	,	,	,実行目的	,[ECMA-290]
- [CODE(XMLa)[[[[VAR[ev:]]event]]]]
- [CODE(XMLa)[[[[VAR[ev:]]observer]]]]
- [CODE(XMLa)[[[[VAR[ev:]]phase]]]]
- [CODE(XMLa)[[[[VAR[ev:]]propagate]]]]
- [CODE(XMLa)[[[[VAR[ev:]]target]]]]
]FIG]
]HISTORY]

[554] [CODE(HTMLe)@en[script]] [[要素]]の意味に依存して、
使える[[属性]]は次の通り変化します。

[FIG(table col)[

:semantics: 意味
:type: [CODE(HTMLa)@en[type][<script type>]]
:src: [CODE(HTMLa)@en[src][<script src>]]
:charset: [CODE(HTMLa)@en[charset][<script charset>]]
:async: [CODE(HTMLa)@en[async][<script async>]]
:nomodule: [CODE(HTMLa)@en[nomodule][<script nomodule>]]
:defer: [CODE(HTMLa)@en[defer][<script defer>]]
:crossorigin: [CODE(HTMLa)@en[crossorigin][<script crossorigin>]]
:nonce: [CODE(HTMLa)@en[nonce][<script nonce>]]
:integrity: [CODE(HTMLa)@en[integrity ][<script integrity>]]

:semantics: [[古典スクリプト]]
:type: 省略する[SHOULD[べき]]
:nomodule: ○
:charset: [CODE(HTMLa)@en[src][<script src>]] [MUST[必須]]
:async: [CODE(HTMLa)@en[src][<script src>]] [MUST[必須]]
:defer: [CODE(HTMLa)@en[src][<script src>]] [MUST[必須]]
([CODE(HTMLa)@en[async]] があると無意味)
:crossorigin: [CODE(HTMLa)@en[src][<script src>]] がないと無意味
:nonce: ○
:integrity: [CODE(HTMLa)@en[src][<script src>]] [MUST[必須]]
:src: ○

:semantics: [[モジュールスクリプト]]
:type: [CODE[module][モジュールスクリプト]]
:nomodule: [MUST[禁止]]
:charset: [MUST[禁止]]
:async: ○
:defer: [MUST[禁止]]
:crossorigin: ○
:nonce: ○
:integrity: [MUST[禁止]]
:src: ○

:semantics: [[データブロック]]
:type: [[MIME型]]
:src: [MUST[禁止]]
:charset: [MUST[禁止]]
:async: [MUST[禁止]]
:nomodule: [MUST[禁止]]
:defer: [MUST[禁止]]
:crossorigin: [MUST[禁止]]
:nonce: [MUST[禁止]]
:integrity: [MUST[禁止]]

]FIG]

-*-*-

[249] [CODE(HTMLa)@en[[[async]]]] [[属性]]や [CODE(HTMLa)@en[[[src]]]]
[[属性]]については[[属性が追加]]された時の処理が規定されています。

[500] [[属性]]の有無と[[構文解析器]]によって作成されたか [[DOM]]
[[メソッド]]で作成されたかにより、[[スクリプト]]の実行のタイミングは次のように変化します。

[FIG(table)[
:e: [[要素]]
:timing: 実行時機
:order: 相対的順序保存
:pause parser: 構文解析器中断
:c: >>360

:e: [CODE(HTML)@en[<script>]]
:order: はい
:pause parser: はい
:timing: 挿入直後・妨害条件解消後の遅い方
:c: 己、戊

:e: [CODE(HTML)@en[<script src>]]
:order: はい
:pause parser: はい
:timing: [[fetch]] 直後・妨害条件解消後の遅い方
:c: 乙

:e: [CODE(HTML)@en[<script src defer>]]
:order: はい
:timing: 構文解析終了直後・[[fetch]] 直後・妨害条件解消後の遅い方
:c: 甲

:e: [CODE(HTML)@en[<script src async>]]
:timing: [[fetch]] 直後
:c: 丁

:e: [CODE(HTML)@en[<script type=module>]]
:order: はい
:timing: 構文解析終了直後・妨害条件解消後の遅い方
:c: 甲

:e: [CODE(HTML)@en[<script type=module async>]]
:timing: [[fetch]] 直後
:c: 丁

:e: [CODE(HTML)@en[<script type=module src>]]
:order: はい
:timing: 構文解析終了直後・[[fetch]] 直後・妨害条件解消後の遅い方
:c: 甲

:e: [CODE(HTML)@en[<script type=module src async>]]
:timing: [[fetch]] 直後
:c: 丁

:e: [CODE(JS)@en[s = document.createElement ('script')]]
:order: はい
:timing: 挿入直後・妨害条件解消後の遅い方
:c: 己

:e: [CODE(JS)@en[s = document.createElement ('script'); s.src = ...]]
:timing: [[fetch]] 直後
:c: 丁

:e: [CODE(JS)@en[s = document.createElement ('script'); s.async = false; s.src = ...]]
:timing: [[fetch]] 直後・妨害条件解消後の遅い方
:order: はい
:c: 丙

:e: [CODE(JS)@en[s = document.createElement ('script'); s.async = true; s.src = ...]]
:timing: [[fetch]] 直後
:c: 丁

:e: [CODE(JS)@en[s = document.createElement ('script'); s.type = 'module']]
:timing: 妨害条件解消後
:c: 丁

:e: [CODE(JS)@en[s = document.createElement ('script'); s.type = 'module'; s.src = ...]]
:timing: [[fetch]] 直後
:c: 丁

:e: [CODE(JS)@en[s = document.createElement ('script'); s.type = 'module'; s.async = false; s.src = ...]]
:order: はい
:timing: [[fetch]] 直後・妨害条件解消後の遅い方
:c: 丙

:e: [CODE(JS)@en[s = document.createElement ('script'); s.type = 'module'; s.async = true; s.src = ...]]
:timing: [[fetch]] 直後
:c: 丁
]FIG]

* 内容

[194] [CODE(HTMLe)@en[[[script]]]] [[要素]]の種別が[[古典スクリプト]]や[[モジュールスクリプト]]の場合は、
[CODE(HTMLa)@en[[[src]]]] [[属性]]を使って外部スクリプト資源を指定することもできますし、
[[内容]]として直接埋め込むこともできます [SRC[>>130]]。

;; [CODE(HTML)@en[[[<script src>]]]] も参照。

[137] [CODE(HTMLe)@en[[[script]]]] [[要素]]の種別が[[データブロック]]の時は、
[[内容]]として直接埋め込まなければ[['''なりません''']] [SRC[>>130]]。

;; [133] [CODE(HTMLe)@en[[[script]]]] [[要素]]の種別については [CODE(HTML)@en[[[<script type>]]]] を参照。


** 言語依存の制約

[193] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[内容]]が[[古典スクリプト]]や[[モジュールスクリプト]]を表しているときは、
それぞれ [[JavaScript]] の [CODE[[[Script]]]] や [CODE[[[Module]]]]
の制約に従わなければ[['''なりません''']] [SRC[>>130]]。

[HISTORY[
[192] かつては次のような若干曖昧な規定でした。

[150] [[HTML Standard]] は共通の制約以外には [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[内容]]について制約を課しておらず、
[CODE(HTMLa)@en[[[type]]]] (と [CODE(HTMLa)@en[[[language]]]]) によって決定される[[言語]]の仕様による制限に適合しなければならないとしています。

[151] ただし実際にはそのような制約を明示している仕様はありません。

[152] [[HTML Standard]] によれば、 [CODE(HTMLe)@en[[[script]]]] [[要素]]で [CODE(HTMLa)@en[[[src]]]]
[[属性]]がない場合、 [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[内容]]は
- [153] [[XML]] ベースの[[言語]]であれば[[子供]]を
- [154] テキストベースの[[言語]]であれば[[子供]]の[[テキスト節点]]を

... 使うことになっています。ここから推測すると、
- [155] [[XML]] ベースの[[言語]]であれば、 [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[内容]]がその [[XML]]
[[言語]]の[[要素]]や[[テキスト]]
- [156] テキストベースの[[言語]]であればその[[言語]]によって記述された[[テキスト]]のみで、
[[要素]]は使用してはいけない

... という風に解釈するのが妥当でしょう。

[157] ただし [[HTML]] 構文では [CODE(HTMLe)@en[[[script]]]] 
[[要素]]の構文解析直後の状態は常に[[テキスト節点]]を高々1つだけ含んだ状態になります。[[要素]]を[[子供]]にするためには
[[XML]] 構文を使うか[[スクリプト]]で挿入するしかありません。そのため、データブロックとして [[XML]]
ベースのデータが [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[内容]]に埋め込まれることがありますが、
[[XML]] のソースを[[テキスト節点]]として含んだ状態になってしまいます。
]HISTORY]

-*-*-

[139] [CODE(HTMLe)@en[[[script]]]] [[要素]]の種別が[[データブロック]]の時は、
[CODE(HTMLa)@en[[[type]]]] [[属性]]で指定された書式の要件に従わなければ[['''なりません''']] [SRC[>>130]]。

[581] しかし現実にはそのような書式を明確に規定している
[[MIME型]]は、それほど多くありません。
既存の [[MIME型]]のほとんどは、 [[MIME]] や [[HTTP]] での利用を想定して[[バイト列]]の書式は定めているかもしれませんが、
[[文字列]]の書式を定めていることは稀です。
[[JavaScriptフレームワーク]]の類の処理対象データを埋め込むために使う場合の専用の
[[MIME型]]については、その書式が定義されているくらいです。

** 外部スクリプトについてのドキュメントの制約

[142] [CODE(HTMLa)@en[[[src]]]] [[属性]]が指定されている場合、 [CODE(HTMLe)@en[[[script]]]]
[[要素]]の[[内容]]は外部の[[スクリプト]]についての[[ドキュメント]]とみなされます。
[[スクリプト]]として実行はされません。この場合には、 ([[スクリプト言語]]に関わらず) 
次のものだけを使わなければならないという制約が課されます (空でも構いません) [SRC[>>130]]。
[FIG[
- [145] [CODE(charname)@en[[[SPACE]]]]
- [146] [CODE(char)@en[[[U+0009]]]]
- [147] [CODE(charname)@en[[[LF]]]]
- [148] [[JavaScript]] の行内コメント [CODE[/* ... */]]
- [149] [[JavaScript]] の一行コメント [CODE[[[//]] ... [[LF]]]]
-- 末尾に[[改行]]が必要です。
]FIG]

** 共通の制約

[140] [CODE(HTMLe)@en[[[script]]]] [[要素]]の [CODE(DOMa)@en[[[textContent]]]] は次の要件を満たさなければ[['''なりません''']]
[SRC[>>130]]。
[FIG[
- [143] [CODE[[[<!--]]]] があると、それに対応する [CODE[[[-->]]]] が必要です。
- [144] [CODE[[[<!--]]]] と [CODE[[[-->]]]] の間には他の [CODE[[[-->]]]] や
[CODE[<script]] ([[大文字]]または[[小文字]]) の後に[[空白文字]]や [CODE[[[/]]]] や [CODE[[[>]]]]
が続く文字列が入ってはいけません。
]FIG]

[141] [[HTML構文解析器]]は [CODE(HTMLe)@en[[[script]]]] [[要素]]内において [CODE[[[<!--]]]]
と [CODE[[[-->]]]] の対応関係や [CODE[<script>]] と [CODE[</script>]]
の対応関係を考慮して複雑な解釈を行います。それに反して [[HTML]] として[[直列化]]できない値や混乱を招くものを禁止するために
>>140 のような規定があります。

*** 擬似注釈宣言の使用

[18] [CODE(HTMLe)[script]] 要素に対応していない古い WWW ブラウザは、
[CODE(HTMLe)[script]] 要素内の[[文字データ]]も構わず解釈してしまいます。
そこで、 [CODE(HTMLe)[script]] 要素の内容としてスクリプトを記述するときには、
HTML の[[注釈宣言]]のように最初に [CODE(HTML)[<!--]] を、
最後に [CODE(HTML)[-->]] をつけることが慣習となっています。

HTML 4 によれば、これは HTML の機能ではなく、[[スクリプト機関]]の機能とされています。
この機能に対応している言語には [[JavaScript]], [[VBScript]], [[Tcl]]
があるようです。 [SRC[HTML 4 18.3.2]] より正確には、この3つの言語は
[CODE(HTMLe)[script]] 要素の内容の一番最初の非[[空白]]文字列が
[CODE[<!--]] であるとき、これを無視するらしいです。
最後の [CODE[-->]] は、3つの言語のいずれも、それだけで書くことはできず、
それぞれの言語の注釈の内容として (JavaScript の場合は [SAMP(JS)[// -->]] 
のようにして) 書くことが必要らしいです。

[Q[らしい]]というのは、正確にこれを規定した仕様がないからです。
HTML 4 は[Q[スクリプト機関]]によるものだと言っていますから、
スクリプト言語の言語仕様かなにかに規定があってもよさそうなものですが、
そのようなものは見たことがありません。また、 HTML
に直接埋め込まれていない [[ECMAScript]] のスクリプトのソース・コードに
[CODE[<!--]] という文字列があってもよいという話も聞きません。
([CODE(HTMLe)[[[style]]]] 要素も同じような事情ですが、こちらは
[[CSS2]] で言語仕様の一部としてきちんと定義されています。)

[42] 少なくても [[JavaScript]] では、
最初の [SAMP[<!--]] が含まれる行の行末までを無視するのが
Web ブラウザの普通の実装のようです。

[27] このような注釈宣言 (のようなもの) の中では、 (SGML
的には [CODE(SGML)[CDATA]] なので注釈宣言ではないとはいえ、
古い UA の立場からしても SGML 的に正当であるために) [CODE(SGML)[[[COM]]]]
([CODE(HTML)[--]]) を含めるべきではないと考える人もいます。

[19] なお、 XHTML 1 の [CODE(HTMLe)[script]] 要素は、 [CODE(SGML)[CDATA]]
ではありませんので、注釈宣言 (のようなもの) を書くと、
本当に XML の注釈宣言と解釈されてしまいます。当然、
スクリプトとして解釈・実行されることはありません。

[40] [CODE(HTMLe)[script]] 要素が使われ始めたばかりの1996年ごろまでは、
注釈宣言 (のようなもの) の閉じの前に
[PRE(HTML)[
<script language="javascript">
<!-- hide script from old browsers
[VAR[...]]
// hide script from old browsers -->
</script>
]PRE]

のように自然言語の注釈を入れておくことがよく行われていました 
(初期の使用例にそう載っていたからみんなで真似したのでしょう)。
(この例のように開き (のようなもの) の後に書くこともできましたが、
閉じの前に書くのが普通だったと記憶しております。)
後にこのような冗長なことはせず、
[PRE(HTML)[
<script language="javascript">
<!--
[VAR[...]]
//-->
</script>
]PRE]

のように簡単に書くようになりました。

[35] また、[Q[裏技]]的なものとして、
[PRE(HTML)[
<script language="javascript">
<!--
[VAR[...]]
// -->スクリプトに対応していません。<!--
[VAR[...]]
// -->
</script>
]PRE]

のような書き方が紹介されることもありました。
(この例のようになぜかスクリプトの途中に書いているものもあれば、
注釈宣言 (のようなもの) の前後に書いているものもありました。
どこに入れるにせよ、書く内容は一行にするか、
うまくして行頭にスクリプト言語の注釈導入子が来るように調整することが重要です。
また、 [CODE(SGML)[[[etago]]]] が使えないことにも注意が必要です。)

[38] スクリプト言語の演算子として [CODE[>]] を使うことが良くありますが、
古いブラウザの中には注釈宣言を [CODE[>]] で終えてしまうものがあることが知られています。
[SAMP(JS)[[VAR[x]] > [VAR[y]]]] のような式は [SAMP(JS)[[VAR[y]] < [VAR[x]]]]
と書くことで回避できます。 [SRC[HTML 4 18.3.2 Note]]
もっとも、そのようなブラウザは HTML 4 の時点でも骨董品ですし、
HTML 4 も特にそうするべきだなどとは言っていません。

参考文献:
- [16] [CITE[<SCRIPT>〜</SCRIPT> 内の要素はすべてコメントで囲んだ方が安全です。]]
<http://openlab.ring.gr.jp/k16/htmllint/explain.html#comment-element>

誤って「[CODE(JS)@en[//->]]」のようなもので終わることもあるみたいです。

* 適合性検査

[136] [CODE(HTMLe)@en[[[script]]]] [[要素]][VAR[要素]]の[[属性]]と[[内容]]の[[適合性]]の検査は、
次のように行えます。

[FIG(steps)[
= [292] [VAR[元の型]]を、[VAR[要素]]の [CODE(HTMLa)@en[[[type]]]] [[属性値]]に設定します。
= [138] [VAR[型]]を、[VAR[要素]]の[[スクリプトブロックの型文字列]]に設定します。
= [195] [VAR[型]]により、
[FIG(switch)[
:[223] [[JavaScript MIME型]]のいずれか ([[ASCII大文字・小文字不区別]]):
[FIG(steps)[
= [224] [VAR[検査]]を、「[CODE[[[Script]]]] としての検査」に設定します。
= [207] [VAR[元の型]]が[[空文字列]]なら、
== [220] 不適合であると報告します。
= [225] それ以外で、[VAR[元の型]]が null でなければ、
== [234] 原則として不適合であると報告します。
= [226] [VAR[要素]]に [CODE(HTMLa)@en[[[async]]]] [[属性]]と
[CODE(HTMLa)@en[[[defer]]]] [[属性]]の両方があれば、
警告します。
= [484] [VAR[要素]]に [CODE(HTMLa)@en[[[defer]]]] [[属性]]があって
[CODE(HTMLa)@en[[[src]]]] [[属性]]がなければ、警告します。
= [499] [VAR[要素]]に [CODE(HTMLa)@en[[[async]]]] [[属性]]があって
[CODE(HTMLa)@en[[[src]]]] [[属性]]がなければ、警告します。
= [219] [VAR[要素]]に [CODE(HTMLa)@en[[[crossorigin]]]] [[属性]]があって
[CODE(HTMLa)@en[[[src]]]] [[属性]]がなければ、警告します。
= [218] [VAR[要素]]に [CODE(HTMLa)@en[[[charset]]]] [[属性]]があって
[CODE(HTMLa)@en[[[src]]]] [[属性]]がなければ、不適合を報告します。
]FIG]
:[196] [CODE[[[module]]]] ([[ASCII大文字・小文字不区別]]):
[FIG(steps)[
= [293] [VAR[元の型]]が [CODE[[[module]]]] ([[ASCII大文字・小文字不区別]])
でなければ、不適合を報告します。
= [221] [VAR[検査]]を、「[CODE[[[Module]]]] としての検査」に設定します。
= [198] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[charset]]]] [[属性]]]]があれば、不適合を報告します。
= [199] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[defer]]]] [[属性]]]]があれば、不適合を報告します。
]FIG]
:[197] それ以外:
[FIG(steps)[
= [222] [VAR[検査]]を、[VAR[型]]によって決まる検査 (なければ null) に設定します。
= [202] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[async]]]] [[属性]]]]があれば、不適合を報告します。
= [200] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[charset]]]] [[属性]]]]があれば、不適合を報告します。
= [204] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[crossorigin]]]] [[属性]]]]があれば、不適合を報告します。
= [201] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[defer]]]] [[属性]]]]があれば、不適合を報告します。
= [205] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[nonce]]]] [[属性]]]]があれば、不適合を報告します。
= [203] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[src]]]] [[属性]]]]があれば、不適合を報告します。
= [206] [VAR[型]]が[[妥当なMIME型]]であるか検査します。
= [235] [VAR[型]]の[F[[[引数]]]]を無視すると [[JavaScript MIME型]]になるなら、警告します。
= [236] [VAR[型]]がかつて[[スクリプト言語]]に用いられた値なら、警告します。
]FIG]
]FIG]
= [211] [VAR[要素]]に [CODE(HTMLa)@en[[[async]]]] [[属性]]があれば、検査します。
= [215] [VAR[要素]]に [CODE(HTMLa)@en[[[charset]]]] [[属性]]があれば、検査します。
= [212] [VAR[要素]]に [CODE(HTMLa)@en[[[crossorigin]]]] [[属性]]があれば、検査します。
= [216] [VAR[要素]]に [CODE(HTMLa)@en[[[defer]]]] [[属性]]があれば、検査します。
= [213] [VAR[要素]]に [CODE(HTMLa)@en[[[nonce]]]] [[属性]]があれば、検査します。
= [210] [VAR[要素]]に [CODE(HTMLa)@en[[[src]]]] [[属性]]があれば、検査します。
= [504] [VAR[要素]]に [CODE(HTMLa)@en[[[language]]]] [[属性]]があれば、
== [506] [VAR[要素]]の [CODE(HTMLa)@en[[[language]]]] [[属性値]]が
[[ASCII大文字・小文字不区別]]で [CODE[[[javascript]]]] と一致するなら、
=== [505] [VAR[元の型]]が null か [CODE(MIME)@en[[[text/javascript]]]]
([[ASCII大文字・小文字不区別]]) なら、
==== [509] [[obsolete but conforming]] を報告します。
=== [510] それ以外なら、
==== [511] 不適合を報告します。
== [507] それ以外なら、
=== [508] 不適合を報告します。
= [209] [VAR[要素]]の[F[[[属性]]リスト]]のうち、以上で検査していない[[属性]]を検査します。
= [244] [VAR[要素]]の[[内容]]の共通の制約を検査します。
= [214] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[src]]]] [[属性]]]]があれば、
== [245] [VAR[要素]]の[F[[[内容]]]]のドキュメント制約を検査します。
= [208] [VAR[検査]]の値により、
[FIG(switch)[
:[233] null:
[FIG(steps)[
= [228] 検査不能を報告します。
]FIG]
:[227] 「[CODE[[[Script]]]] として検査」か「[CODE[[[Module]]]] として検査」:
[FIG(steps)[
= [237] [VAR[要素]]に [F[[CODE(HTMLa)@en[[[src]]]] [[属性]]]]があれば、
== [239] [[古典スクリプトのfetch]]を実行します。
[VAR[URL]] を[VAR[要素]]の [CODE(DOMa)@en[[[src]]]] [[IDL属性]]の値、
[VAR[CORS設定群]]を[VAR[要素]]の [CODE(DOMa)@en[[[crossorigin]]]] [[属性値]]、
[VAR[文字符号化]]を[VAR[要素]]の [CODE(DOMa)@en[[[charset]]]] [[属性値]]とします。
[VAR[続きの処理]]は、[VAR[スクリプト]]についての次のような処理とします。
=== [240] [VAR[スクリプト]]の[F[[[ソーステキスト]]]]について、[VAR[検査]]を実行します。
=== [243] [VAR[charset]] を、 [VAR[スクリプト]]の生成に使われた[[応答]]の
[F[[[Content-Typeメタデータ]]]]の[F[[CODE(MIME)@en[[[charset]]]]]]に設定します。
=== [241] [VAR[charset]] があり、[VAR[要素]]の [CODE(DOMa)@en[[[charset]]]] [[属性]]もある場合、
==== [242] [VAR[charset]] と[VAR[要素]]の [CODE(DOMa)@en[[[charset]]]] [[属性]]とどちらも同じ[[符号化]]の[[ラベル]]であるか検査します。
= [238] それ以外なら、
== [229] [VAR[ソーステキスト]]を、[VAR[要素]]の [F[[CODE(DOMa)@en[[[text]]]] [[IDL属性]]の値]]に設定します。
== [230] [VAR[ソーステキスト]]について、[VAR[検査]]を実行します。
]FIG]
:[231] それ以外:
[FIG(steps)[
= [232] [VAR[要素]]について、[VAR[検査]]を実行します。
]FIG]
]FIG]
]FIG]


* 状態

[246] [[HTML要素]]の状態に加えて、次の状態を持ちます。
[FIG(list members)[
: [F[[DFN[[RUBYB[「開始済み」]@en["already started"]]]]フラグ]] :
[[スクリプト]]が実行開始されたかどうかを表します。
初期状態では未設定です [SRC[>>130]]。
実行された場合の他に、
[[内容]]の処理中に[[構文解析器]]が [[EOF]] に遭遇した時や、
[[素片構文解析アルゴリズム]]の実行中の時 ([CODE(DOMa)@en[[[innerHTML]]]] 等の時)
にも設定されます。
: [F[「構文解析器挿入」フラグ]] :
[[構文解析器]]が挿入した [CODE(HTMLe)@en[[[script]]]] [[要素]]に設定されます。
初期状態では未設定です [SRC[>>130]]。
: [F[[DFN[[RUBYB[「非ブロッキング」]@en["non-blocking"]]]]フラグ]] :
他の [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[スクリプト]]の実行との相対的な順序が保存されるべき
(ブロッキング) か否か (非ブロッキング) の判断に使われるフラグです。
初期状態では設定され [SRC[>>130]]、
[CODE(HTMLa)@en[[[async]]]] [[内容属性]]が操作されると消去されます。
: [F[[DFN[[RUBYB[「構文解析器実行準備完了」]@en["ready to be parser-executed"]]]]フラグ]] :
初期状態では未設定です [SRC[>>130]]。
: [F[[[スクリプトの型]]]] : 
[[古典スクリプト]]と[[モジュールスクリプト]]の別を表します。
初期状態では未設定です [SRC[>>130]]。
: [F[[DFN[[RUBYB[外部ファイルから]@en[from an external file]]]]]] [SRC[>>130]] :
[[外部スクリプト]]かどうかを表します。
: [F[[DFN[[RUBYB[スクリプトのスクリプト]@en[the script's script]]]]]] [SRC[>>130]] :
[CODE(HTMLe)@en[[[script]]]] [[要素]]から得た[[スクリプト]]です。
: [F[[[スクリプトの準備完了]]]] :
[[スクリプトのfetch]]の完了を表します。
それまで[[loadイベントが遅延]]されます。
: [F[準備完了フラグ]] : >>371 で利用されます。
: 作成した構文解析器 :
本[[要素]]を作成した[[構文解析器]]。[[スクリプトの準備]]で参照されます。
[[構文解析器 (Web)]] も参照。
]FIG]

[HISTORY[
[183] かつては次の状態がありました。
[FIG(short list)[
- [F[[[スクリプトブロックの型]]]]
]FIG]
]HISTORY]

* 処理

[477] [CODE(HTMLe)@en[[[script]]]] [[要素]]の処理は、 [[HTML要素]]の中でもトップレベルに複雑です。
[[イベントループ]]はもちろん、
[[構文解析器]]とも密結合しています。

[412] [[要素]]の作成時点で、作成方法により、次のように各フラグが設定されます。
[FIG(table)[
:create: 作成方法
:parser-inserted: [[「構文解析器挿入」]]
:already started: [[「開始済み」]]
:non-blocking: [[「非ブロッキング」]]
:execute: スクリプト実行

:create: [CODE(DOMm)@en[[[createElement]]]], [CODE(DOMm)@en[[[createElementNS]]]]
:parser-inserted: いいえ
:already started: いいえ
:non-blocking: はい
:execute: はい

:create: [[構文解析器]]
:parser-inserted: はい
:non-blocking: いいえ
:execute: はい
:already started: いいえ

:create: [[構文解析器]] ([CODE(DOMa)@en[[[innerHTML]]]], [CODE(DOMa)@en[[[outerHTML]]]],
[CODE(DOMm)@en[[[insertAdjacentHTML]]]], [CODE(DOMm)@en[[[createContextualFragment]]]])
:parser-inserted: はい
:non-blocking: いいえ
:already started: はい
:execute: いいえ

:create: [CODE(XML)@en[[[xml-stylesheet]]]] で参照された
[[XSLTスタイルシート]] [SRC[>>130]]
:parser-inserted: はい
:already started: いいえ
:non-blocking: ?
:execute: はい

:create: [CODE(DOMm)@en[[[transformToDocument]]]] [SRC[>>130]]
:parser-inserted: はい
:already started: はい
:non-blocking: ?
:execute: いいえ

:create: [CODE(DOMm)@en[[[transformToFragment]]]] [SRC[>>130]]
:parser-inserted: いいえ
:already started: いいえ
:non-blocking: ?
:execute: はい

:create: [CODE(DOMm)@en[[[cloneNode]]]]
:already started: 複製元と同じ
:parser-inserted: いいえ
:non-blocking: はい

:create: 作成後 [CODE(DOMm)@en[[[setAttribute]]]] 等で [CODE(HTMLa)@en[[[async]]]] [[内容属性]]追加
:non-blocking: いいえ

:create: 作成後 [CODE(DOMa)@en[[[async]]]] [[IDL属性]]に値を設定
:non-blocking: いいえ

]FIG]

[479] 更に、[[要素]]が[[文書に挿入]]された時点で、[[スクリプトの準備]]が行われます。
ただし[[スクリプト]]ではなく[[構文解析器]]によって挿入された場合は、
([[開始タグ]]時点で発生する) [[挿入]]の時点ではなく、[[終了タグ]]時点で行われます。

[480] [[スクリプトの準備]]の後に、[[スクリプトブロックの実行]]で、
実際に[[スクリプト]]が実行されます。これは [[fetch]] など必要な条件が整った時に行われます。
([[スクリプトの準備]]から直接呼び出されることもあれば、
[[構文解析]]完了時などかなり遅延される場合もあります。)

[481] これだけでも相当複雑ですが、[[構文解析器]]が挿入した
[CODE(HTMLe)@en[[[script]]]] [[要素]]の[[スクリプト]]が [CODE(JS)@en[[[document.write]]]]
を呼び出し、そこで[[構文解析器]]が再帰的に実行されて [CODE(HTMLe)@en[[[script]]]]
[[要素]]が新たに挿入される場合も考慮する必要があるので、
[[スパゲッティ]]もびっくりなレベルで複雑に交錯しています。

** 構文解析器の処理

[414] [[構文解析器]]は、 [CODE(HTMLe)@en[[[script]]]] [[開始タグ]]の処理において
[CODE(HTMLe)@en[[[script]]]] [[要素]][VAR[要素]]を作成した直後、
[[挿入]]する直前に、次のようにしなければ[['''なりません''']] [SRC[>>413, >>424]]。

[FIG(steps)[
= [415] [VAR[要素]]の[F[[[「構文解析器挿入」]]フラグ]]を設定します。
= [416] [VAR[要素]]の[F[[[「非ブロッキング」]]フラグ]]を消去します。
= [417] 本[[構文解析器]]の[F[素片構文解析]]が[[真]]の場合、
== [418] [VAR[要素]]の[F[[[「開始済み」]]フラグ]]を設定します。
= [556] 本[[構文解析器]]の[F[スクリプト入れ子文脈]]が[[正]]の場合、
== [557] [VAR[要素]]の[F[[[「開始済み」]]フラグ]]を設定して構いません。
例えば、
[[異なる起源]]の[[スクリプト]]が [CODE[document.write]]
で挿入されていて[[ネットワーク]]が遅い場合や、
ページの読み込みに既に長時間を費やしている場合などに、
[[スクリプト]]を実行しないことにして構いません。

]FIG]

;; [425] [[HTML Standard]] は[[XML構文解析器]]の処理において >>414
を[[スクリプトが有効]]な場合に限定していますが、
[[HTML構文解析器]]にはそのような制約はありません。
処理の整合性を考慮すると[[HTML構文解析器]]の動作が正しいと思われます。

[420] [[HTML構文解析器]]は、 [["in text"]] [[挿入モード]]で
[CODE(HTMLe)@en[[[script]]]] [[要素]]が[[現在節点]]の時
[[EOF]] [[字句]]を処理する場合には、
[[開いている要素のスタック]]から[[現在節点]]を除去する直前に、
次のようにしなければ[['''なりません''']] [SRC[>>419]]。

[FIG(steps)[
= [421] [VAR[要素]]の[F[[[「開始済み」]]フラグ]]を設定します。
]FIG]

;; [426] [[HTML Standard]] には [[XML構文解析器]]の処理でこれに相当する規定がありませんが、
[[整形式]]でなくても場合によっては[[スクリプト]]からアクセスできるとすると、
同様の扱いが必要と思われます。

;; [428] [[HTML構文解析器]]で [[SVG]] [CODE(XMLe)@en[[[script]]]]
[[要素]]を処理する際にも、同様の措置が必要かもしれません。

[423] [[構文解析器]][VAR[構文解析器]]は、 [CODE(HTMLe)@en[[[script]]]] 
[[要素]][VAR[要素]]が[[現在節点]]である時、[VAR[要素]]を[[開いている要素のスタック]]から
[[pop]] したり、[[挿入モード]]など[[構文解析器]]の状態を適宜変更した直後に、
次のようにしなければ[['''なりません''']] [SRC[>>422, >>424]]。

[FIG(steps)[
= [432] [VAR[構文解析器]]の[F[[[文書]]]]の[F[[[イベントループ]]]]の[F[[[JavaScript実行文脈スタック]]]]が空なら、
== [433] [VAR[構文解析器]]の[F[[[文書]]]]の[F[[[イベントループ]]]]について[[マイクロタスクチェックポイントを実行]]します。
= [434] [VAR[旧挿入点]]を、[VAR[構文解析器]]の[F[[[挿入点]]]]に設定します。
= [435] [VAR[構文解析器]]の[F[[[挿入点]]]]を、[VAR[構文解析器]]の[F[[[次入力文字]]]]の直前に設定します。
= [436] [VAR[構文解析器]]の[F[[[スクリプト入れ子水準]]]]を、[[インクリメント]]します。
= [437] [VAR[要素]]について[[スクリプトの準備]]を実行します。
=- [438] ここで[[スクリプト]]が実行されることがあります。
=- [439] つまり [CODE(JS)@en[[[document.write]]]] が呼び出されることがあります。
= [440] [VAR[構文解析器]]の[F[[[スクリプト入れ子水準]]]]を、[[デクリメント]]します。
= [441] [VAR[構文解析器]]の[F[[[スクリプト入れ子水準]]]]が0なら、
== [442] [VAR[構文解析器]]の[F[[[parser pause flag]]]] を、[[偽]]に設定します。
= [443] [VAR[構文解析器]]の[F[[[挿入点]]]]を、[VAR[旧挿入点]]に設定します。
= [465] [VAR[構文解析器]]の [[pending parsing-blocking script]] の処理 (>>466) を行います。
]FIG]

;; [431] これは [[HTML構文解析器]]では [["in text"]] [[挿入モード]]で
[CODE(HTMLe)@en[[[script]]]] [[終了タグ]]を処理する時に実行されます [SRC[>>422]]。
[[XML構文解析器]]では [CODE(HTMLe)@en[[[script]]]]
[[要素]]が[[開いている要素のスタック]]から [[pop]] した時に実行されます [SRC[>>424]]。
[[整形式]]でない [[XML文書]]を考慮する場合は、仕様書に明文化されている場合の他、
複数の[[要素]]をまとめて [[pop]] する場合もあるかもしれません。

;; [464] [[HTML Standard]] は[[XML構文解析器]]についてもう少し違った
(より簡単な) 手順を示していますが、[[HTML構文解析器]]特有の内部状態が
[[XML構文解析器]]にも存在すると考えれば、場合分けなく共通の処理にできます。

[430] [[Firefox]] と [[IE11]] は [[HTML Standard]] に従い[[スクリプト]]実行前に[[マイクロタスクチェックポイント]]を実行するように見えます。
[[Chrome]] は実行しないように見えます。 [TIME[2016-02-22T15:45:40.600Z]]

@@ [429] [[HTML構文解析器]]で [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]] [SRC[>>427]]

** DOM 操作の副作用

[250] [[節点]][VAR[子節点]]の[[節点の接続]]の処理は、
次のようにしなければ[['''なりません''']] [SRC[>>130]]。
[FIG(steps)[
= [252] [VAR[子節点]]が [CODE(HTMLe)@en[[[script]]]] [[要素]]であり、
[F[[[「構文解析器挿入」]]フラグ]]が設定されてい''なければ''、
== [253] [VAR[子節点]]について[[スクリプトを準備]]します。
= [254] [VAR[子節点]]の[F[親][parentNode]]が [CODE(HTMLe)@en[script]] [[要素]]であり、
[VAR[子節点]]の[F[親][parentNode]]の[F[[[「構文解析器挿入」]]フラグ]]が設定されてい''なければ''、
== [255] [VAR[子節点]]の[F[親][parentNode]]について[[スクリプトを準備]]します。
]FIG]

;; [251] [[節点の接続]]、すなわち[[影を含む文書中]]となったときに実行されます。
つまり[[文書木]]本体のみならず、[[影木]]への[[挿入]]でも [CODE(HTMLe)@en[script]]
[[要素]]は実行されます。

[247] [[clone]] 時の処理は、 [[cloning steps]] 参照。

** スクリプトの準備

[257] [VAR[要素]]の[DFN[[RUBYB[スクリプトの準備]@en[prepare a script]]]]は、
次のようにしなければ[['''なりません''']] [SRC[>>130]]。

[FIG(steps)[
= [258] [VAR[要素]]の[F[[RUBYB[[[「開始済み」]]]@en["already executed"]]フラグ]]が設定されていれば、
ここで停止します。
= [259] [VAR[要素]]の[F[[[「構文解析器挿入」]]フラグ]]が設定されていれば、
== [260] [VAR[構文解析器挿入だった]]を、[[真]]に設定します。
== [263] [VAR[要素]]の[F[[[「構文解析器挿入」]]フラグ]]を消去します。
== [267] [VAR[要素]]に [CODE(HTMLa)@en[[[async]]]] [[内容属性]]がなければ、
=== [268] [VAR[要素]]の[F[[[「非ブロッキング」]]フラグ]]を設定します。
= [261] それ以外なら、
== [262] [VAR[構文解析器挿入だった]]を、[[偽]]に設定します。
= [573] [VAR[ソーステキスト]]を、
[VAR[要素]]の[F[子供テキスト内容]]に設定します。
= [269] [VAR[要素]]に [CODE(HTMLa)@en[[[src]]]] [[属性]]がなく、
[VAR[子供テキスト内容]]が[[空文字列]]の場合、
== [534] ここで停止します。
= [270] [VAR[要素]]が[[影を含む文書中]]でない場合、
== [535] ここで停止します。
= [286] [VAR[要素]]の[[スクリプトブロックの型文字列]]について、
[FIG(switch)[
: [[JavaScript MIME type essence match]] :
[VAR[要素]]の[F[[[スクリプトの型]]]]を、[CODE[[[classic]]]] に設定します。
: [CODE[[[module]]]] と [[ASCII大文字・小文字不区別]]で一致 :
[VAR[要素]]の[F[[[スクリプトの型]]]]を、[CODE[[[module]]]] に設定します。
: それ以外 :
ここで停止します。
]FIG]
= [274] [VAR[要素]]の[F[[[「開始済み」]]フラグ]]を設定します。
= [271] [VAR[構文解析器挿入だった]]が[[真]]なら、
== [272] [VAR[要素]]の[F[[[「構文解析器挿入」]]フラグ]]を設定します。
== [273] [VAR[要素]]の[F[[[「非ブロッキング」]]フラグ]]を消去します。
== [275] [VAR[要素]]の[F[[[節点文書]]]]が[VAR[要素]]を作成した[[構文解析器]]の[[文書]]と異なるなら、
=== [276] ここで停止します。
= [282] [VAR[要素]]について[F[[[スクリプトが無効]]]]なら、
== [548] ここで停止します。
= [550] [VAR[要素]]に [CODE(HTMLa)@en[nomodule]] [[属性]]があって、
[VAR[要素]]の[F[スクリプトの型]]が [CODE[classic][古典スクリプト]] の場合、
== [551] ここで停止します。
= [283] [VAR[要素]]が [CODE(HTMLa)@en[[[src]]]] [[属性]]を持たない場合、
== [284] [VAR[結果]]を、[VAR[要素]]と [CODE[script]] と[VAR[ソーステキスト]]について
[[Should element's inline behavior be blocked by Content Security Policy?]] を実行した結果に設定します。
== [288] [VAR[結果]]が [CODE[[[Blocked]]]] なら、ここで停止します。
= [289] [VAR[要素]]が [CODE(HTMLa)@en[[[event]]]] [[属性]]と
[CODE(HTMLa)@en[[[for]]]] [[属性]]を持ち、
[VAR[要素]]の[F[[[スクリプトの型]]]]が [CODE[[[classic]]]] なら、
== [290] [VAR[要素]]の [CODE(HTMLa)[[[for]]]] [[属性値]]が先頭と末尾の0個[[以上]]の[[間隔文字]]を無視すると
[[ASCII大文字・小文字不区別]]で [CODE[[[window]]]] と一致するなら、ここで停止します。
== [291] [VAR[要素]]の [CODE(HTMLa)[[[event]]]] [[属性値]]が先頭と末尾の0個[[以上]]の[[間隔文字]]を無視すると
[[ASCII大文字・小文字不区別]]で [CODE[[[onload]]]] または
[CODE[[[onload()]]]] と一致するなら、ここで停止します。
= [298] それ以外なら、
== [299] [VAR[符号化]]を、[VAR[要素]]の[F[[[節点文書]]]]の[F[[[文書の符号化]]]]に設定します。
= [300] [VAR[CORS設定]]を、[VAR[要素]]の [CODE(HTMLa)@en[crossorigin]] [[属性]]の[F[状態]]に設定します。
= [568] [VAR[オプション群]]を、
新しい[[スクリプトfetchオプション群]]に設定します。
[FIG(list members)[ [516] [[スクリプトfetchオプション群]]

: [F[暗号学的nonce]] : 
[VAR[要素]]に [CODE[nonce][nonce=""]] [[属性]]が存在する場合、
[CODE[nonce][nonce=""]] [[属性値]]。
それ以外の場合、[[空文字列]]。
: [F[一貫性メタデータ]] :
[VAR[要素]]に [CODE[integrity][integrity=""]] [[属性]]が存在する場合、
[CODE[integrity][integrity=""]] [[属性値]]。
それ以外の場合、[[空文字列]]。
: [F[構文解析器メタデータ]] :
[VAR[要素]]の[F[「構文解析器挿入」フラグ]]が[[真]]なら
[CODE[parser-inserted]]、それ以外なら [CODE[not-parser-inserted]]。
: [F[credentialsモード]] : [VAR[CORS設定]]から得た [[credentialsモード]]
: [F[参照元ポリシー]] : 
[VAR[要素]]の [CODE[referrerpolicy]] [[内容属性]]の現在の状態

]FIG]
= [301] [VAR[設定群]]を、[VAR[要素]]の[F[[[節点文書]]]]の[F[[CODE(DOMi)@en[[[Window]]]]]]の[F[[[環境設定群オブジェクト]]]]に設定します。
= [338] [[[CODE(DOMe)@en[load]]イベントの遅延]] (>>248) を開始します。
= [302] [VAR[要素]]に [CODE(HTMLa)@en[[[src]]]] [[属性]]があれば、
== [303] [VAR[src]] を、[VAR[要素]]の [CODE(HTMLa)@en[[[src]]]] [[属性値]]に設定します。
== [304] [VAR[src]] が[[空文字列]]なら、
=== [385] [VAR[要素]]のエラーを通知するタスクを追加 (>>305) します。
=== [341] [[[CODE(DOMe)@en[load]]イベントの遅延]] (>>248) を終了します。
=== [386] ここで停止します。
== [308] [VAR[要素]]の[F[[[外部ファイルから]]]]フラグを設定します。
== [309] [VAR[URL]] を、 [VAR[src]] について[VAR[要素]]の[F[[[節点文書]]]]に対して[[URLの構文解析]]を実行した[[結果URL記録]]に設定します。
== [310] [VAR[URL]] が失敗なら、
=== [387] [VAR[要素]]のエラーを通知するタスクを追加 (>>305) します。
=== [388] [[[CODE(DOMe)@en[load]]イベントの遅延]] (>>248) を終了します。
=== [389] ここで停止します。
== [311] [VAR[要素]]の[F[スクリプトの型]]により、
[FIG(switch)[

: [CODE[classic]] :
[FIG(steps)[
= [294] [VAR[要素]]が [CODE(HTMLa)@en[[[charset]]]] [[属性]]を持つなら、
== [295] [VAR[符号化]]を、[VAR[要素]]の [CODE(HTMLa)@en[[[charset]]]] [[属性値]]について[[符号化を取得]]した結果に設定します。
== [296] [VAR[符号化]]が失敗なら、
=== [297] [VAR[符号化]]を、[VAR[要素]]の[F[節点文書]]の[F[符号化][文書の符号化]]に設定します。
= [522] それ以外なら、
== [523] [VAR[符号化]]を、[VAR[要素]]の[F[節点文書]]の[F[符号化][文書の符号化]]に設定します。
= [313] [[古典スクリプトのfetch]]を実行します。
[FIG(list members middle)[
: [VAR[URL]] : [VAR[URL]]
: [VAR[CORS設定]] : [VAR[CORS設定]]
: [VAR[オプション群]] : [VAR[オプション群]]
: [VAR[設定群]] : [VAR[設定群]]
: [VAR[符号化]] : [VAR[符号化]]
: [VAR[続きの処理]] : >>316
]FIG]
]FIG]
: [CODE[module]] :
[[モジュールスクリプト木のfetch]]を実行します。
[FIG(list members)[
: [VAR[URL]] : [VAR[URL]]
: [VAR[オプション群]] : [VAR[オプション群]]
: [VAR[設定群]] : [VAR[設定群]]
: [VAR[終点]] : [CODE[script]]
: [VAR[続きの処理]] : >>316
]FIG]

]FIG]
= [327] それ以外の場合、
== [333] [VAR[基底URL]]を、 [VAR[要素]]の[F[設定文書]]の[F[文書基底URL]]に設定します。
== [329] [VAR[要素]]の[F[スクリプトの型]]により、
[FIG(switch)[
: [CODE[classic]] :
[FIG(steps)[

= [331] [VAR[要素]]の[F[[[スクリプトのスクリプト]]]]を、
[VAR[ソーステキスト]]と[VAR[設定群]]、
[VAR[基底URL]]、[VAR[オプション群]]について[[古典スクリプトを作成]]した結果に設定します。
= [332] [VAR[要素]]の[F[[[スクリプトの準備完了]]]]とします。

]FIG]
: [CODE[module]] :
[FIG(steps)[

= [334] [VAR[スクリプト]]を、[VAR[ソーステキスト]]、[VAR[設定群]]、
[VAR[基底URL]]、[VAR[オプション群]]について[[モジュールスクリプトを作成]]した結果に設定します。
= [335] [VAR[スクリプト]]が null なら、
== [336] [VAR[要素]]の[F[[[スクリプトのスクリプト]]]]を null に設定します。
== [337] [VAR[要素]]の[F[[[スクリプトの準備完了]]]]とします。
= [339] それ以外の場合、
== [340] [VAR[スクリプト]]について[[モジュールスクリプトの子孫をfetchして実現値化]]を実行します。
[FIG(list members)[
: [VAR[終点]] : [CODE[script]] 
: [VAR[続きの処理]] : >>316
]FIG]

]FIG]
]FIG]
= [361] >>360 の実行タイミングにより、
[FIG(switch)[
:甲:
[VAR[要素]]を作成した[[構文解析器]]の[F[[[文書]]]]の
[F[[[list of scripts that will execute when the document has finished parsing]]]]
の末尾に[VAR[要素]]を追加します。
:乙:
[VAR[要素]]を作成した[[構文解析器]]の[F[[[文書]]]]の
[F[[[pending parsing-blocking script]]]] を、[VAR[要素]]に設定します。
:丙:
[VAR[要素]]の[F[[[節点文書]]]]の
[F[[[list of scripts that will execute in order as soon as possible]]]]
の末尾に[VAR[要素]]を追加します。
:丁:
[VAR[要素]]の[F[[[節点文書]]]]の
[F[[[set of scripts that will execute as soon as possible]]]]
に[VAR[要素]]を追加します。
:戊:
[VAR[要素]]を作成した[[構文解析器]]の[F[[[文書]]]]の
[F[[[pending parsing-blocking script]]]]
を、[VAR[要素]]に設定します。
]FIG]
]FIG]

[316] [[スクリプトのfetch]]の[VAR[続きの処理]]は、
[VAR[スクリプト]]について次のようにしなければ[['''なりません''']] [SRC[>>130]]。
[FIG(steps)[
= [317] [VAR[要素]]の[F[[[スクリプトのスクリプト]]]]を、[VAR[スクリプト]]に設定します。
= [318] [VAR[要素]]の[F[[[スクリプトの準備完了]]]]とします (>>365)。
]FIG]

[320] [[スクリプトの準備]]は、次の動作から呼び出されることがあります。
[FIG(list)[
- [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[挿入手順]] (>>250)
- [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[子供]]の[[挿入手順]] (>>250)
- [CODE(HTML)@en[[[<script src>]]]] の[[属性の追加]]
]FIG]

[319] [[利用者エージェント]]は、[[性能]]のため、
[CODE(HTMLe)@en[[[script]]]] [[要素]]に [CODE(HTMLa)@en[[[src]]]]
[[属性の設定]]が行われた時点で、[[スクリプトの準備]]による[[スクリプトのfetch]]を行って構いません
[SRC[>>130]]。 (実行はまだ行わず、後に[[文書に挿入]]された時に 
([[属性]]などの状況が変わっていなければ) [[fetch]] 結果を利用します。)

;; [326] 実装によっては更に早い段階 ([[preload scanner]]) で [[fetch]]
が実行されています。

[264] [[スクリプトの準備]]の処理に関連して、
[CODE(HTMLe)@en[[[script]]]] [[要素]]には次のような性質があります。
[FIG(list)[
- [285] [CODE(HTMLa)@en[[[language]]]] [[属性]]は、 [CODE(HTMLa)@en[[[type]]]]
[[属性]]があれば無視されます。
- [287] [CODE(HTMLa)@en[[[type]]]] [[属性]]の [[MIME型]]に[[引数]]を指定すると、
[[JavaScript]] とはみなされず、[[スクリプト]]は実行されません。
- [265] [CODE(DOMa)@en[[[innerHTML]]]] などで挿入された [CODE(HTMLe)@en[[[script]]]]
[[要素]]は、実行されません。
- [266] [[構文解析器]]によって挿入されたものの実行されなかった [CODE(HTMLe)@en[[[script]]]]
[[要素]]は、(適当な[[属性]]の変更などを経て) 別の機会に実行される可能性があります。
その場合は [CODE(HTMLa)@en[[[async]]]] [[属性]]が設定されていたものとみなされることがあります。
- [321] [CODE(HTMLa)@en[[[event]]]] [[属性]]や [CODE(HTMLa)@en[[[for]]]]
[[属性]]は、[[古典スクリプト]]でのみ効力を持ちます。
- [322] [CODE(HTMLa)@en[[[charset]]]] [[属性]]は、[[古典スクリプト]]でのみ効力を持ちます。
- [363] [[構文解析器]]の実行途中で挿入された [CODE(HTMLe)@en[[[script]]]]
[[要素]]が [[fetch]] 待ちの間に他の[[文書]]に [[adopt]] されると、
その[[スクリプト]]は実行されなくなります。しかし [[fetch]]
完了まで[[構文解析器]]の停止や[[[CODE(DOMe)@en[load]]イベントの遅延]]は継続します。
- [501] [CODE(HTMLa)@en[[[defer]]]] [[属性]]と [CODE(HTMLa)@en[[[async]]]]
[[属性]]は、[[古典スクリプト]]では [CODE(HTMLa)@en[[[src]]]]
[[属性]]が無い時無視されます。
- [502] [[古典スクリプト]]では [CODE(HTMLa)@en[[[src]]]]
[[属性]]の有無で動作が大きく変わりますが、
[[モジュールスクリプト]]ではそこまで大きくは変わりません。
]FIG]

** スクリプトの準備完了

[364] [CODE(HTMLe)@en[[[script]]]] [[要素]]は、
[[スクリプトの準備]]の実行の過程で、
[DFN[[RUBYB[スクリプトの準備完了]@en[the script is ready]]]] [SRC[>>130]]
となります。

[248] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[F[[[スクリプトが準備完了]]]]するまで、
[F[[[節点文書]]]]の[[loadイベントを遅延]]しなければ[['''なりません''']] [SRC[>>130]]。
つまり[[構文解析器]]の動作中に[[スクリプトのfetch]]が開始されると、
それが (成功であれ失敗であれ) 完了するまでは [CODE(DOMe)@en[[[load]]]]
は[[発火]]されません。

;; [367] [F[[[節点文書]]]]が変化した場合の扱いは不明です。

[365] [VAR[要素]]の[[スクリプトの準備完了]]により、
次のようにしなければ[['''なりません''']] [SRC[>>130]]。
[FIG(steps)[
= [366] >>360 の実行タイミングにより、
[FIG(switch)[
:甲、乙、戊:
[FIG(steps)[
= [368] [VAR[要素]]の[F[[[「構文解析器実行準備完了」]]フラグ]]を設定します。
= [475] >>453 や >>489 の[[スピン]]を終了できるかもしれません。
]FIG]
:丙:
[FIG(steps)[
= [369] [VAR[リスト]]を、 >>361 の
[F[[[list of scripts that will execute in order as soon as possible]]]] に設定します。
= [373] [VAR[リスト]]の最初の[[要素]]が[VAR[要素]]の場合、
== [371] [VAR[要素]]の[F[準備完了フラグ]]を設定します。
= [370] [VAR[リスト]]の最初の[[要素]]の[F[準備完了フラグ]]が設定されている限り繰り返し、
== [372] [VAR[リスト]]の最初の[[要素]]について[[スクリプトブロックを実行]]します。
== [374] [VAR[リスト]]から最初の[[要素]]を削除します。
= [497] [[stop parsing]] 内の[[スピン]]中なら、これを終了できるかもしれません。
]FIG]
:丁:
[FIG(steps)[
= [375] [VAR[要素]]について[[スクリプトブロックを実行]]します。
= [376] >>361 の 
[F[[[set of scripts that will execute as soon as possible]]]]
から[VAR[要素]]を削除します。
= [498] [[stop parsing]] 内の[[スピン]]中なら、これを終了できるかもしれません。
]FIG]
:己:
[FIG(steps)[
= [378] [VAR[要素]]について[[スクリプトブロックを実行]]します。
]FIG]
]FIG]
]FIG]

;; [377] >>361 とは通常は[VAR[要素]]の[F[[[節点文書]]]]ですが、
処理がここに到着するまでの間に[VAR[要素]]が他の[[文書]]に [[adopt]]
される可能性もあります。

** 実行タイミング

[164] [CODE(HTMLe)@en[[[script]]]] [[要素]]から作成された[[スクリプト]]の実行のタイミングは、
[[構文解析器]]によって作られた [CODE(HTMLe)@en[[[script]]]]
[[要素]]か否かや、[[属性]]の有無により、何種類かあります。

[FIG(list)[
- [169] その場
-- その他の場合
-- その場 (挿入や[[終了タグ]]の時点) で実行されます。
[[スクリプト]]内から呼ばれている場合も、再帰的に[[スクリプト]]を実行します。
- [165] [[文書]]の[F[[[pending parsing-blocking script]]]]
-- ([CODE(HTMLa)@en[[[src]]]] & [["parser-inserted"]]) or [[has a style sheet that is blocking scripts]] の場合
-- [[構文解析器]]によって[[スクリプト]]を実行中ならすべて完了させてから、
必要な[[スクリプト]]や[[スタイルシート]]が読み込まれるまで[[構文解析]]を中断し、
読み込まれた時点で実行され、[[構文解析]]も再開されます。
- [166] [[文書]]の[F[[[list of scripts that will execute when the document has finished parsing]]]]
-- [CODE(HTMLa)@en[[[src]]]] & [CODE(HTMLa)@en[[[defer]]]] & [["parser-inserted"]] の場合
-- [[stop parsing]] が実行します。
- [167] [[文書]]の[F[[DFN[[[list of scripts that will execute in order as soon as possible]]]]]] [SRC[>>130]]
-- [CODE(HTMLa)@en[[[src]]]] の場合
-- [[fetch]] 完了時の[[タスク]]で実行します。
-- [[構文解析]]実行中に登録された場合、実行完了まで [CODE(DOMe)@en[[[load]]]] を遅延させます。
- [168] [[文書]]の[F[[DFN[[[set of scripts that will execute as soon as possible]]]]]] [SRC[>>130]]
-- [CODE(HTMLa)@en[[[src]]]] & [CODE(HTMLa)@en[[[async]]]] の場合
-- [[fetch]] 完了時の[[タスク]]で実行します。
-- [[構文解析]]実行中に登録された場合、実行完了まで [CODE(DOMe)@en[[[load]]]] を遅延させます。
]FIG]

[170] >>169、>>165、>>166 は、[[構文解析器]]を呼び出した[[タスク]]の中で直接[[スクリプト]]が同期的に実行されます。
いずれにせよ[[構文解析器]]内部で[[スクリプト]]が実行されるのは、 [[HTML]] または [[SVG]]
の [CODE(HTMLe)@en[[[script]]]] [[終了タグ]] (または
[[SVG]] [CODE(HTMLe)@en[[[script]]]] [[空要素タグ]]) の処理中に限られます。

[171] >>167 と >>168 は、[[構文解析器]]とは別の[[タスク]]で[[スクリプト]]が実行されます。

[172] [[タスク]]は[[イベントループ]]によって処理されるので、
>>171 の場合[[構文解析器]]と[[スクリプト]]が同時に実行されることはありません。
また [[UIイベント]]や [CODE(DOMm)@en[[[setTimeout]]]] の[[コールバック]]などが[[構文解析器]]の動作期間中に実行されることもありますが、
やはり別の[[タスク]]として処理されるので、[[構文解析器]]や他の[[スクリプト]]と同時に実行されることはありません。

[173] なお [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[スクリプト]]は、
それ自体のコードの実行の他に、前後に各種[[イベント]]が[[dispatch]]されたり、
[[エラーの報告]]が行われたりすることがあり、[[同期的]]に複数の[[スクリプト]]が同[[タスク]]内で実行されることがあります
[WEAK[(が、やはり同時にではありません)]]。

[174] [CODE(HTMLe)@en[[[script]]]] [[タグ]]の処理前には[[マイクロタスクチェックポイント]]があり、
[[マイクロタスク]]があればそのタイミングで、つまり[[構文解析器]]と同じ[[タスク]]の内部で同期的に実行されます。

*** 実行タイミングの決定

[360] [VAR[要素]]の実行タイミングの種別は、次の通り決定しなければ[['''なりません''']] [SRC[>>140]]。
甲乙丙丁戊己のいずれかに定まります。

[FIG(steps)[
= [342] [VAR[要素]]の[F[[[スクリプトの型]]]]が [CODE[[[classic]]]] の場合、
== [356] [VAR[要素]]が [CODE(HTMLa)@en[[[src]]]] [[属性]]を持つ場合、
=== [352] [VAR[要素]]が [CODE(HTMLa)@en[[[async]]]] [[属性]]を持たない場合、
==== [347] [VAR[要素]]が[F[[[「構文解析器挿入」]]フラグ]]を持つ場合、
===== [345] [VAR[要素]]が [CODE(HTMLa)@en[[[defer]]]] [[属性]]を持つ場合、
====== 甲
===== [346] それ以外の場合、
====== 乙
==== [348] それ以外で、[VAR[要素]]が[F[[[「非ブロッキング」]]フラグ]]を持たない場合、
===== 丙
==== [351] それ以外の場合、
===== 丁
=== [353] それ以外の場合、
==== 丁
== [357] それ以外の場合、
=== [358] 
[FIG(list)[
- [VAR[要素]]が [CODE(HTMLa)@en[[[src]]]] [[属性]]を持たず、
- [VAR[要素]]が[F[[[「構文解析器挿入」]]フラグ]]を持ち、
- [VAR[要素]]を作成した[[構文解析器]]の[F[[[スクリプト入れ子水準]]]]が1[[以下]]
- [VAR[要素]]を作成した[[構文解析器]]の[F[[[文書]]]]が[[スクリプトをブロックしているスタイルシートを持つ]]
]FIG]
... のすべてを満たす場合、
==== 戊
=== [359] それ以外の場合、
==== 己
= [343] [VAR[要素]]の[F[[[スクリプトの型]]]]が [CODE[[[module]]]] の場合、
== [354] [VAR[要素]]が [CODE(HTMLa)@en[[[async]]]] [[属性]]を持たない場合、
=== [349] [VAR[要素]]が[F[[[「構文解析器挿入」]]フラグ]]を持つ場合、
==== 甲
=== [350] それ以外で、[VAR[要素]]が[F[[[「非ブロッキング」]]フラグ]]を持たない場合、
==== 丙
=== [355] それ以外の場合、
==== 丁
== [344] それ以外の場合、
=== 丁
]FIG]

;; [362] 丙、丁は通常の [CODE(HTMLe)@en[[[script]]]] [[要素]]としての実行、
それ以外は[[構文解析器]]による [CODE(HTMLe)@en[[[script]]]]
[[要素]]の実行です。

*** pending parsing-blocking script

[467] [[文書]]の[F[[DFN[[[pending parsing-blocking script]]]]]] [SRC[>>130]]
は、[CODE(HTMLe)@en[[[script]]]] [[要素]]か null のいずれかです。
初期状態では null です。

[468] これは、 [CODE(HTML)@en[[[<script src>]]]] で指定された[[外部スクリプト資源]]の読み込み待ち、
または[[スタイルシート]]の読み込み待ち ([F[[[has a style sheet that is blocking scripts]]]])
のために[[スクリプト]]の実行および[[構文解析器]]の一切の動作が停止される時に使われます。

[469] [[スクリプトの準備]]で[[スクリプト]]が実行されない場合に、
[CODE(HTMLe)@en[[[script]]]] [[要素]]に設定されます (>>361)。
準備が整って[[スクリプト]]が実行される時に、消去されます (>>450)。

[470] [CODE(JS)@en[[[document.write]]]], [CODE(JS)@en[[[document.writeln]]]],
[CODE(JS)@en[[[document.close]]]] では、
[[構文解析器]]の処理を実行するべきかどうかの判定に使われています。

[476] [[pending parsing-blocking script]] が設定されている時は、 (他のフラグの状態も含めて)
[[構文解析器]]の進行が完全に停止されていますから、
新たな [CODE(HTMLe)@en[[[script]]]] [[要素]]が[[構文解析器]]により挿入されることもなく、
従って別の[[要素]]が [[pending parsing-blocking script]] となることもありません。

[466] [CODE(HTMLe)@en[[[script]]]] [[終了タグ]]の処理 (>>423) から呼び出される、
[VAR[構文解析器]]の [[pending parsing-blocking script]] の処理は、
次のようにしなければ[['''なりません''']] [SRC[>>422, >>424]]。

[FIG(steps)[
= [444] [VAR[構文解析器]]の[F[[[文書]]]]に [F[[[pending parsing-blocking script]]]] がなければ、
ここで停止します。
= [445] [VAR[構文解析器]]の[F[[[スクリプト入れ子水準]]]]が0''以外''なら、
== [447] [VAR[構文解析器]]の[F[[[parser pause flag]]]]を、[[真]]に設定します。
== [448] [VAR[構文解析器]]の (本処理を呼び出した[[木構築]]処理を呼び出した) [[字句化]]を中断します。
== [471] ここで停止します。
= [449] [VAR[スクリプト]]を、[VAR[構文解析器]]の[F[[[文書]]]]の [F[[[pending parsing-blocking script]]]] に設定します。
= [450] [VAR[構文解析器]]の[F[[[文書]]]]の [F[[[pending parsing-blocking script]]]] を、
null に設定します。
= [451] [VAR[構文解析器]]について[[字句化器のブロック]]を実行します。
= [452] [VAR[構文解析器]]の[F[[[文書]]]]の [F[[[has a style sheet that is blocking scripts]]]]
フラグが設定されているか、[VAR[スクリプト]]の[F[[[「構文解析器実行準備完了」]]フラグ]]が設定されて''いない''なら、
== [453] [VAR[構文解析器]]の[F[[[文書]]]]の[F[[[イベントループ]]]]について[[イベントループをスピン]]します。
終了条件は、[VAR[構文解析器]]の[F[[[文書]]]]が [F[[[has no style sheet that is blocking scripts]]]]
となり、かつ[VAR[スクリプト]]の[F[[[「構文解析器実行準備完了」]]フラグ]]が設定されることです。
続きの処理は、[VAR[構文解析器]]と[VAR[スクリプト]]について >>446 を実行することです。
= [472] それ以外なら、
== [473] [VAR[構文解析器]]と[VAR[スクリプト]]について >>446 を実行します。
]FIG]

[446] 続きの処理は、[VAR[構文解析器]]と[VAR[スクリプト]]について次のようにしなければ[['''なりません''']] [SRC[>>422, >>424]]。

[FIG(steps)[
= [454] [VAR[構文解析器]]が [F[abort済み]] (= [[abort a parser]] 済み) なら、
ここで停止します。
= [455] [VAR[構文解析器]]について[[字句化器のブロック解除]]を実行します。
= [456] [VAR[構文解析器]]の[F[[[挿入点]]]]を、[VAR[構文解析器]]の[F[[[次入力文字]]]]の直前に設定します。
= [457] [VAR[構文解析器]]の[F[[[スクリプト入れ子水準]]]]を[[インクリメント]]します。
= [458] [VAR[スクリプト]]について[[スクリプトブロックを実行]]します。
= [459] [VAR[構文解析器]]の[F[[[スクリプト入れ子水準]]]]を[[デクリメント]]します。
= [460] [VAR[構文解析器]]の[F[[[スクリプト入れ子水準]]]]が0なら、
== [461] [VAR[構文解析器]]の[F[[[parser pause flag]]]]を、[[偽]]に設定します。
= [462] [VAR[構文解析器]]の[F[[[挿入点]]]]を、 null に設定します。
= [463] [VAR[構文解析器]]の [[pending parsing-blocking script]] の処理 (>>466) を実行します。
]FIG]

[474] [F[[[スクリプト入れ子水準]]]]の分岐 (>>445) より、
[CODE(JS)@en[[[document.write]]]] の再帰的な[[構文解析器]]実行中に
[CODE(HTMLe)@en[[[script]]]] [[要素]]で処理が中断される場合には、
そこで [CODE(JS)@en[[[document.write]]]] の[[構文解析]]は中断されて、
[CODE(JS)@en[[[document.write]]]] の呼び出し元[[スクリプト]]の続きの実行に移ります。
再帰的な[[構文解析器]]と[[スクリプト]]がすべて終了して最外[[構文解析器]]にまで戻ってきた時に、
先送りしていた [CODE(HTMLe)@en[[[script]]]] [[要素]]を (更に待つ必要があるなら待ってから)
実行することになります。

;; [478] この分岐は、戊と己の分岐に対応します。

*** list of scripts that will execute when the document has finished parsing

[483] [[文書]]の[F[[DFN[[[list of scripts that will execute when the document has finished parsing]]]]]] [SRC[>>130]]
は、 [CODE(HTMLe)@en[[[script]]]] [[要素]]のリストです。
初期状態では空です。

[485] これは [CODE(HTMLa)@en[[[defer]]]] [[属性]]の動作を実現するためのものです。
([[モジュールスクリプト]]の場合は標準動作が [CODE(HTMLa)@en[[[defer]]]]
[[属性]]相当なので、それも含まれます。)

;; [486] 甲のケースです。

[487] [[構文解析器]][VAR[構文解析器]]の処理終了時に呼び出される [[stop parsing]]
で、構文解析終了後のスクリプト実行の処理は、
[VAR[続きの処理]]について次のようにしなければ[['''なりません''']] [SRC[>>482]]。

[FIG(steps)[
= [488] [VAR[構文解析器]]の[F[[[文書]]]]の
[F[[[list of scripts that will execute when the document has finished parsing]]]]
が空なら、
== [492] [VAR[構文解析器]]について[VAR[続きの処理]]を実行します。
== [491] ここで停止します。
= [493] [VAR[スクリプト]]を、
[VAR[構文解析器]]の[F[[[文書]]]]の
[F[[[list of scripts that will execute when the document has finished parsing]]]]
の最初の要素に設定します。
= [489] [VAR[構文解析器]]の[F[[[文書]]]]の[F[[[イベントループ]]]]について[[イベントループをスピン]]します。
終了条件は、[VAR[構文解析器]]の[F[[[文書]]]]が [F[[[has no style sheet that is blocking scripts]]]]
となり、かつ[VAR[スクリプト]]の[F[[[「構文解析器実行準備完了」]]フラグ]]が設定されることです。
続きの処理は、[VAR[構文解析器]]と[VAR[スクリプト]]と[VAR[続きの処理]]について >>490 を実行することです。
]FIG]

[490] 条件達成後、[VAR[構文解析器]]と[VAR[スクリプト]]と[VAR[続きの処理]]について次のようにしなければ[['''なりません''']] [SRC[>>482]]。

[FIG(steps)[
= [494] [VAR[スクリプト]]について[[スクリプトブロックを実行]]します。
= [495] [VAR[スクリプト]]を[VAR[構文解析器]]の[F[[[文書]]]]の
[F[[[list of scripts that will execute when the document has finished parsing]]]]
から削除します。
= [496] [VAR[構文解析器]]と[VAR[続きの処理]]について、
構文解析終了後のスクリプト実行の処理 (>>487) を実行します。
]FIG]

** 実行

[379] [VAR[要素]]に関する[DFN[[RUBYB[スクリプトブロックの実行]@en[execute a script block]]]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>130]]。
[FIG(steps)[
= [380] [VAR[要素]]の[F[[[「構文解析器挿入」]]フラグ]]が設定されている場合、
== [381] [VAR[要素]]の[F[[[節点文書]]]]が[VAR[要素]]を作成した[[構文解析器]]の[F[[[文書]]]]と異なる場合、
=== [382] ここで停止します。
= [383] [VAR[要素]]の[F[[[スクリプトのスクリプト]]]]が null の場合、
== [390] [VAR[要素]]のエラーを通知 (>>391) します。
== [384] ここで停止します。
= [395] [VAR[要素]]の[F[[[外部ファイルから]]]]フラグが設定されているか、
[VAR[要素]]の[F[スクリプトの型]]が [CODE[module]] なら、
== [397] [VAR[neutralised doc]] を、[VAR[要素]]の[F[[[節点文書]]]]に設定します。
== [396] [VAR[neutralised doc]] の [F[[[ignore-destructive-writes counter]]]]
を[[インクリメント]]します。
= [398] [VAR[旧スクリプト]]を、[VAR[要素]]の[F[[[節点文書]]]]の
[F[[CODE(DOMa)@en[[[currentScript]]]]]] に設定します。
= [315] [VAR[要素]]の[F[スクリプトの型]]が [CODE[classic]] で、
[VAR[要素]]の[F[根]]が[[影根]]で''ない''なら、
== [399] [VAR[要素]]の[F[節点文書]]の [F[[CODE(DOMa)@en[currentScript]]]]
を、[VAR[要素]]に設定します。
= [392] それ以外なら、
== [393] [VAR[要素]]の[F[節点文書]]の [F[[CODE(DOMa)@en[currentScript]]]]
を、 [CODE[null]] に設定します。
= [330] [VAR[要素]]の[F[スクリプトのスクリプト]]を[[実行][スクリプトを実行]]します。
= [402] [VAR[要素]]の[F[[[節点文書]]]]の [F[[CODE(DOMa)@en[[[currentScript]]]]]]
を、[VAR[旧スクリプト]]に設定します。
= [406] [VAR[要素]]の[F[[[外部ファイルから]]]]フラグが設定されているか、
[VAR[要素]]の[F[スクリプトの型]]が [CODE[module]] なら、
== [404] [VAR[neutralised doc]] の [F[[[ignore-destructive-writes counter]]]]
を[[デクリメント]]します。
= [408] [VAR[要素]]の[F[[[外部ファイルから]]]]フラグが設定されていて、
[VAR[要素]]の[F[スクリプトの型]]が [CODE[module]] なら、
== [407] [[単純イベントを発火]]します。
[FIG(list members)[ [400] [[単純イベント]]
: [F[[[イベント型]]]] : [CODE(DOMe)@en[[[load]]]]
: [F[[[対象]]]] : [VAR[要素]]
]FIG]

]FIG]
]FIG]

]FIG]

;; [520] 従って、 [CODE(DOMa)@en[currentScript]] は、
[[古典スクリプト]]実行時にのみ有効です。しかも[[影木]]中の[[スクリプト]]では使えません。

** エラーの通知

[410] [[スクリプト]]の [[fetch]] に関するエラーは、 [CODE(DOMe)@en[[[error]]]]
[[イベント]]で通知されます。これは[[起源]]に関わらず詳しい情報が提供されません。

[305] [VAR[要素]]のエラーを通知する[[タスクを追加]]するとは、次のようにすることを言います。
[FIG(steps)[
= [306] [[タスクキュー]]に[[タスクを追加]]します [SRC[>>130]]。
[FIG(list members)[
[FIGCAPTION[
[[タスク]]
]FIGCAPTION]
:処理: [VAR[要素]]のエラーを通知 (>>391) します。
:[F[[[タスク源]]]]: ?
]FIG]
]FIG]

[391] [VAR[要素]]のエラーを通知するとは、次のようにすることを言います [SRC[>>130]]。
[FIG(steps)[
= [307] [[単純イベントを発火]]します。
[FIG(list members)[
[FIGCAPTION[
[[単純イベント]]
]FIGCAPTION]
: [F[[[イベント型]]]] : [CODE(DOMe)@en[[[error]]]]
: [F[[[対象]]]] : [VAR[要素]]
]FIG]
]FIG]

[411] [[スクリプト]]の実行時エラーは、他の[[スクリプト]]同様に[[例外の報告]]により処理されます。
こちらは[[起源]]次第で報告内容が省略されることがあります。

* [CODE(DOMi)@en[HTMLScriptElement]] インターフェイス

[190] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[要素インターフェイス]]は、
[DFN[[CODE(DOMi)@en[[[HTMLScriptElement]]]]]] です [SRC[>>130]]。

[191] [CODE(DOMi)@en[[[HTMLElement]]]] [[インターフェイス]]を[[継承]]しつつ、
次の[[メンバー]]が定義されています。

[FIG(short list)[ [547] [CODE(DOMi)@en[HTMLScriptElement]] [[インターフェイス]]の[[メンバー][インターフェイスメンバー]]
- [CODE(DOMa)@en[[[async]]]]
- [CODE(DOMa)@en[[[charset]]]]
- [CODE(DOMa)@en[[[crossOrigin]]]]
- [CODE(DOMa)@en[[[defer]]]]
- [CODE(DOMa)@en[integrity]]
- [CODE(DOMa)@en[[[nonce]]]]
- [CODE(DOMa)@en[noModule]]
- [CODE(DOMa)@en[[[src]]]]
- [CODE(DOMa)@en[[[text]]]]
- [CODE(DOMa)@en[[[type]]]]
- [CODE(DOMa)@en[[[event]]]]
- [CODE(DOMa)@en[[[htmlFor]]]]
- [CODE[referrerPolicy]]
]FIG]

* セキュリティー

[43]
'''Web メイルにおける HTML メイル''':
[[HTML]] を[[利用者界面]]として利用した [[MUA]]
(いわゆる [[Webメイル]]) で [[HTML]]
[[文書]]が含まれる[[メイル]]・[[メッセージ]]を表示する時には特に注意が必要です。
[CODE(HTMLe)@en[[[script]]]] [[要素]]など[[スクリプト]]が実行され得るものをそのまま
[[HTML]] に含めると、 [[Webブラウザ]]側でその [[HTML]] [[文書]]全体 
[WEAK[([[HTMLメイル]]自体とその周りの[[利用者界面]]を含む全体)]]
の権限で[[スクリプト]]が実行されることになります。

[[Webブラウザ]]外に被害が及ぶかという点では通常の鯖側の[[スクリプト]]の安全上の脅威と変わりませんが、
[[利用者界面]]の部分を介して[[利用者]]の意図せぬ (削除などの)
操作を行ったり、受信したメッセージや個人情報が流出したりする危険性があります。

* 歴史

** [CODE[script]] の誕生

[2] [CODE(HTMLe)[script]] 要素は、 [[NN2]] が [[LiveScript]]
と共に実装したのがはじめであると考えられています。

[590] 
[CITE[Navigator Scripting]], [TIME[2024-08-16T09:22:50.000Z]], [TIME[1997-06-06T18:19:26.337Z]] <http://web.archive.org/web/19970606181855fw_/http://www28.netscape.com/eng/mozilla/2.0/handbook/javascript/script.html>

JS 1.0

[591] [CITE[null]], [TIME[2024-08-16T09:29:41.000Z]], [TIME[2001-02-08T10:33:37.072Z]] <https://web.archive.org/web/20010208103254/http://home.netscape.com/eng/mozilla/3.0/handbook/javascript/getstart.htm#996824>

JS 1.1



[FIG(data)[ [592] [[HTML要素概説]]

:[F[要素名]]:[CODE[script]]
:日付:[TIME[1996]]
:説明:
[TIME[1996]]頃の
[[Netscape Navigator 2.0]]
は、
[CODE[script]]
を実装した。
現行仕様である。
:出典:
[REFS[

-
[DFN[NN2JS]]:
[CITE@en[Navigator Scripting]], 
[DATA(.author)[[[Netscape Communications Corporation]]]],
[TIME(.published)[1996]],
[TIME[2024-08-16T09:22:50.000Z]], [TIME[1997-06-06T18:19:26.337Z]] <http://web.archive.org/web/19970606181855fw_/http://www28.netscape.com/eng/mozilla/2.0/handbook/javascript/script.html>


]REFS]

]FIG]



** HTML 3.2

[20] [CODE(HTMLe)[script]] 要素がはじめて公式な仕様書に入ったのは
1997年1月の [[HTML 3.2]] でした。しかし、
このときの最終的な勧告では詳細が決まらず、
将来の版のために予約すると述べるに留まっていました。

> <!ELEMENT SCRIPT - - CDATA -- placeholder for script statements -->
[SRC[HTML 3.2 DTD]]

** HTML4

[12] その後1997年12月の [[HTML 4]] で、 [CODE(HTMLe)[script]]
要素型はようやく正式な仕様の一部となりました。
当時 [[WinIE]] や [[NN]] が実装していた [CODE(HTMLe)[script]]
の基本的な機能が仕様に入りましたが、 WinIE だけが実装していた
[CODE(HTMLa)[event]] 属性と [CODE(HTMLa)[for]] 属性は、
将来のために予約とされました。

[24] 1998年に勧告された [[DOM 1]] やその後の [[DOM 2]] では、
[CODE(HTMLe)[script]] 要素型に対応する [CODE(DOMi)[[[HTMLScriptElement]]]]
界面が定義されています。ここでは、標準の属性の他、
[CODE(HTMLa)[for]] 属性と [CODE(HTMLa)[event]] 属性も[Q[将来の使用のために予約]]
として定義だけされています。

[25] >>24 そんな将来くるのかな〜。来たら嫌だな〜

[26] >>24-25 将来の使用は M$ の仕様の間違いじゃないのかな。

[32]
>>24-26 
その後 [[XHTML 1]] が標準化されましたが、予約2属性はやはり正式な仕様には昇格せず、
このまま忘れ去られようとしています。しかし、両属性の機能は拡張して汎用化されて
[[XML事象]]仕様の一部として標準化されました (2002年)。

[REFS[
- [29] [[HTML 4]]
-- [CITE[18 Scripts in HTML documents]]
<IW:HTML4:"interact/scripts.html#edef-SCRIPT">
-- [CITE[Element content]]
<IW:HTML4:"appendix/notes.html#h-B.3.2.1">
- [[ECMA-290]] 
- [[XHTML 1.0]]
-- [CSECTION[4.8. Script and Style elements]]
(参考) <IW:XHTML10:"h-4.8">
]REFS]


[4] [CODE(HTMLa)[[[src]]]] 属性が指定されている場合、
スクリプトはその外部資源で定義されます。 
[ABBR[[[UA]]] [利用者エージェント]]
は[[内容]]を無視し、指定された 
[ABBR[URI] [統一資源識別子]] のスクリプトを取り寄せなければなりません。
[CODE(HTMLa)[src]] 属性が指定されていない場合、
[VAR[UA][利用者エージェント]] 
は内容をスクリプトとして解釈しなければなりません。
[SRC[HTML 4 18.2.1]]

[30] [ABBR[[[XHTML]]] [拡張可能ハイパーテキスト・マーク付け言語]] 
より前の [ABBR[HTML] [ハイパーテキスト・マーク付け言語]] では、 
[CODE(HTMLe)[script]]
要素の内容は [CODE(HTMLe)[[[style]]]] 要素の内容同様[[文字データ]]
([CODE(SGML)[[[CDATA]]]]) 宣言内容とされていました。
つまり、 [CODE(HTMLe)[script]] 要素内ではほとんどの[[マーク]]は認知されず、
[ABBR[[CODE(SGML)[[[etago]]]]] [終了タグ開き]] ([CODE(HTML)[</]]) の
直後に[[名前開始文字]] [WEAK[([[ラテン文字]]など)]] または 
[ABBR[[CODE(SGML)[[[tagc]]]]] [タグ閉じ]] ([CODE(HTML)[>]])
が来たらそこで [CODE(HTMLe)[script]] 要素が終わることになっていました。

ですから、スクリプト言語の[[演算子]]などとして 
[ABBR[HTML] [ハイパーテキスト・マーク付け言語]]
の[[マーク文字]]が登場することがよくありますが、
そのような場合にもほとんど[[文字参照]]化する必要がありませんでした。

[36] 
[ABBR[[CODE(SGML)[[[ETAGO]]]]] [終了タグ閉じ]] がかけないのは 
[CODE(JS)[[CODE(DOMa)[[[document]]]].[CODE(DOMm)[[[write]]]]]]
のデータを作る時などにしばしば問題となり、その最盛期には、
これが原因でうまく動かないことに悩む人もよく見受けられました。
回避するためには、そのスクリプト言語の文字列連結を使ったり
([SAMP(JS)['<' + '/a>']])、 escape (quote) 機能を使ったり
([SAMP(JS)['<\/a>']])、文字生成関数を使ったり 
([SAMP(VB)["<" & [[Chr]] (47) & "a>"]])
する方法がよく紹介されました。

[33] しかし、 [ABBR[[[XML]]] [拡張可能マーク付け言語]] では 
[ABBR[[CODE(SGML)[CDATA]]] [文字データ]] 宣言内容は使えないので、
[ABBR[[[XHTML 1]]] [拡張可能ハイパーテキスト・マーク付け言語 1]] では 
[ABBR[[CODE(XML)[[[PCDATA]]]]] [解析可能文字データ]] 
と宣言されています。
ですから、 [ABBR[[CODE(SGML)[STAGO]]] [開始タグ開き]] 
([CODE(XML)[<]]) は必ず [[escape]]
して [CODE(XML)[&lt;]] としなければならないなどの制限があります。
これを回避するために [[[CODE(XML)[CDATA]]区間]]を使う方法がよく紹介されますが、
そうすると多くの既存の [ABBR[WWW] [World Wide Web]] 
ブラウザとの互換性が失われてしまいます。
ですから、 [ABBR[XHTML] [拡張可能ハイパーテキスト・マーク付け言語]] で 
[CODE(HTMLe)[script]] 要素を使う時は [CODE(HTMLa)[src]]
属性を使った外部スクリプトとするのが良いと言われています。

[41]
[CODE(HTMLa)[src]] で指定された資源が取得できない時に内容を使うとする説があります。

[CITE[SCRIPT - Client-side Script(jp)]] <http://www.htmlhelp.com/ja/reference/html40/special/script.html>

しかし、 [ABBR[HTML] [ハイパーテキスト・マーク付け言語]] 4 
の規定と矛盾します。
[WEAK[(この文書はほんとうに [ABBR[HTML] [ハイパーテキスト・マーク付け言語]] 4 に基づいているのでしょうか?)]]

[47]
[CITE[Working with the WebKit Nightly Builds]] <http://developer.apple.com/opensource/internet/nightlywebkit.html>
([[名無しさん]] [WEAK[2006-11-05 02:47:22 +00:00]])

[48]
[CITE[Surfin’ Safari - Blog Archive &#187; Understanding HTML, XML and XHTML]] <http://webkit.org/blog/?p=68>

[EG[
[37] 二乗した結果を書き出す例 [SRC[HTML 4 18.3.2 改]]

[[JavaScript]] による例
[PRE(HTML)[
<SCRIPT type="text/javascript">
<!--  to hide script contents from old browsers
  function square(i) {
    document.write("The call passed ", i ," to the function.","<BR>");
    return i * i;
  }
  document.write("The function returned ",square(5),".");
// end hiding contents from old browsers  -->
</SCRIPT>
]PRE]

[[VBScript]] による例
[PRE(HTML)[
<SCRIPT type="text/vbscript">
<!--
  Function Square(i)
    Call Document.Write("The call passed ",i," to the function.","<BR>")
    Square = i * i
  End Function
  Document.Write("The function returned ",Square(5),".")
' -->
</SCRIPT>
]PRE]

[[Tcl]] による例
[PRE(HTML)[
<SCRIPT type="text/tcl">
<!--  to hide script contents from old browsers
  proc square {i} {
    document write "The call passed $i to the function.<BR>"
    return [expr $i * $i]
  }
  document write "The function returned [square 5]."
# end hiding contents from old browsers  -->
</SCRIPT>
]PRE]
]EG]

[28] [CODE(HTMLe)[script]] 要素によるスクリプトは、
文書の読込み時に実行されます [SRC[HTML 4 18.1]]。

[256] [CODE(HTMLa)[src]] 属性による外部スクリプトは優先的に実行されるという説を唱える人がいますが、
根拠は不明です。特定の UA ではそうなのかもしれませんが、
少なくても HTML 4 は何も規定していません。
但し、 [CODE(HTMLa)[[[defer]]]] 属性や [CODE(HTMLa)[[[event]]]]
属性は実行時機に影響するのかもしれません。

** 実装

[31] [CODE(file)[[[CGI.pm]]]] は、 XHTML 出力 mode だと、
[[注釈宣言]]内に [[[CODE(XML)[CDATA]]区間]]宣言という素晴らしい出力をしてくれます(w

[50]
[CITE[Bug 60724 &#8211; <script> tag inside <applet> tag executes if Java enabled]] ([CODE[2007-02-10 13:51:33 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=60724>
([[名無しさん]])

[[#comment]]


** 不思議解釈

[34]
[CODE(HTMLa)[src]] 属性のある [CODE(HTMLe)[script]] の中に 
[CODE(HTMLe)[noscript]] を書く困った人がいます。。。

([[名無しさん]] [WEAK[2004-09-14 07:54:57 +00:00]])

[17] 仕様によれば (>>4)、 [CODE(HTMLa)[src]] 属性があるとき UA
は内容を無視しなければなりません。この規定に特に条件は無いようなので、
スクリプト未対応の UA であっても同様でしょう。
ですから、 [CODE(HTMLe)[script]] の中に [CODE(HTMLe)[noscript]]
を書くと、 HTML 4 対応の [CODE(HTMLe)[script]] 未対応 UA
には無視されてしまうはずです。

[15]
しかし、[[不思議マーク付け]]の世界や多くの [[WWWブラウザ]]の実装では、
[CODE(HTMLe)[[[html]]]] タグの前後や [CODE(HTMLe)[head]] 要素と
[CODE(HTMLe)[body]] 要素の間を含めて、あらゆる場所に出現できるようです。

[CITE[ダイナミックHTML入門]]
(Bruce Campbell + Rick Darnell 著, 安藤慶一訳) という入門書では、
[Q[スクリプトの場所に関しては標準規格は必要ないようです]<urn:isbn:4-89471-048-X>]
などと電波を飛ばしているそうです。
[SRC[[CITE[いくつかの書籍のあらさがし]] <http://openlab.ring.gr.jp/k16/htmllint/findfault.html#dynamic-html>]]

** 他との関係

[3] [[ASP]] などの鯖側で HTML 文書 (もどき) を前処理する類のシステムの一部では、
[CODE(HTMLe)[script]] 要素 (のようなもの) を拡張して、
[CODE[[[runat]]]] 属性などを付与して鯖側で実行するものと [CODE(HTMLe)[script]]
要素としてクライアントに送信するものを区別していることがあります。

(そのような実現方法は開発者がスクリプトの実行を正しく把握しづらくなるのではないかとの懸念はあります。
その点、 [[NES]] のように [CODE[[[server]]]] 要素型という別の要素型を用意するのは一つの考えではありますが、
どんぐりのせいくらべといったところでしょう。)

[13] スクリプトによって HTML 文書を動的に扱う方法として、 [[JavaScript]]
の [CODE(js)[[[document]].[[write]]]] がよく使われました。
([CODE(js)[document.write]] は後に [[DOM 1]] で [CODE(DOMi)[[[HTMLDocument]]]]
界面の [CODE(DOMm)[[[write]]]] method として標準化されています。)

HTML 4 仕様書は読み込み時のスクリプトによる文書に書き換えについても規定していますが、
その内容は [CODE(js)[document.write]] (と同様なもの) 
を想定しているようです。実際に使われていたのも [CODE(js)[document.write]]
(と同様なもの) だけでしょう。というわけで、 [CODE(DOMm)[[[write]]]]
method の説明もご覧ください。

[39] スクリプトに対応していなかったり、実行しないことにしていたりするときの[[代替内容]]を提供する
[CODE(HTMLe)[[[noscript]]]] が用意されています。アクセス可能性の確保のために、
重要な情報を提供する [CODE(HTMLe)[script]] は、
対応する [CODE(HTMLe)[noscript]] 要素を用意しておくことが極めて望ましいと考えられます。

[45]
[[XML事象]]の仕様書には[[事象取扱器]]として
[CODE(HTMLe)@en[[[script]]]] を使う例があり、
[[Opera]] 9 でも [CODE(HTMLe)@en[[[script]]]]
を[[事象取扱器]]にできるように実装されています。

が、 [[XML事象]]の[[属性]]がある
[CODE(HTMLe)@en[[[script]]]] [[要素]]も、
[[文書]]読込み時には[[属性]]がないときと同じように実行されてしまうので、
あまり使いやすくありません。

** XHTML2

[73] [[XHTML2]] 第6次案までは [CODE(HTMLe)@en[[[script]]]] [[要素]]がありましたが、
第7次案で [CODE(HTMLe)@en[[[handler]]]] に改名されました。



[FIG(data)[ [113] [[HTML要素概説]]

:[F[要素名]]:[CODE[script]]
:日付:[TIME[2009]]
:説明:
[TIME[2009]]、
[CITE[XHTML 2.0]]
で
[CITE[XML Events 2]]
の
[CODE[script]]
が[[HTML名前空間]]で使えるとされた。
[SEE[>>594]]
[SRC[SW:XHTML2]]
:注釈:
-
[594] 
[CITE[XHTML 2.0]]
はその前段階で
[CODE[script]]
を
[CODE[handler]]
に改称していた。それが
[CITE[XML Events 2]]
が新たに規定した
[CODE[script]]
を参照する形に置き換えられた。
結局、仕様書が複雑になっただけだった。

]FIG]




** メモ

[44]
[CITE[XHTML Frequently Answered Questions]] <http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite>

[[HTML 4]] は [[SGML]] [[応用]]なのに
[CODE(JS)@en[[[document]].[[write]]]]
が使えて、
[[XHTML 1]] は [[XML]] [[応用]]だから
[CODE(JS)@en[[[document]].[[write]]]]
が使えないというのはよくわからない。
([[名無しさん]] [WEAK[2006-08-05 06:53:16 +00:00]])

[46]
[CITE[404 Blog Not Found:javascript - scriptタグによる通信が特許侵害!?]] <http://blog.livedoor.jp/dankogai/archives/50677817.html>
([[名無しさん]] [WEAK[2006-11-04 02:20:29 +00:00]])

** script 要素 (ASP)

,HTML (>>9) に加えて、	,==	,==	,==
,runat	,server	,なし	,動作場所 >>5

[5] [CODE[runat]] は、 [[M$]] の [[ASP]] で使われて、値が [CODE["server"]]
である場合に、その要素のスクリプトはサーバーで処理されます。
(クライアントには送られません。) この属性は [[W3C]]
の規格では規定されていません。サーバーで処理される以外で使ってはいけません。

- [6] >>2-3,>>5 [CODE[language]] 属性や [CODE[type]] 属性を省略しても [CODE[<%@ Page Language="VB" %>]] みたいのが書いてあれば、それ以降の部分で解釈されるサーバー側スクリプトはその言語で解釈されるそうです。
- [7] >>5-6 それから、 [CODE[runat]] 属性はどんな要素にも? 使えて、サーバー側スクリプトからアクセス可能なことを表す?らしいです。全くもって理解不能な世界ですが。。。
- [8] >>2 ASP での既定値は (設定ファイルで変更しない限り) [CODE[VB]] (= [[VBScript]]) だそうです。

** script 要素型 (CSP)

- [10] CSP の script 要素では runat="server"/"compiler" の属性があります。 ''Introduction to Cache Server Pages - The CSP Compiler'' <http://www.cacheinfo.com/document/V401/cpi/cpitagbased.html>
- [11] このほか CSP の script 要素には色んな独自拡張属性 (もしかして自由に作れる?) があります。 ''技術サポート'' <http://www.cacheinfo.com/techinfo.htm>

** msxsl:script 要素 (M$XML の XSLT 実装)

[21] [CODE(XML)[{urn:schemas-microsoft-com:xslt}:script]]
要素を使うと、 [[XSLT]] (の [[XPath]] を使う文脈)
で利用者定義の関数を使用することが可能となります。

親要素は xslt:[[stylesheet]] 要素又は xslt:[[transform]]
要素です。内容は #[[PCDATA]] です (たぶん)。

,implements-prefix	,名前空間接頭辞	,必須	,関数の名前空間
,language	,html:[[language]] と同じ	,不明	,スクリプト言語

[[language]] 属性には [CODE(HTML)[html:script]] 
要素の場合と同じ値を指定できるそうです。
[CODE(XML)[implements-prefix]] 属性には、 XSLT
側で関数を呼ぶ際の [[XML名前空間]]接頭辞を与えます。
この値は自分以上の要素の [[xmlns]] 
属性を使って宣言されていなければならないはずです。

[22] 言葉で説明するより実例を見たほうが分かりやすいでしょう。

[PRE[
  <xslt:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt"
        xmlns:foo="http://foo.example/">
    <msxsl:script language="JScript" implements-prefix="foo">
      function bar (baz) {
        return baz;
      }
    </msxsl:script>
    <xslt:template select="element1">
      <xslt:apply-templates select="foo:bar(element2)"/>
    </xslt:template>
  </xslt:stylesheet>
]PRE]

この場合は関数 [CODE(XPath)[foo:bar(baz)]] は引数 [CODE(JS)[baz]]
をただ返すだけの何の面白味もないものですが、
雰囲気はつかめるでしょう。

- ''XSLT Elements'' <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/htm/xsl_elm_qz_4s50.asp>
[[#comment]]
- ''XSLT 1.0で正規表現を使う(MSXML限定)'' <http://members.jcom.home.ne.jp/jintrick/Personal/d20031l.html#d22_4>

** xalan:script 要素 (Xalan-Java XSLT 実装)

[23] [[Xalan]] では [[XSLT]] [[スタイル・シート]]で
[[JavaScript]] などを使うのに [CODE(XML)[xalan:script]]
要素を使います。

親要素は xalan:[[component]] 要素です。

,lang	,CDATA	,必須	,スクリプト言語
,src	,[[URI]]	,(指定なし)	,外部スクリプト参照

[[HTML]] や MSXML での書き方と互換性はありません。

- ''Xalan-Java Extensions'' <http://xml.apache.org/xalan-j/extensions.html>

** void 要素化された [CODE(HTMLe)@en[script]] 要素の実装

[69] [[Presto]] と [[WebKit]] は [CODE(HTMLe)@en[[[script]]]] [[開始タグ]]で[[認められている斜線]]を認識し、
[[void要素]]と同じような挙動をします。この挙動は既存の [[Widget]] ([[Opera Widget]]、[[Dashboard]])
との互換性のために必要です。

[70] [[Ian Hickson]] は、特定の非 [[Web]] 環境で必要という理由だけで [[HTML5]]
仕様を変更するつもりはないと >>68 で述べています。 (かなり前にもこの問題が取り上げられたときに同じことを言っていた気がします。)

[REFS[
- [68] [CITE[Bug 6357 – <script> start tag parsing]] ([TIME[2009-01-06 14:41:59 +09:00]] 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=6357>
]REFS]

** HTML5

[323] [[HTML5]] では、初めて[[スクリプト]]の処理モデルが規定されました。

[324] [[データブロック]]としての利用法も [[HTML5]] で追加されました。


[FIG(data)[ [593] [[HTML要素概説]]

:[F[要素名]]:[CODE[script]]
:日付:[TIME[2005-12]]
:説明:
[TIME[2005-12]]の [[Google検索]]のデータベースを使った調査によると、
[[要素]]の利用数第13位が
[CODE[script]]
だった。
:出典:
[REFS[

-
[CITE[Google Code: Web Authoring Statistics: Pages and elements]], 
[DATA(.author)[[[Ian Hickson]]]],
[TIME(.published)[2006]],
[TIME[2024-08-24T07:08:22.000Z]], [TIME[2006-02-03T03:49:06.745Z]] <https://web.archive.org/web/20060203033128/http://code.google.com/webstats/2005-12/pages.html>

]REFS]

]FIG]



[49]
[CITE[Bug 178258 &#8211; document.forms has no properties on a page without <body> (JavaScript error)]] ([CODE[2007-01-29 17:04:28 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=178258>

[79]
図にしましたwwww [[script要素の内容の制約の図]]

[51]
[CITE@en[HTML5 script start tag should select appropriate content model according  to src]] ([[David Woolley]] 著, [CODE[2007-04-21 22:52:46 +09:00]] 版) <http://lists.w3.org/Archives/Public/www-html/2007Apr/0053.html>
([[名無しさん]] [WEAK[2007-04-28 03:58:40 +00:00]])

[52]
[CITE[HTML5 IRC logs: w3c / #html-wg / 20070423]] ([CODE[2007-06-30 15:38:51 +09:00]] 版) <http://krijnhoetmer.nl/irc-logs/html-wg/20070423#l-144>

> [03:47] <mjs> Lachy: since you were discussing Safari's handling of <script /> earlier, we might make that a Dashboard-only quirk - we foolishly did it for Firefox compatibility, and then a huge number of Dashboard widgets started relying on it, and now Firefox no longer handles it as empty in HTML  

([[名無しさん]])

[53]
[CITE@en[http charset, <script> and IE]] ([[tex]] 著, [CODE[2007-07-30 06:33:36 +09:00]] 版) <http://lists.w3.org/Archives/Public/www-international/2007JulSep/0040.html>
([[名無しさん]])

[54]
[CITE[“消えた初音ミク”問題 ヤフーとGoogle「原因を調査中」 - ITmedia News]] ([CODE[2007-10-18 22:03:18 +09:00]] 版) <http://www.itmedia.co.jp/news/articles/0710/18/news065.html>

>
[PRE(HTML example code)[
<script language="JavaScript" type="text/javascript">
<!--
var pid="784200073";
var locs="ITOT1";
var random=new Date();
var js_url='http://dlv.itmedia.co.jp/adsv/v1?posall='+locs+'&id='+pid+'&rnd='+random.getTime();
document.write('<sc'+'ript language="JavaScript" type="text/javascript" src="'+js_url+'">');
document.write('</sc'+'ript>');
//-->
</script>
]PRE]

[55]
[CITE@en[Re: <script> for non-script content]] ([[Ian Hickson]] 著, [CODE[2008-05-14 16:53:44 +09:00]] 版) <http://lists.w3.org/Archives/Public/public-html/2008May/0291.html>
([[名無しさん]])

[56]
[CITE@ja[冬様もすなる☆日記というもの (2008年7月)]] ([[わかば]] 著, [CODE[2008-07-21 17:28:49 +09:00]] 版) <https://suika.suikawiki.org/~wakaba/d/d200807#d21-1>
([[名無しさん]])

[57]
[CITE@ja[Kanasan.JS JavaScript 第 5 版読書会 #5: Days on the Moon]] ([CODE[2008-07-26 22:46:16 +09:00]] 版) <http://nanto.asablo.jp/blog/2008/07/25/3648120>
([[名無しさん]])

[58]
[CITE@en[OpenSocial Data Pipelining - OpenSocial Specifications]] ([CODE[2008-09-04 06:00:40 +09:00]] 版) <http://wiki.opensocial-templates.org/index.php?title=OpenSocial_Data_Pipelining>
([[名無しさん]])

[60]
[CITE[High Performance Web Sites :: “Delayed Script Execution” in Opera]] ([CODE[2008-09-17 13:31:22 +09:00]] 版) <http://www.stevesouders.com/blog/2008/09/11/delayed-script-execution-in-opera/>

[62] [CITE[John Resig - JavaScript Micro-Templating]] ([TIME[2008-12-13 10:11:52 +09:00]] 版) <http://ejohn.org/blog/javascript-micro-templating/>

[63] 
[CODE(HTMLa)@en[[[defer]]]]、[CODE(HTMLa)@en[[[async]]]] なしの場合で、
[CODE(HTMLa)@en[[[src]]]] ありの場合に、外部[[スクリプト]]が実行されるまで[[構文解析]]は停止するか?

[CITE[Index of /~wakaba/-temp/test/html/script/src]] ([TIME[2008-12-16 11:37:00 +09:00]] 版) <http://suika.fam.cx/~wakaba/-temp/test/html/script/src/>

[64] [[HTML]] として記述された [CODE(HTMLe)@en[[[script]]]] [[要素]]の場合 (nodefer-1)、
どのブラウザも[[構文解析]]が停止します。

[65] [[DOM]] によって作成された [CODE(HTMLe)@en[[[script]]]] [[要素]]の場合 (nodefer-script-1)、
[[Opera]] 以外は[[構文解析]]を続行し、外部[[スクリプト]]は準備が出来次第実行します
([[HTML5]] に従った動作)。 [[Opera]] 9.61 は >>64 同様、[[構文解析]]を停止します。

[59]
[[OSML]] で[[鯖]]側で処理される [[HTML]] 片の [CODE(HTMLe)@en[[[script]]]]
[[要素]]
([CODE(HTML)@en[[[type]]="[[text/os-data]]"]] や
[CODE(HTML)@en[[[type]]="[[text/os-template]}"]] には、]]
[CODE(HTMLa)@en[[[beforeData]]]]
や [CODE(HTMLa)@en[[[requireData]]]] のような[[属性]]を更に指定できます。
([[名無しさん]])

[61]
[CITE[Bug 304786 &#8211; dynamically inserting/adding xul:script via DOM doesn't work]] ([TIME[2008-10-09 11:53:54 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=304786>


[66] [CITE['''['''JavaScript''']''' とてもシンプルに自分自身が属する script 要素を取得 - IT戦記]] ([TIME[2008-12-27 15:22:12 +09:00]] 版) <http://d.hatena.ne.jp/amachang/20061201/1164986067>

[67] [CITE[Scripting – SVG Tiny 1.2]] ([TIME[2008-12-20 02:31:29 +09:00]] 版) <http://www.w3.org/TR/2008/REC-SVGTiny12-20081222/script.html#ScriptElement>

[71] [CITE[Index of /script-execution]] ([TIME[2009-02-03 10:44:50 +09:00]] 版) <http://testsuites.opera.com/script-execution/>

[72] [CITE[SVGを直接HTMLに埋め込む方法(プラグインを使わない) - dhrnameの開発日誌]] ([TIME[2009-01-31 21:23:50 +09:00]] 版) <http://d.hatena.ne.jp/dhrname/20080105/1199534939>

[74] [CITE@en[Re: '''['''HTML5''']''' DOMContentLoaded fires before CSS resources loaded?]]
([[Ian Hickson]] 著, [TIME[2009-08-02 19:04:59 +09:00]] 版)
<http://lists.w3.org/Archives/Public/public-html/2009Aug/0064.html>

[75] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-10-11 19:13:48 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4102&to=4103>

[76] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-10-20 21:51:45 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4177&to=4178>

[77] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-10-20 21:53:34 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4178&to=4179>

[78] [CITE[IRC logs: freenode / #whatwg / 20091026]]
([TIME[2009-12-14 01:01:55 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20091026#l-421>

[80] [CITE[Forum Nokia - Driving innovation for mobile application developers]]
([TIME[2010-01-23 15:04:02 +09:00]] 版)
<http://www.forum.nokia.com/>

[81] [CITE@en[HTML5 Revision Tracker]]
([TIME[2010-07-14 22:43:50 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=5156&to=5157>

[82] [CITE['''['''whatwg''']''' The choice of script global object to use when the script element is moved]]
([TIME[2010-09-09 06:50:19 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-September/028457.html>

[83] [CITE@en[Web Applications 1.0 r5449 Make the 'already started' flag actually work. Also, reorder things in the 'run' algorithm so that we check things in order of cost to check, instead of doing the work up front and then the checks afterwards.Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10240]]
( ([TIME[2010-09-09 07:17:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5448&to=5449>

[84] [CITE@en[Web Applications 1.0 r5496     Allow parser-inserted scripts to rerun if they failed to be run by the parser.Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10519]]
( ([TIME[2010-09-26 04:26:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5495&to=5496>

[85] [CITE@en[Web Applications 1.0 r5499     Make policy checks for <script> happen after the flag is set that prevents the script from being run again, so that if somehow an attacker causes a document to be reinserted somewhere that has scripts enabled, the scripts still won't run.Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10523]]
( ([TIME[2010-09-26 04:59:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5498&to=5499>

[86] [CITE@en[Web Applications 1.0 r5545     Match Gecko for character encoding processing for <script>Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10656]]
( ([TIME[2010-09-29 10:04:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5544&to=5545>

[87] [CITE@en[Web Applications 1.0 r5597 add a note about script executionFixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10539]]
( ([TIME[2010-10-12 07:02:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5596&to=5597>

[88] [CITE@en[Web Applications 1.0 r5663     Make style sheets block scripts even in descendant documentsFixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10575]]
( ([TIME[2010-11-02 08:30:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5662&to=5663>

[89] [CITE@en-us[Using Inline XAML]]
( ([TIME[2011-01-04 20:58:07 +09:00]] 版))
<http://msdn.microsoft.com/en-us/library/cc189016%28v=vs.95%29.aspx>

[90] [CITE@en[Data Binding - Ample SDK]]
( ([TIME[2011-01-04 20:58:05 +09:00]] 版))
<http://www.amplesdk.com/examples/core/aml/databinding/>

[91] [CITE[''''''[''''''whatwg'''''']'''''' Re: rel="script"]]
( ([TIME[2011-01-19 23:51:17 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2005-July/004503.html>

[92] [CITE[''''''[''''''whatwg'''''']'''''' The choice of script global object to use when the script element is moved]]
( ([TIME[2011-02-02 22:51:39 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-February/030170.html>

[93] [CITE@en[Web Applications 1.0 r5817      Make script-inserted external scripts that have .async=false execute in the insertion order, default to true]]
( ([TIME[2011-02-03 14:34:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5816&to=5817>

[94] [CITE@en-GB-x-Hixie[Hixie's Natural Log: Script execution order post-mortem]]
( ([TIME[2011-02-08 23:07:35 +09:00]] 版))
<http://ln.hixie.ch/?start=1296711456&count=1>

[95] [CITE@en[Web Applications 1.0 r5883     Make a parser-inserted script not run if it is moved to another document before it executes (and not even fetch if it is parsed into another document than its parser's document).]]
( ([TIME[2011-02-15 05:47:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5882&to=5883>

[96] [CITE@en[Web Applications 1.0 r5891  Continue the conformance chain for inline <script> elements. Somehow I'd missed that case.]]
( ([TIME[2011-02-15 09:56:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5890&to=5891>

[97] [CITE@en[Web Applications 1.0 r5905     Make sure that all synchronous sections run before <script> elements, so that a <script> following a <video> has a state that doesn't depend on whether the browser splits up its parser tasks.]]
( ([TIME[2011-02-19 07:36:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5904&to=5905>

[98] [CITE[IRC logs: freenode / #whatwg / 20110203]]
( ([TIME[2011-03-19 11:46:31 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20110203>

[99] [CITE@en[Web Applications 1.0 r6049 Try to warn implementors about XSLT.]]
( ([TIME[2011-05-03 10:10:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6048&to=6049>

[100] [CITE[''''''[''''''whatwg'''''']'''''' Proposal for separating script downloads and execution]]
( ([TIME[2011-05-25 00:33:14 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-May/031768.html>

[101] [CITE[IRC logs: freenode / #whatwg / 20110529]]
( ([TIME[2011-06-01 23:07:01 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20110529>

[102] [CITE['''['''whatwg''']''' Should script run if it comes from a HTML fragment?]]
([TIME[2011-06-07 09:15:22 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-June/031941.html>

[103] [CITE@en[Voice Browser Call Control: CCXML Version 1.0]]
( ([TIME[2011-06-28 19:48:47 +09:00]] 版))
<http://www.w3.org/TR/2011/REC-ccxml-20110705/#Script>

[104] [CITE[''''''[''''''whatwg'''''']'''''' Feedback regarding script execution]]
( ([TIME[2011-09-08 08:47:56 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-September/033132.html>

[105] [CITE@en[Web Applications 1.0 r4103     Define how <script> gets blocked while <style>@import</style>, and a general rewrite of how <script>s are executed and interact with the parsers.]] ([TIME[2009-10-11 17:02:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=4102&to=4103>

[106] [[IE7]] も [[IE8]] も、[[文書中]]にない[[要素]]に [CODE(HTMLe)@en[[[script]]]]
を [CODE(DOMm)@en[[[appendChild]]]] しただけで実行してしまいます。
これはひどい・・・・。

[REFS[
- [CITE[appendChild (<script>)]] ([TIME[2011-09-27 23:28:57 +09:00]] 版) <http://suika.fam.cx/~wakaba/-temp/test/dom/node/child-methods/appendchild-script-2.html>
]REFS]


[107] [CITE[''''''[''''''whatwg'''''']'''''' <script> features]]
( ([TIME[2012-02-04 15:39:11 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-February/034629.html>

[108] [CITE[IRC logs: freenode / #whatwg / 20120206]]
( ([TIME[2012-02-09 21:33:22 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120206>

[109] [CITE[IRC logs: freenode / #whatwg / 20120427]]
( ([TIME[2012-05-06 12:41:01 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120427#l-514>

[110] [CITE[''''''[''''''whatwg'''''']'''''' script-related feedback]]
( ([TIME[2012-05-08 08:28:29 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-May/035713.html>

[111] [CITE[IRC logs: freenode / #whatwg / 20120620]]
( ([TIME[2012-07-04 21:39:52 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120620#l-620>

[112] [CITE[IRC logs: freenode / #whatwg / 20120621]]
( ([TIME[2012-07-05 20:53:47 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120621>

[113] [CITE@en[Web Applications 1.0 r7239     Make <script/> in SVG in text/html execute.]]
( ([TIME[2012-08-10 08:40:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7238&to=7239>

[114] [CITE[XMLのWebAPIを爆速で使いこなせるフレームワーク - Yahoo! JAPAN Tech Blog]]
( ([TIME[2012-09-11 11:17:08 +09:00]] 版))
<http://techblog.yahoo.co.jp/programming/bakusoku-yql/>

[115] [CITE@en[Web Applications 1.0 r7420       Make the parser match the implementations (and not be more even more crazy than necessary).]]
( ([TIME[2012-09-28 09:03:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7419&to=7420>

[116] [CITE[''''''[''''''whatwg'''''']'''''' Proposal: Loading and executing script as quickly as possible using multipart/mixed]]
( ([TIME[2012-12-04 00:39:17 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-December/038223.html>

[117] [CITE[''''''[''''''whatwg'''''']'''''' Script-related feedback]]
( ([TIME[2012-12-19 22:27:47 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-December/038429.html>

[118] [CITE@en-US[XBL 2.0]]
( ([TIME[2012-05-03 02:23:03 +09:00]] 版))
<http://dev.w3.org/2006/xbl2/Overview.html#script-blocks>

[119] [CITE@en[Web Applications 1.0 r8022  Make <script> be accepted in most places <template> is now accepted, e.g. inside <table>s. Doesn't affect parsing.]]
( ([TIME[2013-07-04 03:26:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8021&to=8022>

[120] [CITE[''''''[''''''whatwg'''''']'''''' Script preloading]]
( ([TIME[2013-07-10 05:41:59 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-July/039960.html>

[121] [CITE[IRC logs: freenode / #whatwg / 20130709]]
( ([TIME[2013-07-11 08:15:25 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130709>

[122] [CITE@en[Web Applications 1.0 r8124 Rejigger how scripts are described. Work in progress.]]
( ([TIME[2013-08-03 06:48:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8123&to=8124>

[123] [CITE@en[Web Applications 1.0 r2529        MAJOR CHANGES: Revamp the way scripts are specified, along with their interaction with resolving relative URLs, etc. Give enough detail to justify objects in the DOM not being garbage collected randomly when still in use. Define script groups, to handle scripts going away during document.open() and session history navigation. Define why and how setTimeout(), database transactions, etc, handle page transitions. Drop the terms 'with' and 'without' script, use script is 'enabled'/'disabled' instead. Define 'unload' and 'beforeunload'. Rework how onfoo='' and .onfoo event handler attributes are defined. Rework how the content model of <noscript> is defined. Reword the way javascript: is defined to use the new terminology. Add a few notes of things that came up while I was doing all that.]]
( ([TIME[2008-12-12 17:46:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=2528&to=2529>

[124] [CITE[IRC logs: freenode / #whatwg / 20130817]]
( ([TIME[2013-08-18 18:51:22 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130817>

[125] [CITE@en[Web Applications 1.0 r8247     The bulk of this is editorial: refactoring how scripts are defined so that all the common stuff is in a shared 'settings object' rather than being duplicated per script. But this also cleans up how postMessage() interacts with the event loop and a few other things I've since forgotten.]]
( ([TIME[2013-10-31 08:18:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8246&to=8247>

[126] [CITE[テンプレートエンジンでJavaScriptを動的生成する際のアンチパターン - 金利0無利息キャッシング – キャッシングできます - subtech]]
( ([TIME[2013-11-08 09:39:38 +09:00]] 版))
<http://subtech.g.hatena.ne.jp/mala/20131108/1383887454>

[127] [CITE@en[Web Applications 1.0 r8299  Remove the parts of the script content model that could lead to unbalanced crazy]]
( ([TIME[2013-11-20 06:35:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8298&to=8299>

[128] [CITE@en[Web Applications 1.0 r8313  Another attempt at redefining <script> content rules to make zcorpan happy]]
( ([TIME[2013-11-26 03:38:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8312&to=8313>

[129] [CITE@en[Web Applications 1.0 r8313  Another attempt at redefining <script> content rules to make zcorpan happy]]
( ([TIME[2013-11-26 03:38:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8312&to=8313>

[158] [CITE@en-US[XML Binding Language (XBL) 2.0]]
( ([TIME[2007-03-16 22:20:16 +09:00]] 版))
<http://www.w3.org/TR/2007/CR-xbl-20070316/#the-script>

[159] [CITE[Issue 329531 - chromium - Speculative parser fetches <script src> with unsupported type="" - An open-source project to help move the web forward. - Google Project Hosting]]
( ([TIME[2014-01-08 20:48:14 +09:00]] 版))
<https://code.google.com/p/chromium/issues/detail?id=329531>

[160] [CITE[SVG2 Requirements Input - SVG]]
( ([TIME[2013-06-13 12:01:58 +09:00]] 版))
<http://www.w3.org/Graphics/SVG/WG/wiki/SVG2_Requirements_Input#Consider_allowing_async.2Fdefer_on_.3Csvg%3Ascript.3E>

[161] [CITE@en-US[XML Binding Language (XBL) 2.0]]
( ([TIME[2007-03-16 22:20:16 +09:00]] 版))
<http://www.w3.org/TR/2007/CR-xbl-20070316/#loading0>

[162] [CITE[IRC logs: freenode / #whatwg / 20140604]]
( ([TIME[2014-06-05 17:35:50 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140604>

[163] [CITE[The "initialization" steps for Web browsers]]
( ([TIME[2014-06-10 22:00:51 +09:00]] 版))
<https://mail.mozilla.org/pipermail/es-discuss/2014-June/037544.html>

[175] [CITE[IRC logs: freenode / #whatwg / 20140721]]
( ([TIME[2014-07-22 11:22:12 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140721>

[176] [CITE[XML Events 2]]
( ([TIME[2010-12-18 05:25:20 +09:00]] 版))
<http://www.w3.org/TR/xml-events2/#s_script_module>

[FIG(quote)[
[FIGCAPTION[
[177] [CITE[Java SE 7 Supported Locales]]
([TIME[2015-04-25 17:31:30 +09:00]] 版)
<http://www.oracle.com/technetwork/java/javase/javase7locales-334809.html>
]FIGCAPTION]

>   <script id="ssInfo" type="text/xml" warning="DO NOT MODIFY!">
>   <ssinfo >
>     <fragmentinstance  id="fragment14" fragmentid="Universal_Localization_Fragment" library="server:UNIVERSAL_LOCALIZATION_FRAG">
>     </fragmentinstance>
> [INS[...]]
>       <fragmentinstance  id="fragment44" fragmentid="ocom-commonassets" library="server:OCOM-FRAGMENT-LIBRARAY">
>         
>       </fragmentinstance>
>   </ssinfo>
>   </script>
> 

]FIG]


[178] [CITE@en[Add async/defer script loading diagram · whatwg/html@940b7f7]]
([TIME[2015-09-24 20:06:42 +09:00]] 版)
<https://github.com/whatwg/html/commit/940b7f70d002e01685f913e2fc9350c5208e5927>

[FIG(quote)[
[FIGCAPTION[
[179] [CITE[RDF in HTML: Approaches]]
([TIME[2004-03-25 08:00:00 +09:00]] 版)
<http://infomesh.net/2002/rdfinhtml/>
]FIGCAPTION]

> On the other hand, we have the script element with which to wrap some embedded XML RDF. 

]FIG]

[279] [[HTML Standard]] と [[Firefox]] は、[[構文解析器]]が作成した
[CODE(HTMLe)@en[[[script]]]] の[[節点文書]]が他の[[文書]]となっている場合、
[[スクリプト]]を実行しません。 [TIME[2016-02-22T07:52:18.800Z]]

[280] [[IE9]] と [[IE11]] は、[[構文解析器]]が作成した
[CODE(HTMLe)@en[[[script]]]] が他の[[文書]]に [[adopt]]
されたら、以後[[スクリプト]]を実行しません。 [TIME[2016-02-22T07:52:53.200Z]]

[281] [[Chrome]] は、他の[[文書]]に [[adopt]] されても気にせずに[[スクリプト]]を実行します。
[TIME[2016-02-22T07:54:08.00Z]]

;; [278] テストデータ:
[REFS[
- [277] [CITE[tests-web/html/script/mutations]] ([TIME[2016-02-22 16:51:13 +09:00]] 版) <https://webtests.herokuapp.com/html/script/mutations/>
]REFS]

** 2016年改訂

[325] 2015年末から2016年にかけた [[HTML Standard]] の一連の改訂では、
[[JavaScript]] 以外の[[スクリプト言語]]に関する規定が削除されると共に、
新たに[[モジュールスクリプト]]が導入されました。
その他細部の明確化が行われています。

[180] [CITE@en[Call out to CSP's inline element hooks · whatwg/html@ee3486e]]
([TIME[2015-11-08 16:31:28 +09:00]] 版)
<https://github.com/whatwg/html/commit/ee3486eb129bc350b5ca684d0c91dff23453ac1a>

[181] [CITE@en[Report 'inline' when inline violations occur. · w3c/webappsec-csp@eeb5227]]
([TIME[2015-12-01 11:47:26 +09:00]] 版)
<https://github.com/w3c/webappsec-csp/commit/eeb5227a76dab059002778e95575aed16ca4c2c4>

[182] [CITE@en[Close #384: add CSP hooks to handle inline events and style · whatwg/html@920c918]]
([TIME[2015-12-15 20:08:16 +09:00]] 版)
<https://github.com/whatwg/html/commit/920c9183a7990968ecac1aeedae22391f3438791>

[184] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-22 18:43:28 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>

[185] [CITE@en[Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb]]
([TIME[2016-01-21 22:15:37 +09:00]] 版)
<https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>

[217] [CITE@en[Make script fetching more correct with regard to request destinations · whatwg/html@6dc9c9e]]
([TIME[2016-02-29 17:55:31 +09:00]] 版)
<https://github.com/whatwg/html/commit/6dc9c9e1efcc3122294fb015e4a4eea66456a611>

[513] [CITE@en[Mitigate dangling markup attacks on nonces. · w3c/webappsec-csp@2c92a09]]
([TIME[2016-03-01 11:46:21 +09:00]] 版)
<https://github.com/w3c/webappsec-csp/commit/2c92a09beeede27e45f2acef4041aa0a1770fa99>

[514] [CITE@en[23509 – Media-specific scripts (<script media="">?)]]
([TIME[2016-03-17 16:52:24 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=23509>

[515] [CITE@en[Allow currentScript to return SVGScriptElement · whatwg/html@6762f87]]
([TIME[2016-03-24 15:28:31 +09:00]] 版)
<https://github.com/whatwg/html/commit/6762f878f3080d5c188c3d8a0fcf6ee9ad8b2df4>

[518] [CITE@en[Pass cryptographic nonce metadata to Fetch · whatwg/html@5479e07]]
([TIME[2016-04-07 16:01:12 +09:00]] 版)
<https://github.com/whatwg/html/commit/5479e07a6f6e01062b85b5fe6799752b0370336c>

[312] [CITE@en[Don't update document.currentScript for module scripts · whatwg/html@6918282]]
([TIME[2016-04-16 15:00:03 +09:00]] 版)
<https://github.com/whatwg/html/commit/69182823e3dae507380fa9a70d26fe7b51ae62ac>

[521] [CITE@en[Pass parser metadata to Fetch · whatwg/html@e6500b9]]
([TIME[2016-04-16 22:25:20 +09:00]] 版)
<https://github.com/whatwg/html/commit/e6500b90244376c023e7b78642dbc7b86829233f>

[524] [CITE@en[Remove beforescriptexecute/afterscriptexecute events · whatwg/html@1a0b5e8]]
([TIME[2016-04-24 11:24:19 +09:00]] 版)
<https://github.com/whatwg/html/commit/1a0b5e8377d59462e05a5cffda4b8592324a2785>

[314] [CITE@en[Execute <script> in shadow trees · whatwg/html@caf203f]]
([TIME[2016-04-27 17:44:09 +09:00]] 版)
<https://github.com/whatwg/html/commit/caf203fd4d9a5047d1ff2edad2290d53e21368ba>

[394] [CITE@en[currentScript needs to point to removed script elements]]
( ([[annevk]]著, [TIME[2016-05-02 22:07:51 +09:00]]))
<https://github.com/whatwg/html/commit/3dc763829ca1598427b588cf08830c1e2af5a05c>

[FIG(quote)[
[FIGCAPTION[
[405] ( ([TIME[2016-04-22 11:47:31 +09:00]]))
<http://www.marsflag.com/>
]FIGCAPTION]

> 
> <script type="text/javascript" src="/js/ext/sug.js#sv=http://s.marsfinder.jp/mf__ja__ja"></script>
> <script type="text/javascript" src="/js/ext/muv.js#sv=http://s.marsfinder.jp/mf__ja__ja"></script>
> <script src="/js/ext/tr.js#sv=http://s.marsfinder.jp/mf__ja__ja&hint=2RSeBTMNkEJRiac4rL6RFEbZcnex7Y7-zCgBR02DiWE." type="text/javascript" charset="UTF-8"></script>

]FIG]


[FIG(quote)[
[FIGCAPTION[
[525] ( ([TIME[2016-05-06 10:04:32 +09:00]]))
<http://www.mitsubishielectric.co.jp/fa/>
]FIGCAPTION]

> 
> <script src="http://search.mitsubishielectric.co.jp/mar/site/js/suggest_ext.js#unitid=fa_all" type="text/javascript" charset="UTF-8"></script>
> 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[526] ( ([TIME[2016-05-07 13:38:53 +09:00]]))
<http://www2.panasonic.biz/es/ai/products/search/detail?dep=&c=search&item_no=WK2103&item_cd=WK2103&bh_cd=3&b_cd=301&style=WK2103>
]FIGCAPTION]

> 
> <script src="http://panasonic.co.jp/common/mf/js/suggest_ext.js#unitid=ja_all" type="text/javascript" charset="UTF-8"></script>
> 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[527] ( ([TIME[2016-05-02 11:30:03 +09:00]]))
<http://www.kokuyo.co.jp/>
]FIGCAPTION]

> 
> 		<div class="search-box"><script src="http://search.kokuyo.co.jp/site/js/suggest_ext.js#unitid=ja_all" type="text/javascript" charset="UTF-8"></script>
> 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[528] ( ([TIME[2016-05-02 11:30:03 +09:00]]))
<http://www.kokuyo.co.jp/>
]FIGCAPTION]

> 
> 		<div class="search-box"><script src="http://search.kokuyo.co.jp/site/js/suggest_ext.js#unitid=ja_all" type="text/javascript" charset="UTF-8"></script>
> 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[529] [CITE@ja[埋め込み投稿 - ソーシャルプラグイン]]
( ([TIME[2016-05-07 13:54:38 +09:00]]))
<https://developers.facebook.com/docs/plugins/embedded-posts/>
]FIGCAPTION]

> 
>   js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&amp;version=v2.2";

]FIG]


[FIG(quote)[
[FIGCAPTION[
[530] ( ([TIME[2016-05-07 13:55:51 +09:00]]))
<http://dream.jp/>
]FIGCAPTION]

> 
>   js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1&appId=192054277515151";

]FIG]


[FIG(quote)[
[FIGCAPTION[
[531] [CITE@ja[高井たかし(民進党)公式サイト | 維新の党代表選挙一人一票実現に向けて(2015年6月22日〜の週)]]
( ([TIME[2016-05-07 13:57:49 +09:00]]))
<http://www.takaitakashi.com/%e6%b4%bb%e5%8b%95%e5%a0%b1%e5%91%8a/4817>
]FIGCAPTION]

>   js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.4&appId=1422917708013651";
> 

]FIG]


[532] [CITE@en[Clarify script encoding fallback]]
( ([[Resseguie]]著, [TIME[2016-06-15 17:25:44 +09:00]]))
<https://github.com/whatwg/html/commit/ffbf252f5b1c9793fd59de9e64045ddebfabf982>

[533] [CITE@en[Align with vocabulary changes in the DOM Standard]]
([[annevk]]著, [TIME[2016-07-08 02:32:18 +09:00]])
<https://github.com/whatwg/html/commit/5b9c5d5a39c38b08e5a5c9334e14804f063235b2>

[536] [CITE@en[Improve all the script-fetching algorithms]]
([[domenic]]著, [TIME[2016-07-08 01:25:53 +09:00]])
<https://github.com/whatwg/html/commit/b4f40e72fcca8a13eefa8a2dd06258378e76fcb7>

[FIG(quote)[
[FIGCAPTION[
[537] [CITE[DoodlePage Page.11 (jp)]]
([TIME[2015-08-23 02:53:28 +09:00]])
<http://userweb.alles.or.jp/sfujita/jpn/doodle11.htm#2002-0616>
]FIGCAPTION]

> '''['''2002-06-16''']''' 最近目に付く奇妙なHTMLの注釈記述	
> 最
> 近、多くのページで以下のような奇妙な注釈の使い方が目に付きます。
> <!--//--><script>~スクリプト処理行 なんたらかんたら~</script>
> プロバイダに依存せず、全く同一のコードが、全く同じ位置関係で記されている事から、何かのWebページ作成ツールあるいは、ある種のサーバーが出力していると思われますが、それを設計した人は意味を理解せずに作ったんでしょうかねぇ。

]FIG]


[538] [CITE@en[Handle error cases during module script tree fetching/running better]]
([[domenic]]著, [TIME[2016-08-09 12:06:32 +09:00]])
<https://github.com/whatwg/html/commit/e1af86747f591e33fd0f3f21f301dc866868c9d4>

[539] [CITE@en[Mitigate nonce-stealing attacks.]]
([[mikewest]]著, [TIME[2016-09-01 17:16:42 +09:00]])
<https://github.com/w3c/webappsec-csp/commit/fe15bbb0f318b05a90978bd22c9814cb7820bef9>

[540] [CITE@en[Make document.write etc. throw during parsing custom elements]]
([[domenic]]著, [TIME[2016-08-17 15:44:39 +09:00]])
<https://github.com/whatwg/html/commit/00c6fa07bdb9f0d08a28f6c6e1ababca7d08618c>

[541] [CITE@en[Fix some callers of "create a module script"]]
([[domenic]]著, [TIME[2016-09-15 20:07:32 +09:00]])
<https://github.com/whatwg/html/commit/73af7511ab638a4fcb7a1db908ea746ad808344a>

[542] [CITE@en[Fix some callers of "create a module script"]]
([[domenic]]著, [TIME[2016-09-15 20:07:32 +09:00]])
<https://github.com/whatwg/html/commit/73af7511ab638a4fcb7a1db908ea746ad808344a>

[545] [CITE@en[Do not fire load events for inline scripts]]
([[domenic]]著, [TIME[2016-09-23 23:03:14 +09:00]])
<https://github.com/whatwg/html/commit/1bb62172079f4a30d74dcc7d0d1bf049a69daa22>

[549] [CITE@en[Don't queue a redundant task to fire module script load events]]
([[domenic]]著, [TIME[2016-09-29 04:15:48 +09:00]])
<https://github.com/whatwg/html/commit/b047cebdbe978df3ec36d4ee08f4c0f024b69b3f>

[401] [CITE@en['''['''giowt''']''' (3) PARSER: Only run the SVG script execution logic if a <scr…]]
([[Hixie]]著, [TIME[2014-06-13 04:39:31 +09:00]])
<https://github.com/whatwg/html/commit/7ae642f94e0c262d1f816b73f3fa23de8867d595>

[403] [CITE@en[Upstream SRI's 'integrity' attribute]]
([[mikewest]]著, [TIME[2016-11-03 22:33:16 +09:00]])
<https://github.com/whatwg/html/commit/4c5066c171610e0c8300a58baf4f94816044cedc>

[409] [CITE@en[Disallow the integrity attribute for inline scripts]]
([[zcorpan]]著, [TIME[2016-11-03 22:54:48 +09:00]])
<https://github.com/whatwg/html/commit/7a405842a176c30a5d46c3520a1c8827b5483961>

[546] [CITE@en[24892 – Specify speculative parsing and that it fetches bogus scripts. See https://code.google.com/p/chromium/issues/detail?id=329531]]
([TIME[2016-11-29 12:44:38 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=24892>

[552] [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>

[553] [CITE@en[Properly instantiate inline module scripts]]
([[domenic]]著, [TIME[2017-04-29 05:52:23 +09:00]])
<https://github.com/whatwg/html/commit/3a3405a42de289ecb08e915b278064a99794731d>

[555] [CITE@en[Allow not executing scripts inserted by document.write()]]
([[domenic]]著, [TIME[2017-07-14 05:37:38 +09:00]])
<https://github.com/whatwg/html/commit/15b258dc74ffe1ba321b81a1c876f129681a97c2>

[558] [CITE@en[For users on very slow connections, block document.written scripts · Issue #17 · WICG/interventions]]
([TIME[2017-07-15 23:45:08 +09:00]])
<https://github.com/WICG/interventions/issues/17>

[559] [CITE@en[Allow not executing scripts inserted by document.write() by domenic · Pull Request #1400 · whatwg/html]]
([TIME[2017-07-16 00:03:11 +09:00]])
<https://github.com/whatwg/html/pull/1400>

[560] [CITE@en[Intervening against document.write()  |  Web  |  Google Developers]]
([TIME[2017-05-17 04:19:52 +09:00]])
<https://developers.google.com/web/updates/2016/08/removing-document-write>

[561] [CITE@en[Improve <style> and <script> processing and conformance by domenic · Pull Request #3024 · whatwg/html]]
([TIME[2017-09-19 22:46:46 +09:00]])
<https://github.com/whatwg/html/pull/3024>

[562] [CITE@en[Clarify prose around JavaScript MIME types]]
([[annevk]]著, [TIME[2017-09-18 23:25:34 +09:00]])
<https://github.com/whatwg/html/commit/470e168aaddc54e0abcfa302639870c299473c99>

[563] [CITE@en[Editorial: refactor classic and module scripts to be more alike]]
([[domenic]]著, [TIME[2017-09-07 05:40:50 +09:00]])
<https://github.com/whatwg/html/commit/dce999aac4d9deeefa3b338dd2aeb30c17669bc8>

[564] [CITE@en[Editorial: refactor classic and module scripts to be more alike]]
([[domenic]]著, [TIME[2017-09-07 05:40:50 +09:00]])
<https://github.com/whatwg/html/commit/dce999aac4d9deeefa3b338dd2aeb30c17669bc8>

[565] [CITE@en[Editorial: refactor classic and module scripts to be more alike by domenic · Pull Request #2972 · whatwg/html]]
([TIME[2017-09-23 15:18:08 +09:00]])
<https://github.com/whatwg/html/pull/2972>

[566] [CITE@en[Editorial: move base URL from "module script" to "script"]]
([[domenic]]著, [TIME[2017-09-14 20:28:50 +09:00]])
<https://github.com/whatwg/html/commit/5458513792ab00d58e6c91ba48faaa611d034a2e>

[567] [CITE@en[Make integrity="" work on module scripts]]
([[domenic]]著, [TIME[2017-09-14 18:00:24 +09:00]])
<https://github.com/whatwg/html/commit/9275d955dcd604e959cfcc672e0c234b1b8c00db>

[517] [CITE@en[Make integrity="" work on module scripts]]
([[domenic]]著, [TIME[2017-09-14 18:00:24 +09:00]])
<https://github.com/whatwg/html/commit/9275d955dcd604e959cfcc672e0c234b1b8c00db>

[519] [CITE@en[Does integrity="" intentionally not work on module <script>s? · Issue #2382 · whatwg/html]]
([TIME[2017-10-05 14:17:17 +09:00]])
<https://github.com/whatwg/html/issues/2382>

[543] [CITE@en[Require UTF-8]]
([[sideshowbarker]]著, [TIME[2017-10-06 19:09:17 +09:00]])
<https://github.com/whatwg/html/commit/fae77e3c558b9f083dfb9086752863a4789268f5>

[544] [CITE@en[Allow UAs to conditionally block on stylesheet loading]]
([[domfarolino]]著, [TIME[2018-01-12 17:19:01 +09:00]])
<https://github.com/whatwg/html/commit/42dd707cbfc0f5d8f88b04ef270f4fcb121a10ff>

[569] [CITE@en[Editorial: use "child text content" in the <script> processing model]]
([[ankurkaushal]]著, [TIME[2018-01-29 13:53:26 +09:00]])
<https://github.com/whatwg/html/commit/58286f7078b3aceee060ed6d3635ab8749a77238>

[570] [CITE@en[<script> processing model should use child text content, not the text IDL attribute · Issue #3420 · whatwg/html]]
([TIME[2018-01-30 16:38:32 +09:00]])
<https://github.com/whatwg/html/issues/3420>

[571] [CITE@en[#3420: Editorial fix for the <script> processing model. by ankurkaushal · Pull Request #3421 · whatwg/html]]
([TIME[2018-01-30 16:39:08 +09:00]])
<https://github.com/whatwg/html/pull/3421>

[572] [CITE@en[Use "child text content" to check if a <script> is empty]]
([[domenic]]著, [TIME[2018-02-06 02:04:01 +09:00]])
<https://github.com/whatwg/html/commit/1d64c41e811aab5831be474355bd346c9eaf2874>

[328] [CITE@en[<script> processing model with various children · Issue #3419 · whatwg/html]]
([TIME[2018-02-13 15:20:29 +09:00]])
<https://github.com/whatwg/html/issues/3419>

[574] [CITE@en[Use "child text content" to check if a <script> is empty by domenic · Pull Request #3451 · whatwg/html]]
([TIME[2018-02-13 15:20:56 +09:00]])
<https://github.com/whatwg/html/pull/3451>

[575] [CITE@en[Editorial: update usage of the MIME Sniffing Standard]]
([[domenic]]著, [TIME[2018-02-17 03:42:58 +09:00]])
<https://github.com/whatwg/html/commit/fc82f4f8774a2e7e80f6c9477bd881f6c783b186>

[576] [CITE@en[Editorial: update usage of the MIME Sniffing Standard by domenic · Pull Request #3455 · whatwg/html]]
([TIME[2018-02-17 18:45:53 +09:00]])
<https://github.com/whatwg/html/pull/3455>

[577] [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>

[578] [CITE@en[async="" should be allowed on inline module scripts · Issue #3319 · whatwg/html]]
([TIME[2018-02-26 00:10:58 +09:00]])
<https://github.com/whatwg/html/issues/3319>

[579] [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:21 +09:00]])
<https://github.com/whatwg/html/pull/3324>

[580] [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:42 +09:00]])
<https://github.com/whatwg/html/pull/3324>

[582] [CITE@en[Allow <script> inside <hgroup>]]
([[annevk]]著, [TIME[2018-01-23 00:32:01 +09:00]])
<https://github.com/whatwg/html/commit/9bc8dee5ace8a8c01b9a621b4cda3377867065f1>

[583] [CITE@en['''['''acgiowt''']''' (2) Catch up with recent changes that were made while the p…]]
([[Hixie]]著, [TIME[2014-08-02 01:30:15 +09:00]])
<https://github.com/whatwg/html/commit/d2021df727adb22ee6d4c7e7968aa5abbd93a307>

[584] [CITE@en[Allow <script> inside <hgroup> by annevk · Pull Request #3383 · whatwg/html]]
([TIME[2018-05-01 13:35:07 +09:00]])
<https://github.com/whatwg/html/pull/3383>

[585] [CITE@en[Add referrerpolicy attribute support to <script>s]]
([[domfarolino]]著, [TIME[2018-05-31 00:06:49 +09:00]])
<https://github.com/whatwg/html/commit/0d28f8fc3a7c272f6d148f647ead29965a56ab60>

[586] [CITE@en[Why no referrerpolicy="" on <script>? · Issue #96 · w3c/webappsec-referrer-policy]]
([TIME[2018-08-10 23:17:45 +09:00]])
<https://github.com/w3c/webappsec-referrer-policy/issues/96>

[587] [CITE@en[Add referrerpolicy attribute support to <script>s by domfarolino · Pull Request #3678 · whatwg/html]]
([TIME[2018-08-10 23:18:42 +09:00]])
<https://github.com/whatwg/html/pull/3678>

[588] [CITE@en[Return the completion record result from running a script]]
([[mattto]]著, [TIME[2018-08-11 03:18:45 +09:00]])
<https://github.com/whatwg/html/commit/ad3dda51552aeeeea60540c7f1b513fe45b486a5>

[589] [CITE@en[Stop using textContent in normative text]]
([[annevk]]著, [TIME[2019-04-04 17:23:13 +09:00]])
<https://github.com/whatwg/html/commit/ec860d872de3712277242655562a4d2a1325592a>