web-dev-qa-db-ja.com

Scriptタグ内にCDATAセクションが必要な場合

CDATAタグはスクリプトタグに必要なことはありますか?必要な場合は?

言い換えれば、いつ、どこにこれがあります:

<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>

これより好ましい

<script type="text/javascript">
...code...
</script>
871
brad

文書をXMLとして解析する必要がある場合(たとえばXHTMLページがXMLとして解釈される場合) で、i<10およびa && bではなくリテラルi&lt;10およびa &amp;&amp; bを記述できるようにするには、CDATAセクションが必要です。 XHTMLは、デフォルトでは文字データではなく、解析済み文字データとしてJavaScriptコードを解析します。これは外部のソースファイルに保存されているスクリプトの問題ではありませんが、XHTMLのインラインJavaScriptでは、 おそらく CDATAセクションを使いたいでしょう。

多くのXHTMLページは決してXMLとして解析されることを意図していなかったことに注意してください。その場合、これは問題にならないでしょう。

この件に関する良い記事については、 https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm を参照してください。

567
Michael Ridley

ブラウザがマークアップをXMLとして扱う場合:

<script>
<![CDATA[
    ...code...
]]>
</script>

ブラウザがマークアップをHTMLとして扱う場合:

<script>
    ...code...
</script>

ブラウザがマークアップをHTMLとして扱い、XHTML 1.0マークアップを検証したい場合(たとえば)。

<script>
//<![CDATA[
    ...code...
//]]>
</script>
231
Shadow2531

HTML

HTMLパーサーは、<script></script>の間のすべてをスクリプトの一部として扱います。 一部の実装では、正しい終了タグさえ必要ありません。 「</」でスクリプトの解釈を停止します。これは specs に従って正しい

UpdateHTML5では、現在のブラウザーではそうではありません。

したがって、HTMLでは、これはnot可能です:

<script>
var x = '</script>';
alert(x)
</script>

CDATAセクションはまったく効果がありません。それがあなたが書く必要がある理由です

var x = '<' + '/script>'; // or
var x = '<\/script>';

または類似。

これは、text/htmlとして提供されるXHTMLファイルにも適用されます。 (IEはXMLコンテンツタイプをサポートしていないため、これはほとんど真実です。)

XML

XMLでは、さまざまなルールが適用されます。 (IE以外の)ブラウザは、XHMTLドキュメントがXMLコンテンツタイプで提供される場合にのみXMLパーサーを使用することに注意してください。

XMLパーサーにとって、scriptタグは他のどのタグよりも優れています。特に、スクリプトノードには、「<」によってトリガーされる非テキストの子ノードが含まれる場合があります。 「&」記号は、文字エンティティを示します。

XHTMLでは、これはnot不可能です:

<script>
if (a<b && c<d) {
    alert('Hooray');
}
</script>

これを回避するには、スクリプト全体をCDATAセクションにラップします。これはパーサーに次のように伝えます。「このセクションでは、<」および「&」を制御文字として扱わないでください。」 JavaScriptエンジンが「<![CDATA[」および「]]>」マークを解釈しないようにするには、それらをコメントで囲むことができます。

スクリプトに「<」または「&」が含まれていない場合は、とにかくCDATAセクションは必要ありません。

121

基本的にはXHTMLとHTMLの両方である文書を書くことを許可することです。問題は、XHTML内では、XMLパーサーが script タグ内の&、<、>文字を解釈し、XML構文解析エラーを引き起こすことです。だから、あなたはあなたのJavaScriptをエンティティで書くことができます。例えば:

if (a &gt; b) alert('hello world');

しかしこれは実用的ではありません。もっと大きな問題は、あなたがHTMLでページを読んだ場合、タグ script はCDATA 'デフォルトで'と見なされ、そのようなJavaScriptは実行されないということです。したがって、XHTMLパーサーとHTMLパーサーの両方を使用して同じページを正しく表示するには、XHTMLのCDATA要素で script タグを囲む必要がありますが、HTMLで囲む必要はありません。

このトリックはCDATA要素の始まりをJavaScriptのコメントとしてマークします。 HTMLでは、JavaScriptパーサーはCDATAタグを無視します(これはコメントです)。 XHTMLでは、XMLパーサー(JavaScriptの前に実行されます)がそれを検出し、CDATAの終わりまでCDATAとして残りを扱います。

30
ondra

それはX(HT)MLのものです。 JavaScript内で<>のような記号を使用すると、 2つの整数を比較するために、これはXMLのように解析されなければならないでしょう、したがって、それらはタグの始まりまたは終わりとしてマークするでしょう。

CDATAは、次の行(]]>までのすべてがXMLではないため、そのように構文解析されるべきではない)を意味します。

23
Franz

not HTML4でCDATAを使用しますが、should XHTMLでCDATAを使用し、must <や>などのエスケープされていないシンボルがある場合、XMLでCDATAを使用します。

18
Loren Segal

外部参照ではなく、JavaScriptがページに埋め込まれている場合にXHTML検証が正しく機能するようにします。

XHTMLでは、あなたのページはXMLマークアップ要件に厳密に準拠している必要があります。 JavaScriptには特別な意味を持つ文字が含まれている可能性があるため、検証で不正な形式のフラグが設定されていないことを確認するためにCDATAでラップする必要があります。

Web上のHTMLページでは、タグの間に必要なJavaScriptを含めることができます。 Webページ上のHTMLを検証するとき、JavaScriptのコンテンツはCDATA(文字データ)であると見なされ、そのためバリデータによって無視されます。 Webページを設定する際に最新のXHTML標準に従う場合も同様です。 XHTMLでは、スクリプトタグ間のコードはPCDATA(解析済み文字データ)と見なされ、そのためバリデータによって処理されます。

このため、Webページを「壊す」ことなしにページのスクリプトタグの間にJavaScriptを含めることはできません(少なくともバリデータに関する限り)。

CDATAについてはこちら 、および XHTMLについてはこちら をご覧ください。

17
LBushkin

CDATAは、その内容がXMLではないことを示します。

これは wikipedia についての説明です。

10
Alex Beardsley

XHTMLに厳密に準拠するためには、CDATAは必要最小限で、アンパサンドには無効な文字としてフラグが立てられません。

9
Chris Shaffer

xhtml検証中のxmlエラーを回避するため。

8
gehsekky

CDATAはブラウザにテキストをそのまま表示し、HTMLとしてレンダリングしないように指示します。

8
Ikaso

CDATAは、その内容がXMLではないことを示します。

6
Jim

XMLノード内のテキストはJavaScriptとして評価される前に子要素として扱われるため、CDATAは任意のXML方言で必要です。これが JSLintが に正規表現の<文字について不満を言う理由でもあります。

参考文献

5
Paul Sweatte

検証したいとき (XML/XHTMLでは - ありがとう、 Loren Segal )。

2
ceejayoz

そうすることで、古いブラウザはJavascriptコードを解析せず、ページは壊れません。

後方互換性それが大好きです。

2
Tyler Carter