JavaScript/XML
現在、Webコンテンツの記述言語はHTMLから、XMLベースのXHTMLへと移り変わって行こうとしています。 XHTMLは、HTMLをXML規格に準拠するように一部修正を加えたりしたものなので、JavaScriptは以前とほぼ同様に利用する事が出来ます。 しかしながら、XML規格にきちんと対応しようとすると、HTMLの時にはあまり問題にならなかった事が問題となってきます。
- 2021年6月13日追記
- 冒頭のパラグラフの「現在」は概ね200X年代の状況です。
- 現在、XHTMLを主導的に標準化してきたW3Cはウェブ標準の策定を WHATWG に譲っています[1]。
- XHTML2.0 は正式に廃案になりました。
- HTML5はHTML Living Standardが標準となっています。
- HTML5ではXHTMLは、HTML5のXML構文との位置づけられるともに、XHTMLの語は標準仕様書のなかでは用いないとしている[2]。
- 2022年7月9日追記
- 以下の文章も、SGMLに基づいていたHTM4.01以前を念頭に書かれており、現在使用されているHTML5に適用できない事柄も複数あります。
- 現在も、XMLをJavaScriptで利用する応用分野はありますが、多くの応用ではXMLではなくJSONやYAMLが使われるようになっています。
- このようなことから、過去の認識での記述であることに注意してください。
SCRIPT要素内のコメントアウト[編集]
HTMLでは、SCRIPT要素に対応していないブラウザでスクリプトが表示されてしまわないように、SCRIPT要素の内容をコメントアウトすることができます。SCRIPT要素を全く知らないユーザーエージェントにとって、SCRIPT要素の内容は、CDATA型ではなく、#PCDATAですから、HTMLのコメントの体裁をしていれば、当然、HTMLのコメントとして処理してしまうわけです。したがって、次の例では、SCRIPT要素に対応していないユーザーエージェントは、SCRIPT要素の内容をコメントアウトします。
<script><!--
document.write("Hello World");
//--></script>
ただし、
- 現在利用されているブラウザの大半はSCRIPT要素を認識できる。つまり、SCRIPT要素の内容全てをHTMLの定義通りにCDATAとして扱い、それをスクリプトエンジンに渡して、処理を完全に委ねている。
- メジャーなユーザーエージェントの多くが、スクリプトエンジンが無くても SCRIPT要素の内容を無視するよう調整されている、または、そのように実装変更されてきている。
などの実情があります。これに甘えれば、コメントアウトの必要性自体がかなり低くなってきていると言えなくもないわけです。 どうしても気になる場合は、SCRIPT要素のsrc属性を用いてコンテンツ外のJavaScriptファイルを参照すると良いでしょう。
<script src="hello.js"></script>
要するに、SCRIPT要素の内容は空にしておいた方が無難です。
ところで、SCRIPT要素を認識しているユーザーエージェント、つまり、SCRIPT要素の内容をCDATAとして扱っているユーザーエージェントは、この内容の終わりを知る術が無いように思われるかもしれません。しかし、これは、HTML仕様にきちんと書かれていて、「</」の2文字が出現する直前までがCDATA区間、つまり、SCRIPT要素の内容である、ということになっています。ただし、実装レベルでは、この仕様を守りつつ、より高度な判定をするように作られています。とはいえ、文字列中に「</」が出現するようなスクリプトをSCRIPT要素の内容に書く場合には、「<\/」のように記述する方が好ましいでしょう。
「<」や「&」の取り扱い[編集]
JavaScriptでは、「<」や「&」を演算子として用いる事が良くありますが、 「&」や「<」はXMLにおいて特別な意味を持つため、SCRIPT要素内で利用する事は出来ません。
<script>
if (a < b && b < c) document.write("a < c");
</script>
そのため、<や&は実体参照を用いて、それぞれ < & と記述しなくてはなりません。 しかし、この方法は対応していないブラウザが多いためあまり実用的ではありません。
<script>
if(a &lt; b &amp;&amp; b &lt; c) document.write("a &lt; c");
</script>
そのため、SCRIPT要素のsrc属性を用いて外部のJavaScriptファイルを読み込む方法を用いた方が良いでしょう。
<script src="abc.js"></script>
どうしてもコンテンツ内に書きたいという場合は、CDATAセクションを用いることで、&や<を&や<で置き換えずに済みます。
<script><![CDATA[
if(a < b && b < c) document.write("a < c");
]]></script>
ただしCDATAセクションで囲っただけでは、CDATAセクションに対応していないブラウザでJavaScriptエラーが発生する可能性があります。 しかし、<![CDATA[ と ]]>の前に一行コメントの // を付けてコメントアウトする事で、この問題は回避可能です。
<script>//<![CDATA[ この部分にコードを書いても無視されるので注意
if(a < b && b < c) document.write("a < c");
//]]>
</script>