[44] [CODE(HTMLe)@en[[[script]]]] [[要素]]の
[DFN[[CODE(HTMLa)@en[[[src]]]]]] [[属性]]は、
[[外部スクリプト資源]]の [[URL]] を指定するものです。
この[[属性]]が指定されると、[[スクリプト]]は[[要素]]の[[内容]]ではなく、
指定された [[URL]] で取得できるものとなります。

* 仕様書

[REFS[
- [140] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#the-script-element>
-- [1] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-16 01:30:20 +09:00]] 版) <https://html.spec.whatwg.org/#attr-script-src>'''
-- [10] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-21 07:50:23 +09:00]] 版) <https://html.spec.whatwg.org/#attr-script-charset>
]REFS]

* 意味

[2] [CODE(HTMLe)@en[[[script]]]] [[要素]]が[[古典スクリプト]]や[[モジュールスクリプト]]の場合には、
[[外部スクリプト資源]]を参照することができます。 [CODE(HTMLa)@en[[[src]]]]
[[属性]]はその[[外部スクリプト]]の [[URL]] を指定するものです。 [SRC[>>1]]

* 属性値

[3] [CODE(HTMLa)@en[[[src]]]] [[属性値]]は、
[[valid non-empty URL potentially surrounded by spaces]] でなければ[['''なりません''']]
[SRC[>>1]]。

[HISTORY[
[46] [[HTML4]] 時代のこの属性の値は [CODE(SGML)[%[[URI]]]] です。
[[SGML]] 的には [CODE(SGML)[[[CDATA]]]] です。
]HISTORY]

[5] 普通は[[素片識別子]]は使いませんが、
[[スクリプト言語]]によっては使い道があるかもしれません。
少なくても使ってはいけない理由はないでしょう。

[6] 使用実績のある [[scheme]] は、 [CODE(URI)[[[http]]:]], [CODE(URI)[[[https]]:]]
くらいでしょうか。探せば [CODE(URI)[[[ftp]]:]], [CODE(URI)[[[cid]]:]]
もあるかもしれませんし、ブラウザは実装していそうです。
[CODE(URI)[[[chrome]]:]] や [CODE(URI)[[[resource]]:]] など
UA 依存の特殊な scheme に対応しているものもあるでしょう。

[47] この属性は省略可能です。省略すると [CODE(HTMLe)[script]]
要素の内容がスクリプトとみなされます。逆に指定すると内容は無視されます。
[SRC[HTML 4 18.2.1]] 

[HISTORY[
[7] [CODE(HTMLa)[src]] 属性を省略して、内容は空であるとしても、 HTML 
的には空のスクリプトであるというだけで問題ないはずです。
しかし、スクリプト言語によっては、
まったくの空ではいけないというものももしかするとあるかもしれません。
普通は空でも何も行われないだけです。ただ、
空なら既定の動作をするという変なスクリプト言語もあるかもしれません。
]HISTORY]

* 外部スクリプト資源の制約

[4] [CODE(HTMLe)@en[[[script]]]] [[要素]]の [CODE(HTMLa)@en[[[src]]]]
[[属性]]が参照する[[外部スクリプト資源]]は、
[[古典スクリプト]]なら [[JavaScript]] の [CODE[[[Script]]]]、
[[モジュールスクリプト]]なら [[JavaScript]] の [CODE[[[Module]]]]
の制約に従わなければ[['''なりません''']] [SRC[>>1]]。

* 文脈

[9] [CODE(HTMLe)@en[[[script]]]] [[要素]]の種別が[[データブロック]]の時は、
[CODE(HTMLa)@en[[[src]]]] [[属性]]を使っては[['''なりません''']] [SRC[>>1]]。

* 処理

[12] [CODE(HTMLe)@en[[[script]]]] や[[外部スクリプトのfetch]]を参照。

[14] [CODE(HTMLe)@en[[[script]]]] [[要素]][VAR[要素]]への
[CODE(HTMLa)@en[[[src]]]] [[属性の追加]]は、次のようにしなければ[['''なりません''']]
[SRC[>>140]]。
[FIG(steps)[
= [15] [VAR[要素]]が[[影を含む文書中]]にあり、
[F[[[「構文解析器挿入」]]フラグ]]が設定されてい''なければ''、
== [16] [VAR[要素]]について[[スクリプトを準備]]します。
]FIG]

[17] [CODE(HTMLa)@en[[[src]]]] [[属性の設定]]については、
[CODE(HTMLe)@en[[[script]]]] [[要素]]の項も参照。

[135] なお、初回処理時の値が使われるので、動的に変更しても、意味を持ちません [SRC[>>140]]。

* [CODE(DOMi)@en[HTMLScriptElement]] インターフェイス [CODE(DOMa)@en[src]] 属性

[13] [CODE(DOMi)@en[[[HTMLScriptElement]]]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[[[src]]]]]] [[IDL属性]]は、
[CODE(HTMLa)@en[[[src]]]] [[内容属性]]を[[反映]]しなければ[['''なりません''']]
[SRC[>>140]]。これは[[URL]]として[[反映]]するものです。

* 関連

[8] [CODE(HTMLe)@en[[[script]]]] [[要素]]の他の[[属性]]や[[要素]]の[[内容]]の制約との関係や処理方法については、
[CODE(HTMLe)@en[[[script]]]] を参照。

[11] [CODE(HTMLa)@en[[[charset]]]] [[属性]]は、 [CODE(HTMLa)@en[[[src]]]]
[[属性]]がないとき指定しては[['''なりません''']] [SRC[>>10]]。

* 歴史

** 登場

[21] [CODE(HTMLa)[src]] 属性に対応しているのは [[NN]] 3.0 以降だそうです。

[52]
>>21 つまり [[Netscape Navigator]] 2 では [CODE(HTMLa)@en[src]]
を指定しても[[内容]]を実行してしまいます。
これを使って版で動作を分けるという方法が使われたこともありました。
([[名無しさん]] [sage])

[53]
[[Netscape Navigator 3]]で導入されました。

;; [CITE[Welcome to Netscape Navigator 3.03]] <http://wp.netscape.com/eng/mozilla/3.0/relnotes/windows-3.03.html#JavaScript>

この当時は、[CODE(HTMLa)@en[[[language]]]]または[CODE(HTMLa)@en[[[src]]]]のいずれかが指定されていなければならず、[CODE(HTMLa)@en[[[src]]]]が指定されている時[CODE(HTMLa)@en[[[language]]]]はあってもなくてもよいとされていました。

また、[CODE(HTMLa)@en[[[src]]]]の指定する[[資源]]については、[[JavaScript]]であることを示すために[[媒体型]][CODE(MIME)@en[[[application/x-javascript]]]]と[[札付け]]しなければならないとされています。

[23] 
[CITE[Welcome to Netscape Navigator 3.0]], [TIME[2024-08-16T11:53:26.000Z]], [TIME[2002-06-30T20:16:54.879Z]] <https://web.archive.org/web/20020630200918/http://wp.netscape.com/eng/mozilla/3.0/relnotes/windows-3.0.html#JavaScript>

** HTML4

[45] 仕様書:
- [[HTML 4]]
-- [CITE[18.2.1 The [CODE(HTMLe)[SCRIPT]] element]]
<IW:HTML4:"interact/scripts.html#edef-SCRIPT">
-- [CODE(HTMLe)[script]] 要素 [CODE(HTMLa)[src]] 属性
<IW:HTML4:"interact/scripts.html#adef-src-SCRIPT">

* メモ

[54]
[[素片識別子]]を[[スクリプト]]に[[引数]]を与えるために使おうとする人がいます。
([[名無しさん]] [WEAK[2006-08-08 11:51:19 +00:00]])

[56]
[CITE@en-us[Sprinkle Javascript library by Jon Davis]] ([CODE[2007-09-14 15:50:15 +09:00]] 版) <http://home.sprinklejs.com:880/>

[84] [CITE@en[Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb]]
([TIME[2016-01-21 22:15:58 +09:00]] 版)
<https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>

[85] [CITE@en[URLs are parsed and produce records · whatwg/html@30bc255]]
([TIME[2016-02-14 23:00:33 +09:00]] 版)
<https://github.com/whatwg/html/commit/30bc2557105ad62881ec9670f253febbc9761b44>

[18] [CITE@en[Execute <script> in shadow trees · whatwg/html@caf203f]]
([TIME[2016-04-27 17:51:00 +09:00]] 版)
<https://github.com/whatwg/html/commit/caf203fd4d9a5047d1ff2edad2290d53e21368ba>

[19] [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>

[20] [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>

[22] [CITE@en[async="" should be allowed on inline module scripts · Issue #3319 · whatwg/html]]
([TIME[2018-02-26 00:11:08 +09:00]])
<https://github.com/whatwg/html/issues/3319>