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 "<" and "&". 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タグの謎
SGMLとしてコメントアウトしておかないと、スクリプトがそのまま表示されてしまっていたのです。