スクリプトタグ内でCDATAセクションが必要になるのはいつですか?


907

あるCDATAのタグは、ときにスクリプトタグ内とあれば、これまで必要?

つまり、これはいつ、どこにあるのか:

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

これよりも好ましい:

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

18
XHTMLは本質的に死んでいるので、これはもはや関連する懸念事項ではありませんか?
allyourcode

80
@allyourcode:XHTMLが死んでいると思う理由は何ですか?HTML5?XHTML5がそれに沿って動作します:)
Doktor J

4
@DoktorJ AFAIK xHTMLはバージョン1でした。これに相当するHTMLはバージョン4でした。HTML5と同じ機能を改善する方法として、xform、xlink、time、およびsvg名前空間を仕様にプッシュすることを目的としたxHTML 2.0に集中した取り組みがありました。追加-xform / input-validation、time / animations、svg / canvas-しかし、xHTML 2仕様への取り組みは、HTML 5機能に焦点を合わせました。つまり、xHTML 2が削除されたり、廃止されたりしたわけではありませんが、近い将来の予定はありません。
Mihai Stancu 2012

14
XHTMLは、Java Seam / JSF / Facelets開発で死んではいません。
ジョジョ

15
@Mihai Stancu-それは完全に正しくはありません。W3Cによると、HTML5にはXML構文があります。「HTML5に使用できるもう1つの構文はXMLです。この構文はXHTML1ドキュメントおよび実装と互換性があります。この構文を使用するドキュメントはXMLメディアタイプで提供する必要があり、要素はXML仕様で規定されている規則に従って、w3.org / 1999 / xhtml名前空間に配置されます。」
BrainSlugs83 2012年

回答:


585

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

多くのXHTMLページがXMLとして解析されることを意図していないことに注意してください。その場合、これは問題になりません。

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


48
「検証」だけではありません。ほとんどの厳密なXMLパーサーは、不正な文字にヒットしてもページを通過しません。それは単にW3Cを幸せにし、赤ではなく緑にすること以上のものです。
Loren Segal

40
&<文字を避ければ、CDATAセクションは必要ありません。HTMLとXHTMLの両方で正常に動作します。重要なコードをすべて外部スクリプトに入れ、インラインスクリプトを使用するなどして、簡単にこれを実現できます。変数を初期化します(必要に応じて、文字列リテラルで&/ <\x26/ \x3Cをエスケープします)。
ボビンス2009

23
HTML5の場合はどうですか?
Mathew Attlee、

5
@Mathew Attle-これは良い質問です。別のスレッドで質問して、必要な注意を引くようにしてください。
Alex KeySmith、2010年

3
@ローレン:それはまだ完全に検証についてです。ユーザーエージェントが無効なXMLを拒否する程度は直交しています。
オービットでの軽さのレース

231

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

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

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

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

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

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

12
コードの安全性の問題と同様に、ブロックコメントでCDATAを囲むことをお勧めします/* ... */。そうしないと、改行が削除されるとコードが壊れます
BryanH

最初のセクションの「... as XML」を「... as non-interpreted text」にすべきではありませんか?でstackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean私たちが見る「...これらの文字列は、データが含ま可能性が XMLマークアップとして解釈されますが、すべきではないの。」
マットウィルキー2017年

@mattwilkie、「XMLとして」とは、「ブラウザーがHTMLパーサーではなくXMLパーサーを使用してマークアップを解析する場合」です。これは、ドキュメントがXMLベースのMIMEタイプで送信されたか、マークアップを含むファイルにXMLベースのファイル拡張子」。
Shadow2531 2017

127

HTML

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

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

だから、HTMLで、これはない可能:

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

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

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

または類似。

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

XML

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

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

だから、XHTMLで、これはない可能:

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

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

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


2
「CDATAセクションはまったく効果がない」という記述は、構成を認識する(提案された)HTML5には当てはまりません。w3.org/TR/html5/syntax.html#cdata-sections
danorton

3
@danorton興味深い。それはかなり醜いミックスだと思います。ただし、スクリプトの内容には影響しません。
user123444555621 2012年

2
ことを知りませんでした任意の </内部のスクリプトタグは悪いです。
Salman A

3
@SalmanAこれはHTMLの奇妙な点の1つであり、正式にはETAGOと呼ばれています。詳細情報:mathiasbynens.be/notes/etagoを(何のブラウザが今までその機能を実装していないことを記事の状態ながら、私はそれが私のためにいくつかの問題を引き起こしたかなり確信しているかもしれないいくつかの他のツールインチ)
user123444555621

1
実際、私は検証の問題に遭遇しました-検証に<script>var b = "<b>bold</b>";</script>失敗しましたが、あなたの答えを読んで<script>var b = "<b>bold<\/b>";</script>修正した後
Salman A

30

基本的には、XHTMLとHTMLの両方であるドキュメントを記述できるようにすることです。問題は、XHTML内で、XMLパーサーがスクリプトタグ内の&、<、>文字を解釈し、XML解析エラーを引き起こすことです。したがって、次のようなエンティティを使用してJavaScriptを記述できます。

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

しかし、これは非現実的です。より大きな問題は、ページをHTMLで読み取る場合、タグスクリプトは「デフォルト」でCDATAと見なされ、そのようなJavaScriptが実行されないことです。したがって、XHTMLパーサーとHTMLパーサーの両方を使用して同じページをOKにする場合は、スクリプトタグをXHTMLのCDATA要素で囲む必要がありますが、HTMLで囲む必要はありません。

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


24

これはX(HT)MLです。あなたのような記号を使用する場合<>JavaScriptの内、例えば、2つの整数を比較するために、これは、XMLのように解析されなければならないので、彼らは、タグの開始または終了としてマークします。

CDATAは、以下の行(これまでのすべて]]>がXMLではないため、そのように解析してはならない)を意味します。


18

ではない HTML4にCDATAを使用していますがすべき XHTMLでCDATAを使用している必要がありますが、<や>などのエスケープ記号を持っている場合、XMLにCDATAを使用しています。


11
CDATAはHTML4では無効です。簡単に言えば、それは文法の一部ではありません。CDATAはXMLの構文であり、XHTMLはXMLサブセットです。したがって、XML(およびそのサブセット)内でのみ使用する必要があります。一方、HTMLはXMLではありません。
ローレンシーガル

17

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

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

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

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

あなたは学ぶことができ、ここでCDATAの詳細、およびここでXHTMLについての詳細を



9

XHTMLに厳密に準拠する場合は、CDATAが必要であり、アンパサンドが無効文字としてフラグ付けされないようにします。



8

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


6

CDATAは、中のコンテンツがXMLではないことを示します。




2

そうすれば、古いブラウザはJavaScriptコードを解析せず、ページは壊れません。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.