17

特殊文字をエスケープせずに、スクリプトまたはCSSをXHTMLにインライン化したい。

CDATAでマークされたセクションを使用してそれを行うことができます。

http://www.w3.org/TR/xhtml1/#h-4.8によると、CDATAセクションは次のように定義できます。

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

次に、http://www.w3schools.com/TAGS/tag_script.aspによると、CDATAは次のようになります。

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

CDATAセクションを閉じるにはどちらの方法が適していますか?]]>または//]]>

4

4 に答える 4

34

www.w3.org/TR/xhtml1/#h-4.8 によると、CDATA セクションは次のように定義できます: [no //]

うん。XHTML では、それが可能です。application/xhtml+xmlIE 以外の Web ブラウザーにサービスを提供するときのように、XML パーサーによって読み取られる適切な XHTML 。

しかし、実際には としてサービスを提供している可能性があります。text/htmlこれは、そのセクションで言及されているように、ブラウザが「XML プロセッサ」ではないことを意味します。これは従来の HTML4 パーサーであるため、付録 C のガイドラインを順守し、HTML4 で機能しない XML 機能を使用しないようにする必要があります。

特に、またはブロック内の文字列<![CDATA[とは、HTML4 パーサーにとって特別なものではありません。HTML4 では、これらの 2 つの要素は「CDATA 要素」であり、マークアップが適用されないためです (要素自体を終了する ETAGO シーケンスを除く)。したがって、HTML4 パーサーはこれらの文字列を CSS または JavaScript エンジンに直接送信します。]]><script><style></

は有効な JS ではないため<![CDATA[、JavaScript 構文エラーが発生します。(他の回答はここでは間違っています。非常に古いブラウザだけでなく、すべての HTML4 ブラウザで、スクリプト内のコメントされていない CDATA セクションでエラーが発生します。)

//またはコメント マークアップを使用して/*、JavaScript または CSS エンジンからコンテンツを非表示にします。そう:

<script type="text/javascript">//<![CDATA[
    alert('a&b');
//]]></script>

(先頭の//; これは W3Schools のサンプル コードでは省略されていることに注意してください。これにより、そのサンプル コードがまったく機能しなくなります。失敗します。W3Schools を信用しないでください。W3Schools は W3C とは何の関係もありません。その素材はしばしばゴミです。)

これは、HTML パーサーによって次のように読み取られます。

  • script次の ETAGO まで CDATA コンテンツを確立するタグを開く
  • 文章//<![CDATA[\n alert('a&b');\n//]]>
  • ETAGOとクローズタグscript
  • -> JavaScript エンジンに送信される結果のコンテンツ://<![CDATA[\nalert('a&b');\n//]]>

ただし、XML パーサーでは次のようになります。

  • オープンタグscript(特別な解析の影響なし)
  • テキストの内容//
  • ]]>次のシーケンスまで CDATA コンテンツを確立する CDATA セクションを開く
  • 文章\n alert('a&b');\n//
  • CDATA セクションを閉じる
  • タグを閉じるscript
  • -> JavaScript エンジンに送信される結果のコンテンツ://\nalert('a&b');\n//

構文解析プロセスはかなり異なりますが、JS エンジンは、 のおかげで//唯一の違いはコメントであるため、いずれの場合も同じ効果的なコードになります。

これは古い学校とは非常に異なるケースであることに注意してください。

<script type="text/javascript"><!--
    alert('a&b');
//--></script>

<script>これは、スクリプト/スタイルのコンテンツを非表示にして、<style>タグを認識しないブラウザーでページに書き込まれないようにすることでした。これは JavaScript/CSS エラーを生成しません。これは、ハッキングが別のレベルに置かれたためです。これは、何もしないように定義された CSS および JavaScript 言語自体の構文上の機能であり、このハックが機能することを可能にします<!--

これらのブラウザは古い歴史です。今日、この手法を絶対に使用しないでください。特に XHTML では、XML パーサーがスクリプト ブロック全体を実行可能コードではなく XML コメントに変換して、あなたの言葉を解釈するためです。

特殊文字をエスケープせずに、スクリプトまたは CSS を xHTML にインライン化したい。

これを避けると、あなたはずっと幸せになります。

との文字が本当に必要ですか? いいえ、ほとんどありません。でそれらが本当に必要ですか? ええと...時々、ええ、そしてその場合、コメント付きのCDATAセクションは受け入れられます。<&<style><script>

しかし正直なところ、XHTML 互換性ガイドライン C.4 は XHTML1 と同様に HTML4 にも適用できます。

于 2010-03-03T23:11:21.537 に答える
3

ブラウザによって異なります。一部の人々の考えにもかかわらず、w3schools は W3C とは関係がないため、彼らのアドバイスは鵜呑みにしてはなりません。

最新のブラウザーは、CDATA セクションを認識できるはずです。MSIE OTOH はサポートしていませんが、XHTML をまったくサポートしていないため、問題ありません (MSIE との互換性のために、XHTML コンテンツを text/html として送信しているわけではありませんよね? それでは、XHTML を使用する意味はあまりありません。そもそも)。

問題は、XHTML を完全に理解していないブラウザーが CDATA ディレクティブを通常のテキストとして扱うことです。

tl;dr: 完全な下位互換性のあるソリューションは次のようになります。

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

それはただ反発的です。下位互換性を維持したい場合は JS ファイルに JS を貼り付けるか、MSIE 8 を無視する余裕ができるまで HTML に貼り付ける (MSIE 6 を避けるのに何年かかったかというと、2020 年頃になる可能性があります)。

HTML コメント ( <!-- -->) は、スクリプト タグを認識しないブラウザーにのみ必要です。CDATA セクションを理解しないブラウザー (つまり、MSIE のような非 XHTML ブラウザー) では、二重スラッシュが必要です。XHTML では、不正な形式の XML を回避するために CDATA セクションが必要です (たとえば、大なり比較や​​小なり比較を行うと、XML が破損したり、エスケープが必要になったりしますが、これもブラウザーの問題です)。

XHTML を text/html として送信する際の問題の詳細については、http: //hixie.ch/advocacy/xhtmlを参照してください。

編集:自分自身を修正するために、Hixie によると、後方サポートの完全な構文は実際には次のようになります。

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

ありがとう、アロッチ。

于 2010-03-03T21:53:55.497 に答える
1

//なしでそれを行うだけです。これらは、特定のブラウザー (名前のないままにする必要があります) を「だまされて」スクリプト タグの閉じ括弧を受け入れなければならなかった時代への逆戻りです。

于 2010-03-03T21:48:23.307 に答える
0

XHTML をまったく知らない非常に古いブラウザーを誰かが使用しているのではないかと心配な場合は、CDATA タグの前にコメントを入れることができます。ただし、開始タグの前にコメントを付けて、構文エラーが発生しないようにする必要があります。

<script type="text/javascript">
//<![CDATA[
  // some code
//]]>
</script>
于 2010-03-03T21:51:17.967 に答える