2012-03-06 11 views
4

でJavaScriptを実行できません:オペラ、FF、IE、クロームは、私はすべてのブラウザでHTML以下を実行しようとしていますCDATA

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"> 
</head> 
<body> 
    <script> 
    <![CDATA[ 
    alert('Hey!'); 
    ]]> 
    </script> 
</body> 
</html> 

それらのどれもが警告を表示しません。 Chromeはコンソールにエラーを記録します:Uncaught SyntaxError:予期しないトークン<。 CDATAの宣言では、<という拳に不満があるようです。 Firefoxでも「構文エラー」が記録される

w3schoolsは、これがCDATA http://www.w3schools.com/xml/xml_cdata.aspを使用する方法であることを指摘しています。このサイトのOther answersはそれを示唆しています。私は間違って何をしていますか?私は名前空間とdoctypesで遊んでみましたが、それは何も変わりませんでした。

編集:元々削除したXHTML名前空間とdoctypeを追加しましたが、それでも問題は解決しません。

+1

XML!= HTML。ここにそれを説明する質問があります: –

+1

可能な複製[スクリプトタグ内でCDATAセクションが必要な場合はいつですか?](http://stackoverflow.com/questions/66837/when-is-a-cdata-section-necessary-スクリプトタグ内) –

+1

XHTMLはXMLです。実際、サーバー上のすべてのHTMLはXSLテンプレートによって生成されるため、定義上有効なXMLです。 –

答えて

5

関連する質問When is a CDATA section necessary within a script tag?では、XHTMLドキュメントにスクリプトを埋め込む際にCDATAセクションを推奨しています。しかし、テスト文書にXHTML doctypeを設定するだけでは不十分です。 CDATAはまだ構文エラーとして扱われています。

this blog postによると、コンテンツタイプがdoctype定義と一致する必要があるためです。それが指定され、text/htmlが代わりに送信されない場合は、ブラウザがHTMLに戻ります

Content-type: application/xhtml+xml 

:適切なXHTMLには、以下のContent-typeヘッダーセットを持っている必要があります。実際、テストケースにそのヘッダーを追加すると、CDATAがコメントアウトされていなくても、ブラウザはCDATA内のJavaScriptを適切に解析し始めます。

これは(PHPを使用してヘッダーを設定)私の作品:

<?php header("Content-type: application/xhtml+xml"); 
     echo '<?xml version="1.0" encoding="UTF-8"?>'; ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
    <script><![CDATA[alert('Hey!');]]></script> 
    </head> 
    <body> 
    </body> 
</html>​ 
+0

これは唯一の正しい解決策です。面白いwikipediaでもその例文に構文エラーがあります。http://en.wikipedia.org/wiki/XHTML –

+0

@Mike、私は答えが間違っていることを知りたいと思っています。 – danorton

1

はまた、あなたはそれを実行していますとき、それは解析エラーをスローしないようにCDATAをコメントアウトする必要があります。

<script> 
//<![CDATA[ 
    alert('Hey!'); 
//]]> 
</script> 
+0

彼が適切なXHTMLを作っていないかどうか。 –

+0

私の出力はXSLトランスフォーマによって生成されます。 CDATAセクションは変圧器によって追加され、あなたが示唆しているものは不可能です。 –

2

あなたはそれをXML(XHTML)として見るかもしれませんが、それはブラウザがそれを見る方法ではありません。

text/htmlはブラウザにHTMLとして表示されていることを意味します。

それは、このような本

http://www.alohci.net/application/xhtml+xml/starov.htm.ashx

はなくソースの表示を確認し、この

http://www.alohci.net/text/html/starov.htm.ashx

を好きなようapplication/xhtml+xml

すなわちとしてXMLのMIMEタイプで提供する必要がありますそれが同じファイルであることを確認してください。 Firebugの "Net"タブ(またはブラウザに対応する)をチェックして、応答ヘッダーのコンテンツタイプを確認します。

+0

ありがとうございます。その面白いメタタグは十分ではありません。基本的に、これがディスク上のファイルでサーバ上ではない場合、正しく解析されることはありません。 –

+0

ファイルがローカルで(つまり 'file:'プロトコルを介して)アクセスされる場合、異なる規則が適用され、ブラウザはファイル拡張子から主導権を握ることに注意してください。拡張子が.xhtmlのファイルはXMLとして解析されます。 – Alohci

0

1)あなたのCDATA

//<![CDATA[ 
    alert('Hey!'); 
    //]]> 

2コメント)は

<script type="text/javascript"> 
6

差はHTMLとXHTMLの間にあるスクリプトタイプを追加します。 W3SchoolsはXHTML内の有効なCDATA構造体であることは間違いありませんが、あなたのコードがHTMLであり、HTML内に<script>の中にCDATAというようなものがないことを示しているので、インタプリタが "<"あなたはXHTMLを見ていることをブラウザに伝えることができますが、HTMLを扱う方が安全かもしれません。これを行うには、JavaScriptのコメント内でCDATAを非表示にする必要があります。 (また、あなたの<script>ブロック内でどの言語識別することを検討してください。)

<html> 
<head> 
</head> 
<body> 
    <script> 
    //<![CDATA[ 
    alert('Hey!'); 
    //]]> 
    </script> 
</body> 
</html> 

これ、実際には、この方法はXHTML Media Types, A.4. Embedded Style Sheets and ScriptsにWorld Wide Webコンソーシアム(W3C)によって推奨されています。

+0

もし彼がそれを適切なXHTMLにするなら、CDATAタグはコメントに入れずに動作します。 (今はXHTMLを使用する理由はありません) –

+0

ありがとう、私はその点について詳述しました。 – danorton

+0

私の例を簡単にするためにそれらをすべて削除しました。それを元に戻しても問題は解決しません。私は自分の質問を編集して追加しました。 –

関連する問題