web-dev-qa-db-fra.com

Quand une section CDATA est-elle nécessaire dans une balise de script?

Les balises CDATA sont-elles toujours nécessaires dans les balises de script et si oui quand?

En d'autres termes, quand et où est-ce:

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

préférable à ceci:

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

Une section CDATA est requise si vous souhaitez que votre document soit analysé au format XML (par exemple, lorsqu'une page XHTML est interprétée en tant que XML) et que vous souhaitez pouvoir écrire le littéral i<10 et a && b au lieu de i&lt;10 et a &amp;&amp; b, car XHTML analysera le code JavaScript en tant que données de caractères analysées, par opposition aux données de caractères par défaut. Ce n'est pas un problème avec les scripts qui sont stockés dans des fichiers source externes, mais pour tout code JavaScript intégré dans XHTML, vous voudrez probablement utiliser une section CDATA.

Notez que de nombreuses pages XHTML n'ont jamais été conçues pour être analysées en tant que XML, auquel cas ce ne sera pas un problème.

Pour une bonne rédaction sur le sujet, voir https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm

568
Michael Ridley

Lorsque les navigateurs traitent le balisage en tant que XML:

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

Lorsque les navigateurs traitent le balisage au format HTML:

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

Lorsque les navigateurs traitent le balisage comme HTML et que vous voulez que votre balisage XHTML 1.0 (par exemple) soit validé.

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

HTML

Un analyseur HTML traitera tout ce qui se situe entre <script> et </script> dans le cadre du script. Certaines implémentations n'ont même pas besoin d'une balise de fermeture correcte; ils arrêtent l'interprétation du script à "</", ce qui est correct selon specs.

Mettre à jour En HTML5 et avec les navigateurs actuels, ce n'est plus le cas.

Donc, en HTML, ceci est pas possible:

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

Une section CDATA n'a aucun effet . C'est pourquoi vous devez écrire

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

ou similaire.

Ceci s'applique également aux fichiers XHTML servis en tant que text/html. (Puisque IE ne prend pas en charge les types de contenu XML, cela est généralement vrai.)

XML

En XML, différentes règles s'appliquent. Notez que les navigateurs (non IE) utilisent un analyseur XML uniquement si le document XHMTL est servi avec un type de contenu XML.

Pour l'analyseur XML, une balise script n'est pas meilleure que toute autre balise. En particulier, un nœud de script peut contenir des nœuds enfants non textuels, déclenchés par "<"; et un signe "&" indique une entité de caractère.

Donc, en XHTML, ceci est pas possible:

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

Pour contourner ce problème, vous pouvez envelopper le script dans une section CDATA. Cela dit à l'analyseur: "Dans cette section, ne traitez pas" < "et" & "comme des caractères de contrôle ." Pour empêcher le moteur JavaScript d'interpréter les marques "<![CDATA[" et "]]>", vous pouvez les envelopper dans des commentaires.

Si votre script ne contient pas "<" ou "&", vous n'avez de toute façon pas besoin d'une section CDATA.

121
user123444555621

Fondamentalement, il s'agit de permettre d'écrire un document à la fois XHTML et HTML. Le problème est qu’en XHTML, l’analyseur XML interprète les caractères &, <,> de la balise script et cause une erreur d’analyse XML. Vous pouvez donc écrire votre code JavaScript avec des entités, par exemple:

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

Mais ce n'est pas pratique. Le plus gros problème est que si vous lisez la page en HTML, la balise script est considérée comme CDATA 'par défaut', et un tel JavaScript ne fonctionnera pas. Par conséquent, si vous souhaitez que la même page soit correcte à la fois à l'aide d'analyseurs syntaxiques XHTML et HTML, vous devez inclure la balise script dans l'élément CDATA en XHTML, mais PAS en HTML.

Cette astuce marque le début d’un élément CDATA en tant que commentaire JavaScript; en HTML, l'analyseur JavaScript ignore la balise CDATA (c'est un commentaire). En XHTML, l'analyseur XML (qui est exécuté avant le JavaScript) le détecte et traite le reste jusqu'à la fin de CDATA en tant que CDATA.

30
ondra

C'est une chose X (HT) ML. Lorsque vous utilisez des symboles tels que < et > dans JavaScript, par exemple, pour comparer deux nombres entiers, ceci devrait être analysé comme XML, ainsi ils marqueraient comme début ou fin d'une balise.

CDATA signifie que les lignes suivantes (tout ce qui va jusqu'au ]]> ne sont pas XML et ne devraient donc pas être analysées de cette façon.

23
Franz

Faites pas utilisez CDATA en HTML4 mais vous devriez utilisez CDATA en XHTML et devez utilisez CDATA en XML si vous avez des symboles non échappés tels que <et>.

18
Loren Segal

Cela permet de s'assurer que la validation XHTML fonctionne correctement lorsque du JavaScript est intégré dans votre page, plutôt que référencé de manière externe.

XHTML exige que votre page soit strictement conforme aux exigences du balisage XML. JavaScript pouvant contenir des caractères ayant une signification particulière, vous devez le placer dans CDATA pour que la validation ne le signale pas comme étant mal formé.

Avec les pages HTML sur le Web, vous pouvez simplement inclure le code JavaScript requis entre et les balises. Lorsque vous validez le code HTML sur votre page Web, le contenu JavaScript est considéré comme un CDATA (données de caractère), qui est donc ignoré par le validateur. Il n'en va pas de même si vous suivez les normes XHTML les plus récentes pour configurer votre page Web. Avec XHTML, le code entre les balises de script est considéré comme étant PCDATA (données de caractères analysés), qui est donc traité par le validateur.

Pour cette raison, vous ne pouvez pas simplement inclure du code JavaScript entre les balises de script de votre page sans "casser" votre page Web (au moins en ce qui concerne le validateur).

Vous pouvez apprendre plus d'informations sur CDATA ici , et plus d'informations sur XHTML ici .

17
LBushkin

CDATA indique que le contenu qu'il contient n'est pas XML.

Voici une explication sur wikipedia

10
Alex Beardsley

Lorsque vous optez pour une conformité XHTML stricte, vous avez besoin de CDATA. Par conséquent, les valeurs inférieures à et les esperluettes ne sont pas marquées comme des caractères non valides.

9
Chris Shaffer

pour éviter les erreurs XML lors de la validation xhtml.

8
gehsekky

CDATA indique au navigateur d'afficher le texte tel quel et de ne pas le rendre au format HTML.

8
Ikaso

CDATA indique que le contenu qu'il contient n'est pas XML.

6
Jim

CDATA est nécessaire dans tout dialecte XML, car le texte d'un nœud XML est traité comme un élément enfant avant d'être évalué comme JavaScript. C’est aussi la raison pour laquelle se plaint JSLint à propos du caractère < dans les expressions rationnelles.

Références

5
Paul Sweatte

Quand vous voulez valider (en XML/XHTML - merci, Loren Segal ).

2
ceejayoz

De cette façon, les anciens navigateurs n'analysent pas le code Javascript et la page ne se rompt pas.

Compatibilité descendante. Je dois l'aimer.

2
Tyler Carter