Должен ли я использовать "]]>" или "//]]>" для закрытия раздела CDATA в xHTML - PullRequest
17 голосов
/ 04 марта 2010

Я хочу встроить скрипты или 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 ]

33 голосов
/ 04 марта 2010

Согласно www.w3.org/TR/xhtml1/#h-4.8 раздел CDATA может быть определен как: [нет //]

Да.В XHTML они могут.Правильный XHTML, читаемый синтаксическим анализатором XML, например, когда вы обслуживаете application/xhtml+xml в веб-браузере, отличном от IE.

Но, возможно, вы на самом деле используете text/html, что означает, что ваш браузер не '«Процессор XML», как указано в этом разделе.Это унаследованный парсер HTML4, поэтому вы должны соблюдать рекомендации к приложению C и избегать любых функций XML, которые не работают в HTML4.

В частности, строки <![CDATA[и ]]> в блоке <script> или <style> не являются специальными для анализатора HTML4, поскольку в HTML4 эти два элемента являются «элементами CDATA», где разметка неприменима (за исключением последовательности </ ETAGO до концасам элемент).Поэтому анализатор HTML4 отправит эти строки прямо в движок CSS или JavaScript.

Поскольку <![CDATA[ не является допустимым JS, вы получите синтаксическую ошибку JavaScript.(Другие ответы здесь неверны: это не только очень старые браузеры , но и все браузеры HTML4, которые будут выдавать ошибки для некомментированного раздела CDATA в скрипте.)

Вы используете // или /* комментарий, чтобы скрыть содержимое от движка JavaScript или CSS.Итак:

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

(Обратите внимание на начальный //; это было опущено в примере кода W3Schools и делает этот пример кода вообще не работающим. Неудача. Не доверяйте W3Schools: они ничтоделать с W3C, и их материал часто является мусором.)

Это читается анализатором HTML как:

  • Открытый тег script, устанавливающий содержимое CDATA до следующего ETAGO
  • Текст //<![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 завершается тем же эффективнымОда в каждом случае, так как благодаря // s единственная разница в комментариях.

Обратите внимание, что это совсем другой случай для старой школы:

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

который должен был скрыть содержимое скрипта / стиля, чтобы оно не попадало на страницу в браузерах, которые не понимали теги <script> и <style>.Это не сгенерирует ошибку JavaScript / CSS, потому что хак был переведен на другой уровень: это синтаксическая особенность языков CSS и JavaScript самих , которые <!-- определены, чтобы ничего не делать, позволяяэтот взлом на работу.

Эти браузеры - древняя история;Вы абсолютно не должны использовать эту технику сегодня.Особенно в XHTML, так как синтаксический анализатор XML поможет вам в вашем слове, превратив весь блок сценария в комментарий XML вместо исполняемого кода.

Я хочу встроить сценарии или CSS в xHTML без экранирования специальных

Избегайте этого, и вы будете намного счастливее.

Вам действительно нужны символы < и & в * 1100?*?Нет, почти никогда.Вы действительно нуждаетесь в них в <script>?Ну ... иногда да, и в этом случае раздел с комментариями-CDATA является приемлемым.

Но, если честно, руководство по совместимости XHTML C.4 применимо как к HTML4, так и к XHTML1: всенетривиальным должен быть внешний скрипт, и вам не нужно беспокоиться об этом.

3 голосов
/ 04 марта 2010

Зависит от браузера. Несмотря на то, что некоторые люди думают, что w3schools не имеет отношения к W3C, поэтому их совет следует принимать с недоверием.

Современные браузеры должны распознавать разделы CDATA. MSIE OTOH этого не делает, но это нормально, потому что он вообще не поддерживает XHTML (вы не отправляете контент XHTML в виде text / html для совместимости с MSIE, не так ли? Тогда не было бы особого смысла использовать XHTML в первую очередь).

Проблема в том, что браузеры, которые не полностью понимают XHTML, будут воспринимать директивы CDATA как обычный текст.

tl; dr: полное обратно-совместимое решение будет выглядеть примерно так:

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

Это просто отвратительно. Либо вставьте свой JS в файлы JS, если вы хотите сохранить обратную совместимость, либо придерживайтесь HTML, пока вы не можете позволить себе игнорировать MSIE 8 (что из-за того, сколько лет потребовалось людям, чтобы избежать MSIE 6, может быть примерно до 2020 года).

Комментарий HTML (<!-- -->) требуется только для браузеров, которые не понимают теги скрипта. Двойная косая черта требуется для браузеров, которые не понимают разделы CDATA (то есть браузеры не-XHTML, такие как MSIE). Раздел CDATA необходим для XHTML, чтобы избежать искаженного XML (например, сравнение с большим или меньшим, иначе нарушило бы XML или потребовало экранирования, что снова является проблемой браузера).

Подробнее о проблеме с отправкой XHTML в виде text / html читайте: http://hixie.ch/advocacy/xhtml

РЕДАКТИРОВАТЬ: Чтобы исправить себя, полный синтаксис для обратной поддержки будет на самом деле, согласно Хикси:

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

Спасибо, Алохчи.

1 голос
/ 04 марта 2010

Я бы просто сделал это без //. Это возврат к временам, когда определенные браузеры (которые должны остаться безымянными) должны были быть «одурачены», чтобы принять закрывающие скобки в тегах скрипта.

0 голосов
/ 04 марта 2010

Вы можете поместить комментарии перед тегами CDATA, если вы беспокоитесь, что кто-то использует очень старый браузер, который вообще не знает о XHTML. Но затем вы должны поставить комментарий перед начальным тегом, чтобы он не вызывал синтаксическую ошибку:

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