一回も披露したことのない豆知識

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="jp-JP">
<head>
<title>try</title>
<script type="text/javascript">
<![CDATA[ function try01(){window.alert("try");} ]]></script>
</head>
<body onload="try01();">
<h1>try</h1>
</body>
</html>

以上のHTML文書を実行すると構文エラーになります。
私には、どこに問題があるか、わかりません。
何が問題なのか、分かる方がいらっしゃいましたら教えていただきたく思います。

A 回答 (9件)

とりあえず、



<script type="text/javascript">
// <![CDATA[
function try01(){window.alert("try");}
// ]]>
</script>

のようにコメントに入れてしまえば一応うまくいきます。

この回答への補足

回答ありがとうございます。
この場合、パーサはCDATAセッションを正しく解釈するのでしょうか?
それとも、コメントアウトされた文字列として扱うのでしょうか?
パーサのする処理を考えると、多分、CDATAセッションとして正しく解釈されると思うのですが、それで間違いないでしょうか?

補足日時:2006/01/05 14:16
    • good
    • 0

># 「<![CDATA[」と「]]>」をコメントアウトするのってある種の決まり文句みたいなものだと思ってたんですけど、そうでもないのかなぁ


私の読んだことのある本XHTML(オライリー)の本では、
使わない方がいいようなコメントでした。(#1のようにするのではなく、外部スクリプトにする)
#1の場合、XHTMLとしてイレギュラーになる場合があるから逆は成り立たずでダメですね。(書いたときはIEでXHTML解釈できないから、それでいいや的に思っていました)
//でスクリプトとしてコメント化するのも試してはみたけど、
それってXHTMLとして解釈できてないということなので、
(DOMで検証してみました。IEの場合、パースしてない。firefoxで、.xhtmlの場合は、ちゃんとできていますが、テキストノードが分割されるのが気に入らないね)
(回答としては)やめちゃいました。
結局の処、XHTMLとして記述しても、HTMLとして解釈実行させているのであれば、しょうがないような気がします。
firefoxなどでは、拡張子をxhtmlにすることで正しく処理できますが、
他のに合わせて.htmlにしてたら、処理しないワケで、
XHTMLとして記述してXHTMLとして処理しないのなら、XHTMLで書いてどうなの?
とか思います。(他からプログラム処理的に読まれる時に便利!ってとこなんだろうね)
IEの場合、XMLとして、XSLTを使ってHTMLにして表示なんていうのもありかもしれませんが、なにやってんだかって感じですね。
ブツクサ言ってみましたf(^^;
    • good
    • 0

> 気分を害されたのであれば、すみません



いえいえ、とんでもない。
ただ BLUEPIXY さんが「自信なし」とのことだったので もしやと思っただけのことです。

# 「<![CDATA[」と「]]>」をコメントアウトするのってある種の決まり文句みたいなものだと思ってたんですけど、そうでもないのかなぁ

# あ、いまさら恐縮ですが、「CDATA セッション」じゃなくて「CDATA セクション」ですよ > 質問者さん
    • good
    • 0

>#6


解説されたようなことは、一応わかっております。
なんか、気分を害されたのであれば、すみません。
#1の補足で、質問者の意図として、CDATAセクションの中に書くというような意図だと思ったのでそのように書きました。
結局、そういうこだわりでないなら、余計なことでした。
    • good
    • 0

> CDATAの外に(スクリプトを)書いたら意味無い



え? 何のために CDATA セクションにするのか分かっていらっしゃいますよね?

念のため一応解説しましょう。

XHTML では、script 要素の内容は PCDATA として定義されています。PCDATA なので、「&」や「<」をそのまま書くことができません。
そこで、「&」や「<」をそのまま書くことができるようにするために、CDATA セクションを用います。

ゆえに、スクリプトの中に「&」も「<」も出てこないのであれば CDATA セクションにする必要はありません。同じく、CDATA セクションの外に「&」「<」以外の文字・記号を書くことも構いません。

さて、No.4 の方法ですが、XHTML を正しく解釈するパーザでは、CDATA セクションとして正しく解釈されます。まず文書が XHTML として解釈されるときに CDATA セクションも CDATA セクションとして解釈されます。そしてスクリプトが実行されるときにはマークアップが取り除かれて
//
function try01(){window.alert("try");}
//
というスクリプトが実行されることになります。

CDATA セクションを解釈できない古いブラウザでは、script 要素の内容がそのままスクリプトとして解釈されますが、「<![CDATA[」と「]]>」はコメントとみなされるのでエラーは発生しません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
妥当検証パーサを使用して、「妥当なXML文書」として解析された文書であるのに、何故かエラーがなくならないので悩んでいたのですが、script全体をscriptとして解釈していたのですね。
なるほど、CDATAセッションをコメントアウトしてしまえば巧くいくのですか。
とりあえず、#4の方法で実行しようと思います。
他に何か方法をご存知の方がいらっしゃったら教えてください。

お礼日時:2006/01/05 17:50

>#4


CDATAの外に(スクリプトを)書いたら意味無い
    • good
    • 0

折衷案としては、


<script type="text/javascript" src="./try01.js"></script>
のような外部呼び出しにしてしまうことじゃないかと思います。

もう少し待てば、もっと詳しい人の回答が得られるかもしれませんが・
    • good
    • 0

><!-- -->の間は、解析する前に捨てられると思うのですが?


確かにそうですが、HTMLでそれはコメントとして通用しますが
<!-- -->

<![CDATA[]]>
は、同じではありませんし、CDATAは、コメントでもありません。

>実体参照で書くか、CDATAセッションを使うように言われています。
それはそうですが、ブラウザがそのように対応していいないのならしょうがありません。
    • good
    • 0

IE6で、ファイルの拡張子がhtmlの時


HTMLとして解釈されるために、
CDATAでエラーになります。
<![CDATA[
]]>
を削除すれば実行できるようになります。
ちなみに、
firefoxでも同じエラーになりますが、
firefoxの場合、
拡張子をxhtml にすると、正しく実行できます。
IE6の場合、拡張子をxhtml にすると、XMLとして正しく解釈できるようになりますが、HTMLとしてレンダリングされません。
簡単に言うと、今の処未対応ということですね。
当分
<script type="text/javascript">
<!--
//-->
</script>
のスタイルでCDATAは使わないで書くのがいいようです。

この回答への補足

回答ありがとうございます。
CDATAは使わない方が良いとの指摘ですが、この文章はXHTMLですので、正しい動作をするパーサですと、<!-- -->の間は、解析する前に捨てられると思うのですが?
また、W3Cではscriptタグは#PCDATAを持つと定義されているので、実体参照で書くか、CDATAセッションを使うように言われています。
ですので、できればこのままCDATAセッションで行きたいのですが、何か方法はないのでしょうか?
http://www.w3.org/TR/2002/REC-xhtml1-20020801/#h …

補足日時:2006/01/05 02:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!