Quando è necessaria una sezione CDATA all'interno di un tag script?


907

I tag CDATA sono mai necessari nei tag script e, in caso affermativo, quando?

In altre parole, quando e dove si trova questo:

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

preferibile a questo:

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

18
Ora che XHTML è sostanzialmente morto, non è più una preoccupazione rilevante?
codice alleato

80
@allyourcode: cosa ti fa pensare che XHTML sia morto? HTML5? C'è XHTML5 che va bene insieme :)
Doktor J,

4
@DoktorJ AFAIK xHTML era alla versione 1. Il suo equivalente HTML era la versione 4. C'è stato uno sforzo concentrato in xHTML 2.0 con l'intenzione di inserire gli spazi dei nomi xform, xlink, time e svg nelle specifiche per migliorare le stesse funzionalità di HTML 5 aggiungendo - xform / input-validation, time / animations, svg / canvas - ma gli sforzi per la specifica xHTML 2 sono stati riorientati verso le funzionalità HTML 5. Questo non vuol dire che xHTML 2 sia stato abbandonato o diventato obsoleto, ma non è previsto nel prossimo futuro.
Mihai Stancu,

14
XHTML non è morto nello sviluppo di Java Seam / JSF / Facelets.
JoJo,

15
@Mihai Stancu - non è del tutto corretto. Secondo W3C esiste una sintassi XML per HTML5 : "L'altra sintassi che può essere utilizzata per HTML5 è XML. Questa sintassi è compatibile con i documenti e le implementazioni XHTML1. I documenti che utilizzano questa sintassi devono essere forniti con un tipo di supporto XML e gli elementi devono da inserire nello spazio dei nomi w3.org/1999/xhtml seguendo le regole stabilite dalle specifiche XML. "
BrainSlugs83,

Risposte:


585

È necessaria una sezione CDATA se è necessario che il documento analizzi come XML (ad esempio quando una pagina XHTML è interpretata come XML) e si desidera poter scrivere letteralmente i<10e a && binvece di i&lt;10ea &amp;&amp; b , poiché XHTML analizzerà il codice JavaScript come dati di carattere analizzati al contrario dei dati dei personaggi per impostazione predefinita. Questo non è un problema con gli script archiviati in file di origine esterni, ma per qualsiasi JavaScript inline in XHTML probabilmente vorrai usare una sezione CDATA.

Si noti che molte pagine XHTML non sono mai state concepite per essere analizzate come XML, nel qual caso questo non sarà un problema.

Per un buon approfondimento sull'argomento, consultare https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm


48
C'è molto di più oltre alla semplice "convalida". I parser XML più severi non passeranno attraverso la pagina se colpiscono un personaggio illegale. Si tratta più che semplicemente di rendere felice il W3C e diventare verde anziché rosso.
Loren Segal,

40
Se eviti &e <caratteri, non hai bisogno di una sezione CDATA; funzionerà bene sia in HTML che in XHTML. Puoi farlo facilmente inserendo tutto il codice significativo in script esterni e usando ad esempio solo script inline. inizializza le variabili (scappando &/ <verso \x26/ \x3Cin letterali stringa se necessario).
Bobince,

23
Che dire di HTML5?
Mathew Attlee,

5
@Mathew Attle - questa è una buona domanda. Sii un'ottima domanda da porre su un thread separato per assicurarti che riceva l'attenzione di cui ha bisogno.
Alex KeySmith,

3
@Loren: Quindi si tratta ancora di validazione. La misura in cui un agente utente rifiuta XML non valido è ortogonale.
Corse di leggerezza in orbita

231

Quando i browser trattano il markup come XML:

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

Quando i browser trattano il markup come HTML:

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

Quando i browser trattano il markup come HTML e si desidera validare il markup XHTML 1.0 (ad esempio).

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

12
Proprio come una questione di sicurezza del codice, è meglio circondare i tuoi CDATA con commenti di blocco /* ... */perché altrimenti se le interruzioni di riga vengono rimosse, il codice si romperà
BryanH,

"... come XML" nella prima sezione non dovrebbe essere "... come testo non interpretato"? In stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean vediamo "... queste stringhe includono dati che potrebbero essere interpretati come markup XML, ma non dovrebbero esserlo".
Matt Wilkie,

@mattwilkie, Quello che intendo con "come XML" è "Quando i browser usano il loro parser XML (al contrario del parser HTML) per analizzare il markup perché il documento è stato inviato con un tipo mime basato su XML o il file contenente il markup ha un'estensione di file basata su XML ".
Shadow2531

127

HTML

Un parser HTML tratterà tutto tra <script>e </script>come parte dello script. Alcune implementazioni non hanno nemmeno bisogno di un tag di chiusura corretto; interrompono l'interpretazione dello script in " </", che è corretto secondo le specifiche .

Aggiornamento In HTML5, e con i browser attuali, non è più così.

Quindi, in HTML, questo non è possibile:

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

Una CDATAsezione non ha alcun effetto . Ecco perché devi scrivere

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

o simili.

Questo vale anche per i file XHTML serviti come text/html. (Poiché IE non supporta i tipi di contenuto XML, questo è principalmente vero.)

XML

In XML, si applicano regole diverse. Si noti che i browser (non IE) utilizzano un parser XML solo se il documento XHMTL è offerto con un tipo di contenuto XML.

Per il parser XML, un scripttag non è migliore di qualsiasi altro tag. In particolare, un nodo di script può contenere nodi secondari non di testo, attivati ​​da " <"; e un &segno " " indica un'entità personaggio.

Quindi, in XHTML, questo non è possibile:

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

Per ovviare a questo, è possibile avvolgere l'intero script in una CDATAsezione. Questo dice al parser: 'In questa sezione, non trattare " <" e " &" come caratteri di controllo . " Per impedire al motore JavaScript di interpretare i segni " <![CDATA[" e " ]]>", puoi racchiuderli nei commenti.

Se il tuo script non contiene " <" o " &", non hai comunque bisogno di una CDATAsezione.


2
L'affermazione "Una sezione CDATA non ha alcun effetto" non è vera per (la proposta) HTML5, che riconosce il costrutto. w3.org/TR/html5/syntax.html#cdata-sections
danorton

3
@danorton Interessante. Penso che sia un brutto mix. Ancora nessun effetto nel contenuto degli script.
user123444555621

2
Non sapevo che nessun </ tag di script interno fosse dannoso.
Salman A

3
@SalmanA Questa è una delle stranezze di HTML e ufficialmente chiamata ETAGO . Ulteriori informazioni: mathiasbynens.be/notes/etago (mentre l'articolo afferma che nessun browser ha mai implementato quella funzione, sono abbastanza sicuro che mi abbia causato qualche problema. Forse in qualche altro strumento)
user123444555621

1
In realtà mi sono imbattuto in problemi di convalida - <script>var b = "<b>bold</b>";</script>non riesco a convalidare ma dopo aver letto la tua risposta e cambiato per risolverlo <script>var b = "<b>bold<\/b>";</script>.
Salman A

30

Fondamentalmente è per consentire di scrivere un documento che è sia XHTML che HTML. Il problema è che all'interno di XHTML, il parser XML interpreterà i caratteri &, <,> nel tag script e causerà un errore di analisi XML. Quindi, puoi scrivere JavaScript con entità, ad esempio:

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

Ma questo non è pratico. Il problema più grande è che se leggi la pagina in HTML, lo script di tag è considerato CDATA "per impostazione predefinita" e tale JavaScript non verrà eseguito. Pertanto, se si desidera che la stessa pagina sia OK sia utilizzando i parser XHTML che HTML, è necessario racchiudere il tag di script nell'elemento CDATA in XHTML, ma NON racchiuderlo in HTML.

Questo trucco segna l'inizio di un elemento CDATA come commento JavaScript; in HTML il parser JavaScript ignora il tag CDATA (è un commento). In XHTML, il parser XML (che viene eseguito prima di JavaScript) lo rileva e considera il resto fino alla fine di CDATA come CDATA.


24

È una cosa X (HT) ML. Quando si utilizzano simboli come <e >all'interno di JavaScript, ad esempio per confrontare due numeri interi, questo dovrebbe essere analizzato come XML, in modo da contrassegnare come inizio o fine di un tag.

Il CDATA significa che le seguenti righe (tutto fino a ]]>non è XML e quindi non dovrebbero essere analizzate in questo modo.


18

Do Non utilizzare CDATA in HTML4, ma si dovrebbe usare CDATA in XHTML e devono utilizzare CDATA in XML se si dispone di simboli escape come <e>.


11
CDATA non è valido in HTML4. In poche parole, non fa parte della grammatica. CDATA è una sintassi di XML e XHTML è un sottoinsieme XML. Pertanto, deve essere utilizzato solo all'interno di XML (e dei relativi sottoinsiemi). HTML invece non è XML.
Loren Segal,

17

Garantisce che la convalida XHTML funzioni correttamente quando JavaScript è incorporato nella tua pagina, invece di fare riferimento esternamente.

XHTML richiede che la tua pagina sia rigorosamente conforme ai requisiti di markup XML. Poiché JavaScript può contenere caratteri con un significato speciale, è necessario inserirlo in CDATA per assicurarsi che la convalida non lo contrassegni come non valido.

Con le pagine HTML sul Web puoi semplicemente includere il JavaScript richiesto tra i tag e. Quando convalidi l'HTML sulla tua pagina web, il contenuto JavaScript viene considerato come CDATA (dati carattere) che viene quindi ignorato dal validatore. Lo stesso non è vero se segui gli standard XHTML più recenti nella configurazione della tua pagina web. Con XHTML il codice tra i tag di script è considerato PCDATA (dati di carattere analizzati) che viene quindi elaborato dal validatore.

Per questo motivo, non puoi semplicemente includere JavaScript tra i tag di script nella tua pagina senza "interrompere" la tua pagina web (almeno per quanto riguarda il validatore).

Puoi saperne di più su CDATA qui e di più su XHTML qui .



9

Quando stai cercando una rigorosa conformità XHTML, hai bisogno del CDATA, quindi meno di e le e commerciali non sono contrassegnate come caratteri non validi.



8

CDATA dice al browser di visualizzare il testo così com'è e di non renderlo come HTML.


6

CDATA indica che i contenuti all'interno non sono XML.




2

In questo modo il browser precedente non analizza il codice Javascript e la pagina non si interrompe.

Compatibilità all'indietro. Devi amarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.