<script> は、JavaScript などのスクリプトを記述するために用います。
主に JavaScript を実行するために使用されますが、VBScript など別のスクリプトも実行可能です。
JavaScript に関する詳細は「とほほのJavaScriptリファレンス」などを参照してください。
<script>~</script> の間にスクリプトを記述します。スクリプトは通常 JavaScript を記述します。
<script> alert("Hello world!"); </script>
以前は、スクリプトに対応していないブラウザのために、スクリプトを下記の様に HTML のコメントとして記述していました。現在は、<script> に対応していないブラウザは皆無のため、コメント化しないことが多くなりました。
<script> <!-- alert("Hello world!"); // --> </script>
type 属性でスクリプト種別を指定します。HTML 4.01 では type 属性は必須とされていましたが、HTML5 では省略時は "text/javascript" とみなされるようになりました。JavaScript 以外の言語を使用する場合に type 属性を指定します。例えば、IE3~IE10 でサポートされていた VBScript(text/vbscript) を用いるには次のようにします。
<script type="text/vbscript"> msgbox "Hello world!" </script>
VBScript は IE11 で基本的には廃止されました。IE11 で VBScript を動かすためにはヘッダ部に下記を記述する必要があります。
<meta http-equiv="x-ua-compatible" content="IE=10">
src 属性を用いると、JavaScript ファイルを外部ファイルで記述することができます。例えば、sample.js ファイルに下記の内容を記述しておきます。<script> は不用です。
alert("Hello!!");
これを、HTMLファイルから下記のように呼び出します。
<script src="sample.js"></script>
通常は、HTML のパース中にスクリプトの読み込みが指定されると、ブラウザは HTML の解析を中断し、スクリプトを読み込み、実行し、その後、HTML の解析を再開します。
<script src="sample.js"></script>
async 属性を指定すると、HTML の解析と、スクリプトの読み込み・実行を非同期に平行して行います。
<script async src="sample.js"></script>
defer 属性を指定すると、HTML の解析と、スクリプトの読み込みを非同期に平行しておこないますが、スクリプトの実行は、HTML の解析が完了した後で行われます。
<script defer src="sample.js"></script>
async や defer を指定した外部スクリプトは、その実行順序が保障されなくなるため、依存関係のあるライブラリに async や defer を指定することはできません。また、async や defer を指定した外部スクリプトでは、document.write() など、レンダリングに影響のある記述を用いてはなりません。
nonce は HTML5.1 で追加された属性で、Web ページ上に悪意を持って埋め込まれたスクリプトの実行を抑制するために用いられます。例えば、HTTP のレスポンスに下記の様な HTTP ヘッダが付与されていたとします。
Content-Security-Policy: script-src 'nonce-hUygTfgbgFcdRt5eDqpLfB6f==' 'strict-dynamic'
この場合、下記の HTML コードがある場合、正規のスクリプトは実行されますが、正当な nonce 値を持たない悪意のあるスクリプトは実行されません。
<article> ~悪意のある書き込み~ <script>悪意のあるスクリプト</script> ~悪意のある書き込み~ </article> <script nonce="hUygTfgbgFcdRt5eDqpLfB6f==">正規のスクリプト</script>
integrity 属性は、CDN などの中継サーバにおけるスクリプトの改竄をチェックするために用いられます。まず、スクリプトファイルの SHA-384 ハッシュ値を求めます。
$ cat sample.js | openssl dgst -sha384 -binary | openssl enc -base64 -A DAPiLw1y9MaVlqwm9UKKTFNXrbtWUdW5Gwh8Zd8uWrccOb+zap1l8sjnv0QEfaGM
このハッシュ値を下記の様に指定します。
<script src="./sample.js" integrity="sha384-DAPiLw1y9MaVlqwm9UKKTFNXrbtWUdW5Gwh8Zd8uWrccOb+zap1l8sjnv0QEfaGM" crossorigin="anonymous"></script>
ブラウザは、integrity 属性が指定されている場合、ダウンロードしたスクリプトファイルのハッシュ値と integrity 属性の値を比較し、スクリプトの改竄が無いかチェックします。
ES6(ES2015/ECMAScript 2015) では、ES6 modules と呼ばれる機能が追加されました。PHP の require、Python の import などと同様、import / export で他のスクリプトファイルを読み込むことが可能です。ただし、この機能を用いると、ES6 modules に対応していないブラウザではエラーとなってしまいます。この問題を解決するために、type="module" と nomodule 属性を使用します。
ES6 modules 対応ブラウザのために、export / import を使用した sample-module.js を用意します。ES6 modules 未対応ブラウザのために、読み込むライブラリをすべて展開した sample-classic.js (効率が悪い)を用意します。これらを下記の様に読み込みます。ES6 modules 未対応ブラウザは nomodule 属性を無視し、sample-classic.js を読み込みますが、type="module" は未サポート言語のため sample-module.js は読み込みません。ES6 modules 対応ブラウザは nomodule 属性が指定された sample-classic.js は読み込まず、type="module" が指定された sample-module.js のみを読み込みます。
<script nomodule src="sample-classic.js"></script> <script type="module" src="sample-module.js"></script>
language 属性には、使用する言語とそのバージョンを指定しするのに用いられていました。HTML5 には採用されておらず、非推奨の属性です。
値 | IE | Netscape | ||||||
---|---|---|---|---|---|---|---|---|
2.0 | 3.0 | 4.0 | 5.0 | 2.0 | 3.0 | 4.0 ~ 4.05 | 4.06 4.5 | |
language="JavaScript" | × | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
language="JavaScript1.0" | × | × | × | × | × | × | × | × |
language="JavaScript1.1" | × | × | ○ | ○ | × | ○ | ○ | ○ |
language="JavaScript1.2" | × | × | ○ | ○ | × | × | ○ | ○ |
language="JavaScript1.3" | × | × | ○ | ○ | × | × | × | ○ |
language="Jscript" | × | ? | ○ | ○ | × | × | × | × |
language="VBScript" | × | ○ | ○ | ○ | × | × | × | × |
language="VBS" | × | ? | ○ | ○ | × | × | × | × |