it-swarm-pt.tech

Quando é necessária uma seção CDATA dentro de uma tag de script?

As tags CDATA são necessárias em tags de script e, se sim, quando?

Em outras palavras, quando e onde é isso:

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

preferível a isto:

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

Uma seção CDATA é necessária se você precisar que seu documento seja analisado como XML (por exemplo, quando uma página XHTML é interpretada como XML) e você queira ser capaz de gravar literalmente i<10 e a && b em vez de i&lt;10 e a &amp;&amp; b, como XHTML analisará o código JavaScript como dados de caractere analisados ​​em oposição aos dados de caractere por padrão. Isso não é um problema com scripts que são armazenados em arquivos de origem externos, mas para qualquer JavaScript in-line em XHTML você provavelmente deseja usar uma seção CDATA.

Observe que muitas páginas XHTML nunca foram planejadas para serem analisadas como XML, caso em que isso não será um problema.

Para um bom writeup no assunto, veja https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm

568
Michael Ridley

Quando os navegadores tratam a marcação como XML:

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

Quando os navegadores tratam a marcação como HTML:

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

Quando os navegadores tratam a marcação como HTML e você deseja que sua marcação XHTML 1.0 (por exemplo) seja validada.

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

HTML

Um analisador de HTML tratará tudo entre <script> e </script> como parte do script. Algumas implementações nem precisam de uma tag de fechamento correta; eles param a interpretação do script em "</", que está correto de acordo com o specs.

Atualização Em HTML5 e com os navegadores atuais, não é mais o caso.

Então, em HTML, isso é não possível:

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

Uma seção CDATA tem nenhum efeito . É por isso que você precisa escrever

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

ou similar.

Isso também se aplica aos arquivos XHTML servidos como text/html. (Como IE não suporta tipos de conteúdo XML, isso é verdade principalmente.)

XML

Em XML, regras diferentes se aplicam. Observe que os navegadores (não IE) usam apenas um analisador XML, se o documento XHMTL for servido com um tipo de conteúdo XML.

Para o analisador XML, uma tag script não é melhor que qualquer outra tag. Particularmente, um nó de script pode conter nós filhos que não sejam de texto, acionados por "<"; e um sinal "&" indica uma entidade de caractere.

Então, em XHTML, isso é não possível:

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

Para contornar isso, você pode envolver todo o script em uma seção CDATA. Isso diz ao analisador: 'Nesta seção, não trate "<" e "&" como caracteres de controle .' Para evitar que o mecanismo JavaScript interprete as marcas "<![CDATA[" e "]]>", você pode envolvê-las nos comentários.

Se o seu script não contiver nenhum "<" ou "&", você não precisará de uma seção CDATA mesmo assim.

121
user123444555621

Basicamente, é permitir escrever um documento que seja tanto XHTML quanto HTML. O problema é que dentro do XHTML, o analisador XML interpretará os caracteres &, <,> na tag script e causará erro de análise XML. Então, você pode escrever seu JavaScript com entidades, por exemplo:

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

Mas isso é impraticável. O maior problema é que, se você ler a página em HTML, a tag script será considerada CDATA 'por padrão' e esse JavaScript não será executado. Portanto, se você quiser que a mesma página fique bem usando os analisadores XHTML e HTML, será necessário colocar a tag script no elemento CDATA em XHTML, mas NÃO para incluí-la em HTML.

Esse truque marca o início de um elemento CDATA como um comentário de JavaScript; em HTML, o analisador JavaScript ignora a tag CDATA (é um comentário). Em XHTML, o analisador XML (que é executado antes do JavaScript) o detecta e trata o restante até o final de CDATA como CDATA.

30
ondra

É uma coisa do X (HT) ML. Quando você usa símbolos como < e > no JavaScript, por exemplo para comparar dois inteiros, isso teria que ser analisado como XML, assim eles marcariam como um começo ou fim de uma tag.

O CDATA significa que as seguintes linhas (tudo até o ]]> não é XML e, portanto, não deve ser analisado dessa maneira.

23
Franz

Do não use CDATA em HTML4 mas você deve usar CDATA em XHTML e deve usar CDATA em XML se tiver símbolos sem escape como <e>.

18
Loren Segal

É para garantir que a validação XHTML funcione corretamente quando você tiver JavaScript incorporado em sua página, em vez de referenciado externamente

O XHTML requer que sua página esteja estritamente em conformidade com os requisitos de marcação XML. Como o JavaScript pode conter caracteres com significado especial, você deve envolvê-lo em CDATA para garantir que a validação não o sinalize como malformado.

Com as páginas HTML na Web, você pode incluir apenas o JavaScript e as tags necessárias. Quando você valida o HTML em sua página da Web, o conteúdo JavaScript é considerado como CDATA (dados de caractere), portanto, ignorado pelo validador. O mesmo não acontece se você seguir os padrões XHTML mais recentes na configuração da sua página da web. Com XHTML, o código entre as tags de script é considerado como PCDATA (dados de caractere analisados), que é, portanto, processado pelo validador.

Por causa disso, você não pode simplesmente incluir JavaScript entre as tags de script em sua página sem "quebrar" sua página da web (pelo menos no que diz respeito ao validador).

Você pode aprender mais sobre o CDATA aqui , e mais sobre o XHTML aqui .

17
LBushkin

CDATA indica que o conteúdo dentro não é XML.

Aqui está uma explicação sobre wikipedia

10
Alex Beardsley

Quando você está em conformidade com XHTML, você precisa do CDATA, portanto, menos do que e o "e" comercial não é marcado como caracteres inválidos.

9
Chris Shaffer

para evitar erros de xml durante a validação de xhtml.

8
gehsekky

CDATA diz ao navegador para exibir o texto como está e não para renderizá-lo como um HTML.

8
Ikaso

CDATA indica que o conteúdo dentro não é XML.

6
Jim

O CDATA é necessário em qualquer dialeto XML, porque o texto em um nó XML é tratado como um elemento filho antes de ser avaliado como JavaScript. Essa também é a razão pela qual JSLint reclama sobre o caractere < em expressões regulares.

Referências

5
Paul Sweatte

Quando você quiser validar (em XML/XHTML - obrigado, Loren Segal ).

2
ceejayoz

Dessa forma, o navegador mais antigo não analisa o código Javascript e a página não quebra.

Compatibilidade para trás. Tem que amar isto.

2
Tyler Carter