<script>要素(クライアント側スクリプトのコード)。

HTML 5 に於ける、クライアント側スクリプトのコードである<script>要素について解説します。

<script>要素の概要。

HTML 5 に於ける<script>要素は、HTML 4/XHTML 1同様、クライアント側スクリプトのコードとして定義されております。

HTML 4の頃は、特にクライアント側スクリプト言語を指定しておりませんでしたが、HTML 5 では、JAVAスクリプトをデフォルトのクライアント側スクリプト言語とみなしております。

<script>要素の定義。

カテゴリ
要素が置ける箇所

の少なくともいずれかを満たしている箇所。

要素の内容モデル
src 属性を持たない場合
スクリプトコードの記述となります。
src 属性を持つ場合
JAVAスクリプトでの注釈に相当するテキストのみ記述出来ます。

いずれの場合も、後述の注意に従う必要があります。

要素で定義された属性
グローバル属性の他、以下の属性が定義されております。
src 属性
埋め込みたいスクリプトが外部の場合、そのスクリプトへのURLとなります。
type 属性
埋め込んでいるスクリプトの記述言語をMIMEタイプで表します。
  • 省略した場合は、デフォルトの text/javascript (JAVAスクリプト)と見なします。
async 属性値
src 属性が与えられている場合に限り指定出来ます。

文書読込時に当該スクリプトが実行可能になった時点で、src 属性で示されたスクリプトを実行します(詳細は後述)。

  • XHTML 5 で記述する場合またはXHTMLと互換性を持たせたい場合などは、async="async" と記述します。
defer 属性値
src 属性が与えられている場合に限り指定出来ます。

文書読込が完了した際に、src 属性で示されたスクリプトを実行します(詳細は後述)。

  • XHTML 5 で記述する場合またはXHTMLと互換性を持たせたい場合などは、defer="defer" と記述します。
charset 属性値
src 属性が与えられている場合に限り指定出来ます。

src 属性で示されたスクリプトの文字コードのエンコーディングを指定します。

以下の属性は、HTML 5 の仕様では廃止となっておりますが、条件付きで使用する事が許されております。

language 属性
埋め込むスクリプトの言語を指定します。但し、
  • 属性値の一部または全部が大文字小文字を除いて JAVAScriptと一致する事
  • type 属性が無いか、値が text/javascript となっている事

の二つを満たしている必要があります。

尚、この属性は type 属性で置き換えられるものです。

<script>要素の詳細。

HTML 5 に於ける<script>要素は、src 属性がない場合は、HTML 4/XHTML 1でのそれと全く同じで、内容となっているスクリプトのコードを埋め込みます。

例えば、以下のようになります。

<script type="text/javascript">
    <!--
        sc_onload=window.onload;
        window.onload=function() {}
        //-->
    </script>

一方、src 属性がある場合も、HTML 4/XHTML 1でのそれと殆ど同じで、src 属性で指定されたスクリプトを読み込んで埋め込みます。

ただ、HTML 4/XHTML 1での定義と異なり、内容としてJAVAスクリプトでの注釈のみが入れられる事となりました。

これは当該スクリプトに関するクレジットなどを文書中に埋め込む事を想定してのものです。

具体的には、以下のようになります。

<script type="text/javascript" src="/scripts/system.js">
    /*  日本語文章の強調傍点を打つスクリプト */
    //  Copyright(c) 平成23年 さいたま・しらぎくさいと
    </script>

<script>要素でサポートする事となっている言語。

HTML 4 では<script>要素がサポートすべきとしている言語は一切仮定しておりませんでした。

しかし、HTML 5 では、明確にJAVAスクリプトをサポートする事としております。

但し、この事は、他のスクリプト言語をサポートしてはいけないと言う意味ではありません。

  • 実際、インターネットエクスプローラは、メジャーなユーザエージェントで唯一、VBスクリプトと言うJAVAスクリプトとは異なったクライアント側スクリプト言語をサポートしておりますが、HTML 5 の仕様ではそれを禁じてはいません。

async 属性値とdefer 属性値の関係。

async 属性値defer 属性値は、いずれもsrc 属性がある場合に限り記述出来ます。

  1. async 属性値がある場合は読み込んだスクリプトが実行可能になった時点で実行され、
  2. async 属性値が無くdefer 属性値がある場合はHTML文書の読込が終わった時点で実行され

るものとしております。

もともと、defer 属性値はHTML 4 で<script>要素が定義されたときに導入されたもので、従って HTML 5 仕様策定時に始めて導入された async 属性値と違い、比較的旧式のユーザエージェントでも実装されている事が考えられます。

このため、HTML 5 でも、async 属性値とdefer 属性値の併記を、旧式のユーザエージェントで問題が起こらないようにするために認めております。

双方が併記されている場合、

  1. HTML 5 に対応し async 属性値もサポートしている環境では async 属性値に従って、当該スクリプトが実行可能になった時点で実行するものとし、
  2. HTML 5 以前の世代のユーザエージェントで、async 属性値をサポートしないが、defer 属性値はサポートしている環境では defer 属性値に従って、当該文書読込完了時に実行するもの

とします。

<script>要素の内容について。

<script>要素の内容については、HTML 5 と XHTML 5 では異なったものとなります。

在来 HTML の場合
HTML 5 では、<script>要素の内容は CDATA となります。

すなわち、<script>要素の内容となっている文字参照やコメントなどは一切評価されないと言うものです。

ただ、JAVAスクリプトに対応していない旧式のユーザエージェントの場合、そのままだと<script>要素の内容を丸まるレンダリングしてしまう恐れがあるため、形式的に注釈宣言の形にする事で、旧式のユーザエージェントでのトラブルを防げます。

具体的には、以下のようにします。

<script type="text/javascript">
    <!--
        (此処にスクリプトのコードが入る)
        //-->
    </script>
XHTML の場合
一方、XHTML 5 では、<script>要素の内容は通常のXMLのルールに従って評価される事となります。

すなわち、<script>要素の内容となっている文字参照やコメントなどは全て評価される事になります。

この事は、旧来のユーザエージェントでのトラブル防止としての形式的なコメントアウトが本当にコメントアウトとして評価され、結果スクリプトコードが一切評価されなくなってしまうと言う事を意味します。

また、スクリプト言語の場合、コードには不等号や & が多用される場合が多く、スクリプト中に文字参照にしていない不等号があればそれだけでXMLパースエラーとなってしまいます。

かと言って、それらを文字参照としてしまうと、在来HTMLとした際に正常に評価されずにスクリプトのシンタックスエラーとなる恐れが生じます。

以上の事から、安全に<script>要素を記述するには、以下のようにする必要があります。

<script type="text/javascript">
    //<![CDATA[
        (此処にスクリプトのコードが入る)
        //]]>
    </script>

尚、この記法は在来 HTML 文書としても用いる事を想定した文書であっても問題ありません。

上記のように、扱いが面倒なので、クライアント側スクリプトのコードは全部外部リソースにして、src 属性でURLを指定して埋め込む方がより安全でしょう。

<script>要素の例。

<script>要素の詳細にて挙げておりますのでご覧ください。

注意事項。

async 属性値のサポート状況。

平成23年 6月現在、まだ async 属性値をサポートしているユーザエージェントは出ていないようです。

ですから、まだこの属性値を当てにして使うのは時期尚早と思われます。

type 属性について。

  • この節には制作者の私見が入ります。

HTML 4/XHTML 1では、<script>要素にはtype 属性が必須でしたが、HTML 5 では省略可能になり、省略時にはデフォルトとなる text/javascript と見なされる事となりました。

実際問題として、これまでも type 属性を省略しても、正常にJAVAスクリプトと認識されていたようですが、やはり必須とされていた時代が十年以上続いているのですから、急に省略するのは安心出来ない気がします。

特に、インターネットエクスプローラには、独自のVBスクリプトもサポートされており、それとの区別は必要でしょう。

そもそも、HTML 5 ではこれまで必須だったのを省略しなければならなくなったと言う訳ではないので、今後も引続き type="text/javascript" 属性は附与し続けるに越した事はないと思います。

クライアント側スクリプトは外部コードにする事をお勧めします。

  • この節には制作者の私見が入ります。

<script>要素の内容についてで述べた通り、クライアント側スクリプトは全部外部リソースにして、src 属性でURLを指定して埋め込む方がトラブルが起こり難いと言えます。

ですから、可能な限り、スクリプトのコードは外部リソースにするようにしましょう。

HTML 4/XHTML 1との違い。

HTML 5 に於けるHTML 4/XHTML 1での<script>要素との相違点は、以下の通りです:

関連項目。