Kiedy w znaczniku script potrzebna jest sekcja CDATA?

Czy znaczniki CDATA są konieczne w znacznikach skryptu i jeśli tak, to kiedy?

Innymi słowy, kiedy i gdzie jest to:

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

]}

<script type="text/javascript">
...code...
</script>
Author: Shog9, 2008-09-16

15 answers

Sekcja CDATA jest wymagana, jeśli chcesz, aby twój dokument był analizowany jako XML (np. gdy strona XHTML jest interpretowana jako XML) i chcesz mieć możliwość zapisu literałów i<10 i a && b zamiast i&lt;10 i a &amp;&amp; b, ponieważ XHTML będzie przetwarzał kod JavaScript jako przetwarzane dane znaków, a nie dane 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 będziesz prawdopodobnie chciał użyć CDATA sekcja.

Zauważ, że wiele stron XHTML nigdy nie miało być przetwarzanych jako XML w takim przypadku nie będzie to problemem.

Aby dowiedzieć się więcej na ten temat, zobacz http://javascript.about.com/library/blxhtml.htm

 552
Author: Michael Ridley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-06 13:39:19

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 twój znacznik XHTML 1.0 (na przykład) został zweryfikowany.

<script>
//<![CDATA[
    ...code...
//]]>
</script>
 224
Author: Shadow2531,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 20:58:56

HTML

Parser HTML będzie traktował wszystko pomiędzy <script> i </script> jako część skryptu. niektóre implementacje nie potrzebują nawet poprawnego znacznika zamykającego; zatrzymują interpretację skryptu na "</", co jest poprawne zgodnie ze specyfikacją .

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

Więc w HTML jest to a nie możliwe:

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

A CDATA sekcja ma brak efektu . Dlatego musisz napisać

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

Lub podobne.

Dotyczy to również plików XHTML serwowanych jako text/html. (Ponieważ IE nie obsługuje typów treści XML, jest to głównie prawda.)

XML

W XML obowiązują różne reguły. Należy zauważyć, że przeglądarki (inne niż IE) używają parsera XML tylko wtedy, gdy dokument XHMTL jest obsługiwany z typem zawartości XML.

Dla parsera XML znacznik script nie jest lepszy niż jakikolwiek inny znacznik. W szczególności węzeł skryptowy może zawierać nietekstowe węzły potomne, wyzwalane przez "<"; A znak" & " oznacza encję znakową.

Więc w XHTML jest to a nie możliwe:

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

Aby obejść ten problem, możesz zawinąć cały skrypt w CDATA sekcję. To mówi parserowi: 'w tej sekcji nie traktuj "< " i "& " jako znaków kontrolnych.'Aby uniemożliwić silnikowi JavaScript interpretację znaków" <![CDATA[ " i " ]]>", możesz je owinąć w komentarze.

Jeśli Twój skrypt nie zawiera żadnych "<" ani "&", i tak nie potrzebujesz sekcji CDATA.

 117
Author: user123444555621,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 16:23:18

Zasadniczo jest to umożliwienie napisania dokumentu, który jest zarówno XHTML, jak i HTML. Problem polega na tym, że w XHTML parser XML zinterpretuje znaki&, w znaczniku skryptu i spowoduje błąd parsowania XML. Możesz więc pisać swój JavaScript z encjami, np.:

if (a &gt; b) alert('hello world');
Ale to niepraktyczne. Większy problem polega na tym, że jeśli czytasz stronę w HTML, tag skrypt {[3] } jest uważany za CDATA 'domyślnie' i taki JavaScript nie będzie działał. Dlatego, jeśli chcesz ta sama strona aby być OK zarówno przy użyciu parserów XHTML jak i HTML, musisz załączyć znacznik script w elemencie CDATA w XHTML, ale nie załączyć go w HTML.

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

 29
Author: ondra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-30 08:14:23

To X (HT)ML. Gdy używasz symboli, takich jak < i > w JavaScript, np. do porównywania dwóch liczb całkowitych, musiałoby to być przetwarzane jak XML, a więc oznaczałoby początek lub koniec znacznika.

CDATA oznacza, że następujące linie (wszystko do ]]> nie jest XML i dlatego nie powinno być przetwarzane w ten sposób.

 22
Author: Franz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 19:19:36

Do not use CDATA in HTML4 but you should use CDATA in XHTML and must use CDATA in XML if you have unescaped symbols like .

 16
Author: Loren Segal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 20:56:21

Aby upewnić się, że Walidacja XHTML działa poprawnie, gdy masz JavaScript osadzony na stronie, a nie zewnętrznie odwołuje.

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

Ze stronami HTML w sieci można po prostu dołączyć wymagany JavaScript między i tagi. Podczas walidacji kodu HTML na stronie internetowej zawartość JavaScript jest uważana za CDATA (dane znaków), która jest ignorowana przez walidator. To samo nie jest prawdą, jeśli przestrzegasz nowszych standardów XHTML podczas konfigurowania swojej strony internetowej. W XHTML kod pomiędzy znacznikami skryptu jest uważany za PCDATA (parsed character data), który jest przetwarzany przez walidator.

Z tego powodu nie można po prostu włączyć JavaScript między znacznikami skryptu na Twojej strony bez "łamania" Twojej strony (przynajmniej jeśli chodzi o walidator).

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

 16
Author: LBushkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 09:37:41

Jeśli dążysz do ścisłej zgodności z XHTML, potrzebujesz CDATA, aby mniej niż i ampersands nie były oznaczane jako nieprawidłowe znaki.

 9
Author: Chris Shaffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 20:54:38

CDATA wskazuje, że zawartość wewnątrz nie jest XML.

Oto Wyjaśnienie na Wikipedii

 9
Author: Alex Beardsley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 09:45:10

Aby uniknąć błędów xml podczas walidacji XHTML.

 8
Author: gehsekky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 19:19:12

CDATA mówi przeglądarce, aby wyświetlała tekst tak, jak jest, a nie renderowała go jako HTML.

 8
Author: Ikaso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 19:19:19

CDATA wskazuje, że zawartość wewnątrz nie jest XML.

 6
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-29 22:50:32

CDATA jest niezbędna w każdym dialekcie XML, ponieważ tekst w węźle XML jest traktowany jako element potomny przed przetworzeniem go jako JavaScript. Jest to również powód, dla którego JSLint narzeka na znak < w wyrażeniach regularnych.

Referencje

 5
Author: Paul Sweatte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:33
 2
Author: ceejayoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:22

W ten sposób starsza przeglądarka nie przetwarza kodu Javascript i strona nie pęka.

Zwartość Wsteczna. Uwielbiam to.

 2
Author: Tyler Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 19:19:14