script

1. 基本情報

説明 スクリプトを記述する
語源 SCRIPT
所属モジュール Scripting
所属コンテントセット Block, Inline, InlineFormattable
内容 PCDATA [必須]
内容の書式 PCDATA
関連項目 head, noscript
公式な実装 DTD

2. 属性

2-1. 一般属性

属性 属性値の型 説明
xmlns URI (CDATA)

XMLネームスペースを指定します。XHTML 1.1では、常にhttp://www.w3.org/1999/xhtmlです。

id ID

この要素を識別する為の識別子を指定します。識別子は同一文書中で重複する事は許されません。

2-2. 固有属性

属性 属性値の型 説明
type [必須] ContentType (CDATA)

リンクするリソースのコンテントタイプを指定します。

src URI (CDATA)

外部スクリプトのURIを指定します。

charset Charset (CDATA)

リンクするリソースの文字エンコーディングを指定します。

defer [選択]

このスクリプトの処理を後回しにするかどうか指定します。表示に影響を与えない場合、指定しておくといいでしょう。

  • defer - このスクリプトの処理を後回しにします。ブラウザによっては、レンダリングが速くなるかも知れません。
xml:space [選択]

空白の扱い方を指定します。これを指定しない場合、空白の扱いはユーザーエージェントに依存します。

  • preserve - 全てのホワイトスペースを保持するよう指示します。

3. 解説

3-1. 概要

script要素は、スクリプトを実行して自身と置き換えます。ここで言うスクリプト (Script)とは、クライアントマシンで実行される、XHTML文書に対して補助的に使われるプログラムの事です。大体のものは、DOMを実装するスクリプトエンジンによって解釈されるスクリプト言語、例えばJavaScriptやVBScript、ECMAScriptなどで記述されます。これらのスクリプト言語の詳細については、ここでは取り上げません。

スクリプトを利用する事で、動的かつ双方向の対話ができるようになります。例えば、次のような利用法が考えられます。

  • 文書の読み込み時に、動的に内容を出力する、あるいは動的に既存の内容を書き換える。
  • form要素で作られるフォームの中で、入力に関する処理をする。例えば「郵便番号」欄の入力によって「住所」欄をある程度自動入力したり、「年齢」欄に入力された数値が15以上でなければ警告したり、など。

近年では、特に、既存の内容を書き換えるような作用を働かせる場合、「WWWが可能にするもの(及びそれについての概念)を根底から進歩させるもの」、つまり「従来のようにHTTPリクエストの度にユーザーエージェントが毎回ウィンドウの内容を全て書き換えるのではなく、必要に応じて非同期通信を行い、全書き換えを行わず内容を書き換える作用・機構、及びその概念」に対してAjax (Asynchronous JAvascript + Xml)という言葉が使われるようですが、このAjaxという用語の定義についてはまだ混乱があるようです(原文はAjax: A New Approach to Web Applications)。

こういった事を可能にするスクリプトは、2種類に大別できます。

  • 文書が読み込まれた時に一度だけ実行されるスクリプト。流れに沿って実行されるので、一般的にはフロードリヴン (Flow-driven)と言われる。script要素で実現される。
  • ユーザが起こす操作によってイベントが発生する度実行されるスクリプト。イベントによって実行されるので、一般的にはイベントドリヴン (Event-driven)と言われる。Intrinsic Eventsモジュールで定義される属性を使ったり、イベントに対してイベントリスナを登録する事で実現される。

この文書ではスクリプトの利用の詳細については扱いません。ここではscript要素の概略だけ説明します。

3-2. スクリプトの埋め込み

使用するスクリプト言語をtype属性で示し、スクリプトは内容として記述するものです。

[プログラムコード開始]

<script type="application/javascript">
document.getElementById( "status" ).textContent = "Worked!";
</script>

[プログラムコード終了]

script要素の内容はPCDATAデータタイプなので、<や&などに対しては文字参照などを使わなければなりません。HTML時代はCDATAデータタイプだったので、気を付けなければなりません。

[プログラムコード開始]

<script type="application/javascript">
if ( x &lt; 10 ) {
// ……
}
</script>

[プログラムコード終了]

あるいは、全体をCDATAセクションにしてしまうという方法もあります。CDATAセクションでは]]>以外はマークアップにならないので、細かい事を気にする必要がありません(と言っても、]]>を含めては駄目なので、これだけは]]&gt;などと参照を使う必要があります)。ちなみに属性値のCDATAデータタイプは参照も使えるので混同しないで下さい。

[プログラムコード開始]

<script type="application/javascript">
<![CDATA[
if ( x < 10 ) {
// ……
}
]]>
</script>

[プログラムコード終了]

ただ、これらの方法だと、スクリプトがある事に気付かない(script要素を認識しない)ユーザーエージェントが内容をそのまま表示してしまう可能性があります。尤も、最近ではそういうユーザーエージェントを使っている人はいないかも知れませんが、特に同じ内容を繰り返す場合は、外部スクリプトを使った方がいいでしょう。

3-3. 外部スクリプトの読み込み

script要素は、内容として記述する代わりに、別のファイルとしてスクリプトを用意しておいて、それにリンクして処理させる事ができます。特に何回も使われるスクリプトの場合は、管理効率の面でも、転送量の面でも好まれるでしょうし、script要素を認識しないようなユーザーエージェントでも内容が描画されてしまう恐れがありません。

外部スクリプトを読み込む場合は、src属性type属性を使います。src属性を使った場合、要素の内容は全て無視されます。

[プログラムコード開始]

<script src="/script/common.js" type="application/javascript"></script>

[プログラムコード終了]

内容が空(PCDATAデータタイプは長さが0でも良い)なので、空要素のように<script src="/script/common.js" type="application/javascript"/>とやっても良さそうに見えます。実際XML 1.0ではそうやっても良く、文法的にも何ら誤りではありませんが、SGMLパーサとの下方互換性(ひいてはHTMLパーサとの下方互換性)を考慮して、内容の書式がEMPTYでない要素では通常の終了タグを書くべきだとされています。実際、IE7ではscript要素の空要素タグを書くとおかしな事になります。

3-4. 代替コンテントの記述

必ずしも全員がスクリプトの恩恵に浴せる訳ではありません。script要素は認識するけれどもスクリプトは実行できないユーザーエージェントや、スクリプトを実行する能力はあるけれども、実行しないように設定されているユーザーエージェントなどを使っている人達です。

スクリプトを実行しない場合の代替コンテントは、noscript要素で記述します。代替コンテントは、object要素の内容やimg要素などのalt属性などのように、できるだけスクリプトによって得られる結果に近いものでなければなりません。

[プログラムコード開始]

<!-- この文書の目次を生成するスクリプト -->
<script src="./script/show-toc" type="application/ecmascript"></script>
<noscript>
<h2 id="toc">目次</h2>
<ul>
<li><a href="./introduction">スクリプトを導入する価値とは</a></li>
<li><a href="./modifying-content">文書の内容を書き換える</a></li>
<!-- ……後続の目次の項目 -->
</ul>
</noscript>

[プログラムコード終了]

勿論、スクリプトを実行して得られる結果は一定ではないですから、完全に等価なものでなくても構いません。が、「このページはスクリプトを実行できるブラウザで見て下さい。」といったテキストを代替コンテントとしてはいけません、というより意味がありません。飽くまでスクリプトは、「使える場合はより便利になるが、使えない場合でもXHTMLの記述だけで同様な結果が得られる」ものであるべきです

noscript要素の内容は、スクリプトを実行できないユーザーエージェントや、実行能力はあるが実行しないように設定されているユーザーエージェント、また、先行するscript要素のtype属性で示されるスクリプト言語を解釈できないユーザーエージェントによって描画されます。実行能力があり、指定されたスクリプト言語を解釈でき、実行しないようにも設定されていないユーザーエージェントは、そのscript要素に続くnoscript要素の内容を描画しません。

3-5. 処理の遅延許可

defer属性を使うと、ユーザーエージェントに、このscript要素が文書の内容に変更を及ぼさないというヒントを与えられます。賢いユーザーエージェントなら、そのscript要素の処理を後回しにして、先に表示に関わる部分を処理していくでしょう。

defer属性を持っているのに文書の内容に変更を及ぼすと、おかしな事になるかも知れません。

3-6. 使用例

解説を参照して下さい。

[script]
Published : 2006-03-26T09:00:00+09:00
Last Modified : 2007-02-21T09:00:00+09:00
Table of Contents : 要素目次
Index : 要素索引
Verified with : Valid XHTML 1.1
Copyright © 2006 - 2007  E+X.