Когда необходим раздел CDATA в теге скрипта?

Нужны ли теги CDATA в тегах скриптов, и если да, то когда?

Другими словами, когда и где это:

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

предпочтительнее этого:

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

Теперь, когда XHTML практически мертв, разве это больше не актуально?

allyourcode 31.01.2012 01:49

@allyourcode: почему вы думаете, что XHTML мертв? HTML5? Вместе с этим есть XHTML5 :)

Doktor J 22.02.2012 18:42

@DoktorJ AFAIK xHTML был в версии 1. Его эквивалентом в HTML была версия 4. В xHTML 2.0 были сосредоточены усилия, направленные на включение пространств имен xform, xlink, time и svg в спецификацию для улучшения тех же функций, что и в HTML 5. добавление - xform / input-validation, time / animations, svg / canvas - но усилия по спецификации xHTML 2 были переориентированы на функции HTML 5. Это не означает, что xHTML 2 был исключен или стал устаревшим, но это не планируется в ближайшем будущем.

Mihai Stancu 03.08.2012 15:08

XHTML не умер в разработке Java Seam / JSF / Facelets.

JoJo 31.08.2012 00:03

@Mihai Stancu - это не совсем правильно. Согласно W3C существует Синтаксис XML для HTML5: «Другой синтаксис, который можно использовать для HTML5, - это XML. Этот синтаксис совместим с документами и реализациями XHTML1. Документы, использующие этот синтаксис, должны обслуживаться с типом мультимедиа XML, а элементы должны быть помещены в пространстве имен w3.org/1999/xhtml в соответствии с правилами, установленными спецификациями XML ".

BrainSlugs83 11.10.2012 04:03

@allyourcode: Mate XHTML сейчас является предпочтительным, и он не мертв. HTML должен быть мертв, за исключением того, что беспорядочные кодеры не смогут работать.

ekerner 10.08.2013 09:31

@allyourcode мои военные заказчики в Великобритании только что перешли с IE6 на IE8 после пяти лет криков на них. Если XHTML мертв, мне нужно большое весло, чтобы выбраться из этого ручья. Автообновляющиеся браузеры не используются многими крупными корпорациями (к сожалению).

EvilDr 17.09.2014 11:36

@EvilDr Но IE8 еще не поддерживает XHTML. Когда появится IE9, вы сможете использовать XHTML! Да!

Mr Lister 06.08.2015 15:42

@DoktorJ Я сомневаюсь, что XHTML5 станет популярным. ИМО, XHTML изжил себя.

Hugo Zink 29.09.2015 14:31

SVG жив и здоров и требует объявлений CDATA для любого внутреннего ecmascript, который включает <и &.

brennanyoung 02.04.2019 17:03

Чтобы доказать, что XHTML не мертв, посетите этот сайт. Это настоящий настоящий XHTML-сайт (!)

Jack Giffin 29.02.2020 19:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
926
11
359 475
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Когда вы стремитесь к строгому соответствию XHTML, вам понадобится CDATA, чтобы меньше чем и амперсанды не помечались как недопустимые символы.

Ответ принят как подходящий

Раздел CDATA необходим, если вам нужно, чтобы ваш документ анализировался как XML (например, когда страница XHTML интерпретируется как XML) и вы хотите иметь возможность писать буквальные i<10 и a && b вместо i&lt;10 и a &amp;&amp; b, поскольку XHTML будет анализировать код JavaScript как проанализированные символьные данные, а не как символьные данные по умолчанию. Это не проблема со сценариями, которые хранятся во внешних исходных файлах, но для любого встроенного JavaScript в XHTML вы наверное захотите использовать раздел CDATA.

Обратите внимание, что многие страницы XHTML никогда не предназначались для анализа как XML, и в этом случае это не будет проблемой.

Для хорошей рецензии на эту тему см. https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm

Это гораздо больше, чем просто «проверка». Самые строгие парсеры XML не пройдут страницу, если обнаружат недопустимый символ. Это больше, чем просто сделать W3C счастливым и получить зеленый цвет вместо красного.

Loren Segal 16.09.2008 00:58

Если вы избегаете символов & и <, вам не нужен раздел CDATA; он будет отлично работать как в HTML, так и в XHTML. Вы можете легко добиться этого, поместив весь значимый код во внешние сценарии и просто используя встроенные сценарии, например. инициализировать переменные (экранирование от & / < до \x26 / \x3C в строковых литералах, если вам нужно).

bobince 20.09.2009 13:10

А как насчет HTML5?

Mathew Attlee 02.12.2009 14:44

@ Мэтью Эттл - это хороший вопрос. Хороший вопрос - задать его в отдельной беседе, чтобы убедиться, что он получит необходимое внимание.

Alex KeySmith 06.11.2010 22:01

@Loren: Значит, дело все еще в валидации. Степень, в которой пользовательский агент отклоняет недопустимый XML, ортогональна.

Lightness Races in Orbit 09.06.2011 22:09

@chief: неверно, html5 содержит диалект xhtml, включенный за счет обслуживания его с типом mime xhtml (для локальных файлов это окончание файла .xhtml)

flying sheep 13.01.2012 02:52

что вы имеете в виду под анализируемыми данными и символьными данными?

PositiveGuy 04.06.2012 22:09

@ Мэтью Эттли: Согласно W3C, есть синтаксис XML для HTML5. При использовании синтаксиса XML случай будет таким же.

BrainSlugs83 11.10.2012 04:06

Символьные данные @CoffeeAddict представляют собой обычный текст. Что-то вроде &quot;</script> используется как есть. Анализируемые данные анализируются как HTML (или XML): &quot;</script> интерпретируется как ", а затем синтаксический анализатор прекращает синтаксический анализ, поскольку обнаруживает конечный тег.

Mr Lister 15.04.2014 15:01

@MathewAttlee в этом нет необходимости для HTML5.

Sanjib Debnath 05.04.2018 09:53

Многие комментарии о том, что XHTML мертв, вводят в заблуждение, потому что существуют различные другие широко используемые XML-форматы, некоторые из которых де-факто являются частями HTML5. Например, вам все еще нужен CDATA для элементов скрипта внутри SVG, потому что SVG - это XML.

brennanyoung 02.04.2019 17:11

Из заархивированной ссылки на about.com: "<!-- // hide from really old browsers that noone uses anymore"; ^ D

ruffin 28.07.2020 22:01

нет использует CDATA в HTML4, но вы должен используете CDATA в XHTML, а должен используете CDATA в XML, если у вас есть неэкранированные символы, такие как <и>.

CDATA недействителен в HTML4. Проще говоря, это не часть грамматики. CDATA - это синтаксис XML, а XHTML - это подмножество XML. Поэтому его следует использовать только внутри XML (и его подмножеств). С другой стороны, HTML - это не XML.

Loren Segal 30.08.2010 07:59

Когда браузеры обрабатывают разметку как XML:

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

Когда браузеры обрабатывают разметку как HTML:

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

Когда браузеры обрабатывают разметку как HTML и вы хотите, чтобы разметка XHTML 1.0 (например) проверялась.

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

Так же, как вопрос безопасности кода, лучше окружить ваши CDATA комментариями блока /* ... */, потому что в противном случае, если разрывы строк будут удалены, код сломается.

BryanH 03.11.2015 23:05

не должно ли "... как XML" в первом разделе быть "... как неинтерпретируемый текст"? В stackoverflow.com/questions/2784183/what-does-cdata-in-xml-m‌ ean мы видим: «... эти строки включают данные, которые мог интерпретировать как разметку XML, но не должны».

matt wilkie 31.01.2017 23:38

@mattwilkie, Под «как XML» я подразумеваю: «Когда браузеры используют свой анализатор XML (в отличие от анализатора HTML) для анализа разметки, потому что документ был отправлен с типом mime на основе XML или файл, содержащий разметку, имеет расширение файла на основе XML ".

Shadow2531 01.02.2017 15:07

HTML

Анализатор HTML будет рассматривать все, что находится между <script> и </script>, как часть сценария. Некоторым реализациям даже не нужен правильный закрывающий тег; они останавливают интерпретацию сценария на "</", что правильно согласно спецификации.

Update In HTML5, and with current browsers, that is not the case anymore.

Итак, в HTML это возможно нет:

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

Раздел CDATA имеет никакого эффекта. Вот почему вам нужно написать

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

или похожие.

Это также относится к файлам XHTML, обслуживаемым как text/html. (Поскольку IE не поддерживает типы содержимого XML, это в основном верно.)

XML

В XML применяются другие правила. Обратите внимание, что браузеры (не IE) используют синтаксический анализатор XML, только если документ XHMTL обслуживается с типом содержимого XML.

Для синтаксического анализатора XML тег script ничем не лучше любого другого тега. В частности, узел сценария может содержать нетекстовые дочерние узлы, запускаемые «<»; а знак «&» обозначает символьный объект.

Итак, в XHTML это возможно нет:

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

Чтобы обойти это, вы можете обернуть весь скрипт в раздел CDATA. Это сообщает синтаксическому анализатору: «В этом разделе не обрабатывайте "<" и "&" как управляющие символы». Чтобы механизм JavaScript не интерпретировал метки «<![CDATA[» и «]]>», вы можете заключить их в комментарии.

Если ваш сценарий не содержит «<» или «&», вам в любом случае не нужен раздел CDATA.

Утверждение «Секция CDATA вообще не действует» неверно для (предлагаемого) HTML5, который распознает конструкцию. w3.org/TR/html5/syntax.html#cdata-sections

danorton 07.03.2012 00:29

@danorton Интересно. Я думаю, что это довольно уродливая смесь. Однако по-прежнему не влияет на содержимое сценария.

user123444555621 07.03.2012 02:06

Вау, я думал, что иметь сценарии как PCDATA в XHTML было громоздко и бессмысленно; не думал о том, что произойдет, если использовать "</script>", если это будет CDATA, как в HTML4. Обожаю XHTML :)

Hawken 12.05.2012 23:38
diveintohtml5.info/past.html#xhtml Apparently not all XHTML is made (or served) equal.
jinglesthula 18.05.2012 22:55

Не знал, что любой</ внутри тегов скрипта - это плохо.

Salman A 05.03.2013 22:38

@SalmanA Это одна из странностей HTML и официально называется ЭТАГО. Подробнее: mathiasbynens.be/notes/etago (хотя в статье говорится, что ни один браузер никогда не реализовывал эту функцию, я почти уверен, что это вызвало у меня проблемы. Может быть, в каком-то другом инструменте)

user123444555621 06.03.2013 00:35

На самом деле я столкнулся с проблемами проверки - <script>var b = "<b>bold</b>";</script> не проходит проверку, но после прочтения вашего ответа и перехода на <script>var b = "<b>bold</b>";</script> он исправлен.

Salman A 06.03.2013 01:52

чтобы избежать ошибок xml во время проверки xhtml.

Таким образом, старый браузер не анализирует код Javascript, и страница не ломается.

Обратная совместимость. Должен любить это.

CDATA сообщает браузеру отображать текст как есть, а не отображать его как HTML.

Это X (HT) ML. Когда вы используете такие символы, как < и > в JavaScript, например для сравнения двух целых чисел это должно быть проанализировано как XML, поэтому они будут отмечены как начало или конец тега.

CDATA означает, что следующие строки (все до ]]> не являются XML и, следовательно, не должны анализироваться таким образом.

CDATA указывает, что содержимое не является XML.

Вот объяснение по википедия

Это необходимо для того, чтобы проверка XHTML работала правильно, если на вашей странице есть встроенный JavaScript, а не внешние ссылки.

XHTML требует, чтобы ваша страница строго соответствовала требованиям разметки XML. Поскольку JavaScript может содержать символы со специальным значением, вы должны заключить его в CDATA, чтобы проверка не пометила его как искаженный.

With HTML pages on the web you can just include the required JavaScript between and tags. When you validate the HTML on your web page the JavaScript content is considered to be CDATA (character data) that is therefore ignored by the validator. The same is not true if you follow the more recent XHTML standards in setting up your web page. With XHTML the code between the script tags is considered to be PCDATA (parsed character data) which is therefore processed by the validator.

Because of this, you can't just include JavaScript between the script tags on your page without 'breaking' your web page (at least as far as the validator is concerned).

Вы можете изучить подробнее о CDATA здесь и подробнее о XHTML здесь.

В основном это позволяет писать документ, который является одновременно XHTML и HTML. Проблема в том, что в XHTML синтаксический анализатор XML интерпретирует символы &, <,> в теге сценарий и вызывает ошибку синтаксического анализа XML. Итак, вы можете написать свой JavaScript с объектами, например:

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

Но это непрактично. Более серьезная проблема заключается в том, что если вы читаете страницу в HTML, тег сценарий считается CDATA «по умолчанию», и такой JavaScript не запускается. Следовательно, если вы хотите, чтобы одна и та же страница была в порядке при использовании парсеров XHTML и HTML, вам необходимо заключить тег сценарий в элемент CDATA в XHTML, но НЕ заключать его в HTML.

Этот трюк отмечает начало элемента CDATA как комментарий JavaScript; в HTML парсер JavaScript игнорирует тег CDATA (это комментарий). В XHTML синтаксический анализатор XML (который запускается перед JavaScript) обнаруживает его и обрабатывает остальное до конца CDATA как CDATA.

CDATA необходим на любом диалекте XML, потому что текст в узле XML обрабатывается как дочерний элемент до того, как он будет оценен как JavaScript. Это также причина того, почему JSLint жалуется о символе < в регулярных выражениях.

Рекомендации

CDATA указывает, что содержимое не является XML.

Другие вопросы по теме