Коли необхідний розділ 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. Було зроблено зусилля, сконцентровані в xHTML 2.0, маючи намір висунути простори імен xform, xlink, time та svg у специфікацію як спосіб поліпшити ті самі можливості HTML 5 додавання - xform / input-валідація, час / анімації, svg / canvas - але зусилля для специфікації xHTML 2 були переорієнтовані на особливості HTML 5. Це не означає, що xHTML 2 було відхилено або застаріло, але це не планується найближчим часом.
Михай Станку

14
XHTML не мертвий у розробці Java Seam / JSF / Facelets.
JoJo

15
@Mihai Stancu - це не зовсім коректно. Відповідно до W3C, існує синтаксис XML для HTML5 : "Інший синтаксис, який можна використовувати для HTML5, - це XML. Цей синтаксис сумісний з документами та реалізаціями XHTML1. Документи, що використовують цей синтаксис, повинні подаватися з типом мультимедіа XML та необхідними елементами. розміщувати у просторі імен w3.org/1999/xhtml, дотримуючись правил, визначених специфікаціями XML. "
BrainSlugs83

Відповіді:


585

Розділ 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


48
У цьому набагато більше, ніж просто "перевірка". Більшість строгих XML-аналізаторів не перейдуть на сторінку, якщо вони потрапляють у незаконний символ. Це не просто про те, щоб зробити W3C щасливим та отримати зелений, а не червоний.
Лорен Сегал

40
Якщо ви уникаєте &і <символів, вам не потрібен розділ CDATA; він буде добре працювати як в HTML, так і в XHTML. Ви можете легко досягти цього, помістивши весь значний код у зовнішні сценарії та просто використовуючи вбудовані сценарії, наприклад. ініціалізувати змінні (уникнення &/ <до \x26/ \x3Cв рядкових літералах, якщо вам потрібно).
bobince

23
А як щодо випадку HTML5?
Метью Етлі

5
@Mathew Attle - це хороше питання. Будьте чудовим питанням, щоб задати окрему тему, щоб переконатися, що вона отримує потрібну їй увагу.
Алекс Кейсміт

3
@Loren: Тоді все ще йдеться про валідацію. Те, наскільки агент-користувач відхиляє недійсний XML, є ортогональним.
Гонки легкості на орбіті

231

Коли браузери розглядають розмітку як XML:

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

Коли браузери розглядають розмітку як HTML:

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

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

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

12
Що стосується безпеки коду, то краще оточувати свої CDATA блоковими коментарями, /* ... */оскільки в іншому випадку, якщо усунені розриви рядків, код порушиться
BryanH

чи не має "... як XML" у першому розділі бути "... як не інтерпретований текст"? У stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean ми бачимо "... ці рядки містять дані, які можна інтерпретувати як розмітку XML, але не повинні бути".
matt wilkie

@mattwilkie, що я маю на увазі під "як XML" - це "Коли браузери використовують свій XML-аналізатор (на відміну від HTML-аналізатора) для розбору розмітки, оскільки документ був надісланий типом mime на основі XML або у файлі, що містить розмітку. розширення файлу на основі XML ".
Shadow2531

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) використовують XML-аналізатор, лише якщо документ XHMTL подається з типом вмісту 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 Цікаво. Я думаю, що це досить потворна суміш. Все ж ніякого ефекту в вмісті скриптів немає.
користувач123444555621

2
Не знав, що будь-які </ теги всередині скрипту погані.
Салман А

3
@SalmanA Це одна з диваків HTML і офіційно називається ETAGO . Дізнайтеся більше: mathiasbynens.be/notes/etago (хоча стаття зазначає, що жоден браузер ніколи не реалізував цю функцію, я впевнений, що вона викликала у мене певну проблему. Можливо, в якомусь іншому інструменті)
user123444555621

1
Насправді я зіткнувся з проблемами перевірки - <script>var b = "<b>bold</b>";</script>не вдається перевірити, але після прочитання вашої відповіді та зміни до <script>var b = "<b>bold<\/b>";</script>її виправлення.
Салман

30

По суті, це дозволяти писати документ, що є і 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.


24

Це річ X (HT) ML. Якщо ви використовуєте такі символи, як <і >всередині JavaScript, наприклад, для порівняння двох цілих чисел, це потрібно було б розібрати як XML, таким чином вони будуть позначатися як початок або кінець тегу.

CDATA означає, що наступні рядки (все, що ]]>стосується не є XML, тому не повинні таким чином розбирати.


18

Як НЕ використовувати CDATA в HTML4 , але ви повинні використовувати CDATA в XHTML і повинні використовувати CDATA в XML , якщо у вас є неекрановані символи , такі як <і>.


11
CDATA недійсний у HTML4. Простіше кажучи, це не є частиною граматики. CDATA - синтаксис XML, а XHTML - це підмножина XML. Тому його слід використовувати лише всередині XML (та його підмножини). HTML з іншого боку не є XML.
Лорен Сегал

17

Це гарантує, що перевірка XHTML працює правильно, якщо у вас вбудований JavaScript на вашу сторінку, а не з посилання назовні.

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

З HTML-сторінок в Інтернеті ви можете просто включити необхідний JavaScript між і тегами. Коли ви перевіряєте HTML на своїй веб-сторінці, вміст JavaScript вважається CDATA (символьними даними), який ігнорується валідатором. Це ж не вірно, якщо ви дотримуєтеся останніх стандартів XHTML при створенні веб-сторінки. З XHTML код між тегами скрипту вважається PCDATA (синтаксичний аналіз даних символів), який обробляється валідатором.

Через це ви не можете просто включати JavaScript між тегами скриптів на своїй сторінці, не "порушуючи" веб-сторінку (принаймні, що стосується валідатора).

Ви можете дізнатися більше про CDATA тут , а більше про XHTML тут .



9

Коли ви збираєтесь суворо дотримуватися XHTML, вам потрібно CDATA так менше, а амперсандів не позначено як недійсні символи.



8

CDATA каже браузеру відображати текст таким, який є, а не відображати його як HTML.



5

CDATA необхідний у будь-якому діалекті XML, оскільки текст у вузлі XML розглядається як дочірній елемент, перш ніж його оцінювати як JavaScript. Це також причина, по якій JSLint скаржиться на <персонажа в регулярних виразах.

Список літератури



2

Таким чином, старший браузер не розбирає код Javascript, і сторінка не ламається.

Зворотна сумісність Треба любити це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.