Kiedy sekcja znacznika CDATA jest niezbędna w znaczniku skryptu?

907

Czy znaczniki CDATA są kiedykolwiek potrzebne w znacznikach skryptów, a jeśli tak, to kiedy?

Innymi słowy, kiedy i gdzie to jest:

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

lepiej niż to:

<script type="text/javascript">
...code...
</script>
ćwiek
źródło
18
Teraz, gdy XHTML jest zasadniczo martwy, czy nie jest to już istotny problem?
allyourcode
80
@allyourcode: co sprawia, że ​​uważasz, że XHTML nie żyje? HTML5? Jest XHTML5 do zrobienia z nim :)
Doktor J
4
@DoktorJ AFAIK xHTML był w wersji 1. Jest to odpowiednik HTML w wersji 4. Podjęto wysiłek skoncentrowany na xHTML 2.0, który miał na celu przesunięcie przestrzeni nazw xform, xlink, time i svg do specyfikacji w celu ulepszenia tych samych funkcji HTML 5 dodawanie - sprawdzanie poprawności xform / input, time / animations, svg / canvas - ale wysiłki dla specyfikacji xHTML 2 zostały skoncentrowane na funkcjach HTML 5. Nie oznacza to, że xHTML 2 został porzucony lub stał się przestarzały, ale nie jest to planowane w najbliższej przyszłości.
Mihai Stancu
14
XHTML nie jest martwy w rozwoju Java Seam / JSF / Facelets.
JoJo
15
@ Mihai Stancu - to nie do końca poprawne. Według W3C istnieje składnia XML dla HTML5 : „Inną składnią, której można użyć dla HTML5, jest XML. Ta składnia jest kompatybilna z dokumentami i implementacjami XHTML1. Dokumenty korzystające z tej składni muszą być dostarczane z typem nośnika XML, a elementy wymagają do umieszczenia w przestrzeni nazw w3.org/1999/xhtml zgodnie z regułami określonymi w specyfikacjach XML. ”
BrainSlugs83

Odpowiedzi:

585

Sekcja CDATA jest wymagana, jeśli potrzebujesz, aby Twój dokument był analizowany jako XML (np. Gdy strona XHTML jest interpretowana jako XML) i chcesz mieć możliwość pisania literału i<10i a && bzamiast, i&lt;10aa &amp;&amp; b ponieważ XHTML będzie analizował kod JavaScript jako analizowane dane znakowe w przeciwieństwie do danych znaków domyślnie. Nie jest to problem ze skryptami przechowywanymi w zewnętrznych plikach źródłowych, ale dla każdego wbudowanego JavaScript w XHTML prawdopodobnie będziesz chciał użyć sekcji CDATA.

Zauważ, że wiele stron XHTML nigdy nie było analizowanych jako XML, w którym to przypadku nie będzie problemu.

Dobry opis na ten temat można znaleźć na stronie https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm

Michael Ridley
źródło
48
Jest o wiele więcej niż tylko „walidacja”. Większość ścisłych parserów XML nie przejdzie przez stronę, jeśli trafi niedozwolony znak. To coś więcej niż tylko uszczęśliwienie W3C i stawanie się zielonym zamiast czerwonym.
Loren Segal,
40
Jeśli uniknąć &i <znaków, nie trzeba sekcji CDATA; będzie działać dobrze zarówno w HTML, jak i XHTML. Możesz to łatwo osiągnąć, umieszczając cały znaczący kod w zewnętrznych skryptach i po prostu używając skryptów wbudowanych np. zainicjuj zmienne ( jeśli potrzebujesz, wstawianie znaków ucieczki &/ <do \x26/ \x3Cw literałach łańcuchowych).
bobince
23
A co z HTML5?
Mathew Attlee,
5
@Mathew Attle - to dobre pytanie. Świetnie zadaj pytanie w osobnym wątku, aby zapewnić sobie potrzebną uwagę.
Alex KeySmith,
3
@Loren: Zatem nadal chodzi wyłącznie o sprawdzanie poprawności. Zakres, w jakim klient użytkownika odrzuca nieprawidłowy kod XML, jest ortogonalny.
Wyścigi lekkości na orbicie
231

Gdy przeglądarki traktują znaczniki jako XML:

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

Gdy przeglądarki traktują znaczniki jako HTML:

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

Gdy przeglądarki traktują znaczniki jako HTML i chcesz, aby znaczniki XHTML 1.0 (na przykład) były sprawdzane.

<script>
//<![CDATA[
    ...code...
//]]>
</script>
Shadow2531
źródło
12
Ze względów bezpieczeństwa kodu lepiej jest otaczać CDATA komentarzami blokowymi, /* ... */ponieważ w przeciwnym razie usunięcie
podziałów
nie powinno być „... jako XML” w pierwszej części „… jako tekst nieinterpretowany”? W stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean widzimy „... te ciągi zawierają dane, które mogą być interpretowane jako znaczniki XML, ale nie powinny.”
matt wilkie
@mattwilkie, co mam na myśli przez „jako XML” to „Kiedy przeglądarki używają swojego parsera XML (w przeciwieństwie do parsera HTML) do analizowania znaczników, ponieważ dokument został wysłany z typem MIME opartym na XML lub plik zawierający znacznik ma rozszerzenie pliku oparte na XML ”.
Shadow2531
127

HTML

Parser HTML potraktuje wszystko pomiędzy <script>i </script>jako część skryptu. Niektóre implementacje nawet nie wymagają poprawnego tagu zamykającego; zatrzymują interpretację skryptu na „ </”, co jest poprawne zgodnie ze specyfikacją .

Aktualizacja W HTML5 i przy obecnych przeglądarkach tak już nie jest.

W HTML nie jest to możliwe:

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

CDATASekcja ma żadnego efektu . Dlatego musisz pisać

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

lub podobne.

Dotyczy to również plików XHTML obsługiwanych jako text/html. (Ponieważ IE nie obsługuje typów treści XML, jest to w większości prawdą).

XML

W XML obowiązują inne reguły. Uwaga: przeglądarki (inne niż IE) używają analizatora składni XML tylko wtedy, gdy dokument XHMTL jest obsługiwany z typem treści XML.

Dla parsera XML scriptznacznik nie jest lepszy niż jakikolwiek inny znacznik. W szczególności węzeł skryptowy może zawierać nietekstowe węzły potomne, uruchamiane przez „ <”; a znak „ &” oznacza byt postaci.

W XHTML nie jest to możliwe:

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

Aby obejść ten problem, możesz zawinąć cały skrypt w CDATAsekcję. Mówi to parserowi: „W tej sekcji nie traktuj„ <”i„ &”jako znaków kontrolnych .” Aby uniemożliwić silnikowi JavaScript interpretację znaków „ <![CDATA[” i „ ]]>”, możesz zawinąć je w komentarze.

Jeśli twój skrypt nie zawiera żadnych „ <” ani „ &”, i tak nie potrzebujesz żadnej CDATAsekcji.

użytkownik123444555621
źródło
2
Stwierdzenie „Sekcja CDATA nie ma żadnego wpływu” nie jest prawdziwe w przypadku (proponowanego) HTML5, który rozpoznaje konstrukcję. w3.org/TR/html5/syntax.html#cdata-sections
danorton
3
@danorton Ciekawe. Myślę, że to dość brzydka mieszanka. Nadal jednak nie ma wpływu na treść skryptu.
user123444555621,
2
Nie wiedziałem, że jakiekolwiek </ wewnętrzne tagi skryptu są złe.
Salman A
3
@SalmanA To jedna z osobliwości HTML i oficjalnie nazywa się ETAGO . Dowiedz się więcej: mathiasbynens.be/notes/etago (podczas gdy artykuł mówi, że żadna przeglądarka nigdy nie implementowała tej funkcji, jestem pewien, że spowodowało to dla mnie pewne problemy. Może w jakimś innym narzędziu)
user123444555621
1
Właściwie natknąłem się na problemy z weryfikacją - <script>var b = "<b>bold</b>";</script>nie można zweryfikować, ale po przeczytaniu twojej odpowiedzi i zmianie na <script>var b = "<b>bold<\/b>";</script>naprawioną.
Salman A
30

Zasadniczo pozwala on napisać dokument, który jest zarówno XHTML, jak i HTML. Problem polega na tym, że w XHTML parser XML interpretuje znaki &, <,> w znaczniku skryptu i powoduje błąd analizy XML. Możesz więc napisać JavaScript przy pomocy encji, np .:

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

Ale to jest niepraktyczne. Większy problem polega na tym, że jeśli czytasz stronę w HTML, skrypt znacznika jest domyślnie uznawany za CDATA i taki JavaScript nie będzie działał. Dlatego jeśli chcesz, aby ta sama strona działała poprawnie zarówno przy użyciu parserów XHTML, jak i HTML, musisz umieścić znacznik skryptu w elemencie CDATA w XHTML, ale NIE należy go umieszczać w HTML.

Ta sztuczka oznacza początek elementu CDATA jako komentarz JavaScript; w HTML parser JavaScript ignoruje znacznik CDATA (jest to komentarz). W XHTML parser XML (uruchamiany przed JavaScript) wykrywa go i traktuje resztę do końca CDATA jako CDATA.

ondra
źródło
24

To jest X (HT) ML. Gdy używasz symboli takich jak <i >wewnątrz JavaScript, np. Do porównywania dwóch liczb całkowitych, musiałoby to zostać przeanalizowane jak XML, a zatem oznaczałoby to początek lub koniec znacznika.

CDATA oznacza, że ​​następujące wiersze (wszystko do ]]>pliku nie jest XML i dlatego nie powinny być analizowane w ten sposób.

Franz
źródło
18

Czy nie używać CDATA w HTML4 ale należy użyć CDATA w XHTML i musi użyć CDATA w XML, jeśli masz kodów zmiany znaczenia symboli, takich jak <i>.

Loren Segal
źródło
11
CDATA nie jest poprawny w HTML4. Mówiąc wprost, nie jest to część gramatyki. CDATA to składnia XML, a XHTML to podzbiór XML. Dlatego należy go używać tylko wewnątrz XML (i jego podzbiorów). Z drugiej strony HTML nie jest XML.
Loren Segal
17

Ma to na celu zapewnienie, że sprawdzanie poprawności XHTML działa poprawnie, gdy JavaScript jest osadzony na stronie, a nie zewnętrznie.

XHTML wymaga, aby strona była ściśle zgodna z wymaganiami znaczników XML. Ponieważ JavaScript może zawierać znaki o specjalnym znaczeniu, musisz owinąć go w CDATA, aby upewnić się, że sprawdzanie poprawności nie oznaczy go jako zniekształcony.

Dzięki stronom HTML w Internecie możesz po prostu dołączyć wymagany kod JavaScript pomiędzy i tagi. Podczas sprawdzania poprawności kodu HTML na stronie internetowej zawartość JavaScript jest uważana za CDATA (dane znakowe), dlatego jest ona ignorowana przez weryfikator. To samo nie jest prawdą, jeśli postępujesz zgodnie z najnowszymi standardami XHTML podczas konfigurowania strony internetowej. W przypadku XHTML kod między znacznikami skryptu jest traktowany jako PCDATA (parsowane dane znakowe), który jest zatem przetwarzany przez walidator.

Z tego powodu nie można po prostu umieszczać JavaScript między znacznikami skryptu na stronie bez „uszkodzenia” strony internetowej (przynajmniej jeśli chodzi o weryfikator).

Możesz dowiedzieć się więcej o CDATA tutaj , a więcej o XHTML tutaj .

LBushkin
źródło
10

CDATA wskazuje, że zawarta w nim zawartość nie jest XML.

Oto wyjaśnienie na Wikipedii

Alex Beardsley
źródło
9

Jeśli dążysz do ścisłej zgodności z XHTML, potrzebujesz CDATA, więc mniej niż i znaki ampersand nie są oznaczane jako nieprawidłowe znaki.

Chris Shaffer
źródło
8

aby uniknąć błędów xml podczas sprawdzania poprawności xhtml.

gehsekky
źródło
8

CDATA mówi przeglądarce, aby wyświetlała tekst w obecnej postaci i nie renderowała go jako HTML.

Ikaso
źródło
6

CDATA wskazuje, że zawarta w nim zawartość nie jest XML.

Jim
źródło
2

W ten sposób starsza przeglądarka nie analizuje kodu JavaScript, a strona się nie psuje.

Kompatybilność wsteczna. Uwielbiam to.

Tyler Carter
źródło