963 votes

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>
 

604voto

Michael Ridley Points 5246

Une section CDATA est nécessaire si vous avez besoin de votre document à analyser XML (par exemple, quand une page XHTML est interprété comme XML) et que vous souhaitez être en mesure d'écrire littérale i<10 et a && b au lieu de i&lt;10 et a &amp;&amp; b, XHTML va analyser le code JavaScript comme analysé les données de caractères, par opposition à des données de caractère par défaut. Ce n'est pas un problème avec les scripts qui sont stockés dans des fichiers externes, mais pour tout le JavaScript en ligne en XHTML, vous aurez probablement envie d'utiliser une section CDATA.

Notez que beaucoup de pages XHTML n'a jamais été destiné à être analysé comme XML dans ce cas, ce ne sera pas un problème.

Pour un bon article sur le sujet, voir http://javascript.about.com/library/blxhtml.htm

238voto

Shadow2531 Points 6726

Lorsque les navigateurs traitent le balisage en XML:

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

Lorsque les navigateurs traitent le balisage en HTML:

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

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

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

136voto

Pumbaa80 Points 27066

HTML

Un analyseur HTML traitera de tout ce qui est entre <script> et </script> dans le cadre de l'exécution du script. Certaines implémentations ne avez même pas besoin d'une bonne balise de fermeture; ils s'arrêtent script interprétation à "</", ce qui est correct selon les spécifications. [mise à jour]En HTML5, et avec les navigateurs actuels, qui n'est pas le cas aujourd'hui.[/mise à jour]

Donc, dans le HTML, c'est pas possible:

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

Un CDATA section a aucun effet. C'est pourquoi vous avez besoin d'écrire

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

ou similaire.

Ceci s'applique également aux fichiers XHTML servi en tant que text/html. (Depuis IE ne prend pas en charge XML types de contenu, c'est surtout vrai.)

XML

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

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

Donc, en XHTML, c'est pas possible:

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

Pour contourner ce problème, vous pouvez envelopper l'ensemble du script en CDATA section. Cela indique à l'analyseur: "Dans la présente section, ne pas traiter "<" et "&" comme des caractères de contrôle.' Pour empêcher le moteur JavaScript à partir de l'interprétation de la "<![CDATA[" et "]]>" des marques, vous pouvez les envelopper dans les commentaires.

Si votre script ne contiennent pas de "<" ou "&", vous n'avez pas besoin d'un CDATA l'article de toute façon.

32voto

ondra Points 2491

Fondamentalement, c'est de permettre d'écrire un document qui est à la fois XHTML et HTML. Le problème est que dans le XHTML, XML parser va interpréter le &,<,> caractères dans le script de la balise et de la cause erreur d'analyse XML. Donc, vous pouvez écrire votre code JavaScript avec des entités, par exemple:

if (a &gt; b) then 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é comme CDATA "par défaut", et tels JavaScript ne s'exécute pas. Par conséquent, si vous voulez la même page pour être OK à la fois en utilisant XHTML et HTML des analyseurs, vous devez placer le script balise CDATA élément dans le XHTML, mais de ne PAS l'inclure dans le code HTML.

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

24voto

Franz Points 5924

C’est une chose de X (HT) ML. Lorsque vous utilisez des symboles comme et dans le code JavaScript, par exemple pour comparer deux nombres entiers, cela devra être analysée comme XML, donc ils marquerait comme début ou fin d’une balise.

Le CDATA signifie que les lignes suivantes (tout à le `` n’est pas XML et donc ne devrait pas être interprété comme ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X