JavaScript XML

出典: フリー教科書『ウィキブックス(Wikibooks)』
移動: 案内検索

現在、Webコンテンツの記述言語はHTMLから、XMLベースのXHTMLへと移り変わって行こうとしています。 XHTMLは、HTMLをXML規格に準拠するように一部修正を加えたりしたものなので、JavaScriptは以前とほぼ同様に利用する事が出来ます。 しかしながら、XML規格にきちんと対応しようとすると、HTMLの時にはあまり問題にならなかった事が問題となってきます。

script要素内のコメントアウト[編集]

HTMLでは、script要素に対応していないブラウザでスクリプトが表示されてしまわないように、script要素の内容をコメントアウトすることができます。script要素を全く知らないユーザーエージェントにとって、script要素の内容は、CDATA型ではなく、#PCDATAですから、HTMLのコメントの体裁をしていれば、当然、HTMLのコメントとして処理してしまうわけです。したがって、次の例では、script要素に対応していないユーザーエージェントは、script要素の内容をコメントアウトします。

<script type="text/javascript"><!--
 document.write("Hello World");
 //--></script>

ただし、

  • 現在利用されているブラウザの大半はscript要素を認識できる。つまり、script要素の内容全てをHTMLの定義通りにCDATAとして扱い、それをスクリプトエンジンに渡して、処理を完全に委ねている。
  • メジャーなユーザーエージェントの多くが、スクリプトエンジンが無くても script要素の内容を無視するよう調整されている、または、そのように実装変更されてきている。

などの実情があります。これに甘えれば、コメントアウトの必要性自体がかなり低くなってきていると言えなくもないわけです。 どうしても気になる場合は、script要素のsrc属性を用いてコンテンツ外のJavaScriptファイルを参照すると良いでしょう。

<script type="text/javascript" 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>

そのため、<や&は実体参照を用いて、それぞれ &lt; &amp; と記述しなくてはなりません。 しかし、この方法は対応していないブラウザが多いためあまり実用的ではありません。

<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セクションを用いることで、&や<を&amp;や&lt;で置き換えずに済みます。

<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>