Подтвердить что ты не робот

Должен ли я использовать "]]>" или "//]]>" для закрытия раздела CDATA в xHTML

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

  • Open-tag script установление содержимого CDATA до следующего ETAGO
  • Текст //<![CDATA[\n alert('a&b');\n//]]>
  • ETAGO и тег-тег script
  • → результирующий контент, отправленный движку JavaScript: //<![CDATA[\nalert('a&b');\n//]]>

Но парсером XML как:

  • Open-tag 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, чтобы он не записывался на страницу в браузерах, которые не понимали теги <script> и <style>. Это не приведет к возникновению ошибки JavaScript/CSS, потому что взломанный был помещен на другой уровень: это синтаксическая особенность самих CSS и JavaScript-языков, для которых <!-- определенно ничего не делает, позволяя этому хаку работать.

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

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

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

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

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

Ответ 2

Зависит от браузера. Несмотря на то, что некоторые люди думают, 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 (<!-- -->) требуется только для браузеров, которые не понимают теги script. Для браузеров, которые не понимают разделы CDATA (т.е. Браузеры, отличные от XHTML, такие как MSIE), требуется двойная косая черта. Секция CDATA требуется для XHTML, чтобы избежать искаженного XML (например, сравнение более или менее, например, приведет к разрыву XML в противном случае или потребуется экранирование, что опять-таки проблема с браузером).

Для получения дополнительной информации о проблеме отправки XHTML в виде текста /html, прочитайте: http://hixie.ch/advocacy/xhtml

EDIT: Чтобы исправить себя, полный синтаксис для обратной поддержки на самом деле был бы таким, как указано в Hixie:

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

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

Ответ 3

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

Ответ 4

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

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