Personal tools
You are here: Home ブログ matsuyama scriptタグの謎
Document Actions

scriptタグの謎

いまさらなんですが、

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

をとても謎に思うという話。古い慣習なんでしょうが、コメント終了タグだけをコメントする意味がよくわかりません。ブラウザで読みこんだ場合、

<!--
document.write("Hello");
//-->

か、

document.write("Hello");
//

をjavascriptとして実行することになるのでしょうが(あるいは</script>がでてくるまで逐次的に実行、それなら納得)、前者はいきなりスクリプトエラー起こしますし、後者は空コメントがむなしいです。script未対応ブラウザで読みこんだと仮定しても空コメントの意図がよくわかりません。こう書かないと正しく動作しない古いブラウザの特徴(すごいparser搭載してるな)のための対策なのか、誰かが使いだして、それがハッカー気取りしたい人を中心に感染していったのか、どちらかわかりませんが、僕も一時期こういう具合に書いてたことがあるので、思考停止した状態でノウハウを使用するのは危険だなと痛感しました。XML, XHTMLの時代には

<script type="javascript">
<[CDATA[
document.write("Hello");
]]>
</script>

と書くべきです。あるいは外部ファイルにして

<script src="hello.js" />

としてしまったほうがいいでしょう。これなら古いブラウザでもなんとかなるはずですし。

ちなみにCDATAセクションはエスケープなしでテキストを保持できる特殊構造です。

http://www.w3.org/TR/2004/REC-xml-20040204/#sec-cdata-sect

によると

Within a CDATA section, only the CDEnd string is recognized as markup, so that left angle brackets and ampersands may occur in their literal form; they need not (and cannot) be escaped using "&lt;" and "&amp;". CDATA sections cannot nest.

らしくて、マークアップをエスケープしてもしなくてもいいようです。本文の配信にCDATAセクションを使っているRSS配信サービスがマークアップをエスケープしているのはCDATAセクションを入れ子させないようにするためなのかなあと思っていたのですが、どうやらslashdot.jpはエスケープせずにそのまま配信しているっぽいです。CDATAセクションを入れ子させない自信があるのかあるいはそういう保証があるシステムなのか知りませんが、大抵のクライアントソフトウェアはエスケープを解除してくれるので、動的にCDATAセクションを生成するサービスでは手当たり次第エスケープしたほうがいいのかもしれません。

Category(s)
program
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/mystery-script-tag/tbping

Re:scriptタグの謎

Posted by Anonymous User at 2006-11-16 11:13
script要素に対応していない、ふる~いブラウザのためです。
SGMLとしてコメントアウトしておかないと、スクリプトがそのまま表示されてしまっていたのです。
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.