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

907

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>
Brad
la source
18
Maintenant que XHTML est essentiellement mort, n'est-ce plus une préoccupation pertinente?
allyourcode
80
@allyourcode: qu'est-ce qui vous fait penser que XHTML est mort? HTML5? Il y a XHTML5 pour aller de pair :)
Doktor J
4
@DoktorJ AFAIK xHTML était à la version 1. Son équivalent HTML était la version 4. Il y avait un effort concentré dans xHTML 2.0 visant à pousser les espaces de noms xform, xlink, time et svg dans la spécification afin d'améliorer les mêmes fonctionnalités que HTML 5 était ajout - xform / validation d'entrée, temps / animations, svg / canvas - mais les efforts pour la spécification xHTML 2 ont été recentrés vers les fonctionnalités HTML 5. Cela ne veut pas dire que xHTML 2 a été abandonné ou est devenu obsolète, mais ce n'est pas prévu dans un avenir proche.
Mihai Stancu
14
XHTML n'est pas mort dans le développement Java Seam / JSF / Facelets.
JoJo
15
@Mihai Stancu - ce n'est pas tout à fait correct. Selon le W3C, il existe une syntaxe XML pour HTML5 : "L'autre syntaxe qui peut être utilisée pour HTML5 est XML. Cette syntaxe est compatible avec les documents et implémentations XHTML1. Les documents utilisant cette syntaxe doivent être servis avec un type de support XML et les éléments doivent à placer dans l' espace de noms w3.org/1999/xhtml en suivant les règles définies par les spécifications XML. "
BrainSlugs83

Réponses:

585

Une section CDATA est requise si vous avez besoin que votre document soit analysé en XML (par exemple lorsqu'une page XHTML est interprétée comme XML) et que vous souhaitez pouvoir écrire littéralement i<10et a && bau lieu de i&lt;10eta &amp;&amp; b , car XHTML analysera le code JavaScript en tant que données de caractères analysés par opposition aux 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 source externes, mais pour tout JavaScript en ligne en 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 XML, auquel cas ce ne sera pas un problème.

Pour une bonne synthèse sur le sujet, voir https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm

Michael Ridley
la source
48
Il y a bien plus que de la "validation". La plupart des analyseurs XML stricts ne parcourent pas la page s'ils frappent un caractère illégal. Il s'agit plus que de rendre le W3C heureux et de devenir vert au lieu de rouge.
Loren Segal le
40
Si vous évitez les caractères &et <, vous n'avez pas besoin d'une section CDATA; cela fonctionnera bien en HTML et en XHTML. Vous pouvez facilement y parvenir en mettant tout le code significatif dans des scripts externes et en utilisant simplement des scripts en ligne, par exemple. initialiser les variables (échapper &/ <vers \x26/ \x3Cdans les littéraux de chaîne si vous en avez besoin).
bobince
23
Et dans le cas de HTML5?
Mathew Attlee
5
@Mathew Attle - c'est une bonne question. Soyez une excellente question à poser sur un fil distinct pour vous assurer qu'il reçoit l'attention dont il a besoin.
Alex KeySmith
3
@ Loren: Ensuite, il s'agit encore complètement de validation. La mesure dans laquelle un agent utilisateur rejette le XML non valide est orthogonale.
Courses de légèreté en orbite le
231

Lorsque les navigateurs traitent le balisage comme XML:

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

Lorsque les navigateurs traitent le balisage en HTML:

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

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

<script>
//<![CDATA[
    ...code...
//]]>
</script>
Shadow2531
la source
12
Par souci de sécurité du code, il est préférable d'entourer vos CDATA de commentaires de bloc, /* ... */car sinon, si les sauts de ligne sont supprimés, le code se cassera
BryanH
"... comme XML" dans la première section ne devrait-il pas être "... comme texte non interprété"? Dans stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean, nous voyons "... ces chaînes incluent des données qui pourraient être interprétées comme du balisage XML, mais ne devraient pas l'être."
matt wilkie
@mattwilkie, ce que je veux dire par "au format XML" est "Lorsque les navigateurs utilisent leur analyseur XML (par opposition à l'analyseur HTML) pour analyser le balisage parce que le document a été envoyé avec un type MIME basé sur XML ou que le fichier contenant le balisage contient une extension de fichier basée sur XML ".
Shadow2531
127

HTML

Un analyseur HTML traitera tout 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 les spécifications .

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

Donc, en HTML, ce n'est pas possible:

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

Une CDATAsection n'a aucun effet . Voilà pourquoi vous devez écrire

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

ou similaire.

Cela s'applique également aux fichiers XHTML servis en tant que text/html. (Étant donné qu'IE ne prend pas en charge les types de contenu XML, cela est principalement vrai.)

XML

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

Pour l'analyseur XML, une scriptbalise n'est pas meilleure qu'une 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, ce n'est pas possible:

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

Pour contourner ce problème, vous pouvez encapsuler l'intégralité du script dans une CDATAsection. Cela indique à 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 encapsuler dans des commentaires.

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

user123444555621
la source
2
L'énoncé «Une section CDATA n'a aucun effet» n'est pas vrai pour (la proposition) HTML5, qui reconnaît la construction. w3.org/TR/html5/syntax.html#cdata-sections
danorton
3
@danorton Intéressant. Je pense que c'est un mélange assez moche. Mais toujours aucun effet dans le contenu du script.
user123444555621
2
Je ne savais pas que les </ balises de script internes étaient mauvaises.
Salman A
3
@SalmanA C'est l'une des bizarreries de HTML et officiellement appelé ETAGO . En savoir plus: mathiasbynens.be/notes/etago (bien que l'article indique qu'aucun navigateur n'a jamais implémenté cette fonctionnalité, je suis presque sûr que cela m'a causé des problèmes. Peut-être dans un autre outil)
user123444555621
1
En fait, je suis tombé sur des problèmes de validation - <script>var b = "<b>bold</b>";</script>échoue à valider mais après avoir lu votre réponse et changé pour la <script>var b = "<b>bold<\/b>";</script>corriger.
Salman A
30

Fondamentalement, il s'agit de permettre d'écrire un document à la fois XHTML et HTML. Le problème est que dans XHTML, l'analyseur XML interprétera les caractères &, <,> dans la balise de script et provoquera une erreur d'analyse XML. Ainsi, vous pouvez écrire votre 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, le script de balise est considéré comme CDATA «par défaut», et un tel JavaScript ne s'exécutera pas. Par conséquent, si vous souhaitez que la même page soit correcte à la fois en utilisant les analyseurs XHTML et HTML, vous devez joindre le script balise de dans l'élément CDATA dans XHTML, mais PAS pour l'enfermer dans 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 JavaScript) le détecte et traite le reste jusqu'à la fin de CDATA comme CDATA.

ondra
la source
24

C'est un truc X (HT) ML. Lorsque vous utilisez des symboles comme <et >dans le JavaScript, par exemple pour comparer deux entiers, cela devrait être analysé comme XML, donc ils marqueraient comme un début ou une fin d'une balise.

Le CDATA signifie que les lignes suivantes (tout ce qui précède ]]>n'est pas XML et ne doit donc pas être analysé de cette façon.

Franz
la source
18

Ne pas utiliser CDATA dans HTML4 mais vous devez utiliser CDATA en XHTML et doit utiliser CDATA en XML si vous avez des symboles comme unescaped <et>.

Loren Segal
la source
11
CDATA n'est pas valide en HTML4. Autrement dit, cela ne fait pas partie de la grammaire. CDATA est une syntaxe de XML et XHTML est un sous-ensemble XML. Par conséquent, il ne doit être utilisé qu'à l'intérieur de XML (et de ses sous-ensembles). HTML en revanche n'est pas XML.
Loren Segal
17

Il permet de s'assurer que la validation XHTML fonctionne correctement lorsque vous avez JavaScript intégré à votre page, plutôt que référencé en externe.

XHTML requiert que votre page soit strictement conforme aux exigences de balisage XML. Étant donné que JavaScript peut contenir des caractères ayant une signification particulière, vous devez l'encapsuler dans CDATA pour vous assurer que la validation ne le marque pas comme mal formé.

Avec les pages HTML sur le Web, vous pouvez simplement inclure le JavaScript requis entre les balises et. Lorsque vous validez le code HTML sur votre page Web, le contenu JavaScript est considéré comme CDATA (données de caractères) qui est donc ignoré par le validateur. La même chose n'est pas vraie si vous suivez les normes XHTML les plus récentes dans la configuration de votre page Web. Avec XHTML, le code entre les balises de script est considéré comme PCDATA (données de caractères analysées) qui est donc traité par le validateur.

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

Vous pouvez en savoir plus sur CDATA ici , et plus sur XHTML ici .

LBushkin
la source
10

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

Voici une explication sur wikipedia

Alex Beardsley
la source
9

Lorsque vous optez pour une conformité XHTML stricte, vous avez besoin du CDATA donc moins que et les esperluettes ne sont pas marquées comme des caractères non valides.

Chris Shaffer
la source
8

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

gehsekky
la source
8

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

Ikaso
la source
6

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

Jim
la source
2

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

Compatibilité descendante. Je dois l'aimer.

Tyler Carter
la source