2010-11-19 25 views
14
<script type="text/javascript"> 
    function test() { 
     alert('&lt;span&gt;blah&lt;span&gt;'); 
    } 
</script> 
<a href="#" onclick="test();">First</a><br /> 
<a href="#" onclick="alert('&lt;span&gt;blah&lt;span&gt;');">Second</a><br /> 
Third: &lt;span&gt;blah&lt;span&gt; 

Demostración: http://jsfiddle.net/LPYTZ/Entidades HTML dentro de la etiqueta de script no convertida?

¿Por qué es el primer resultado diferente? ¿Las etiquetas <script> están excluidas de alguna manera de la conversión de entidad?

Respuesta

21

En HTML, la secuencia de comandos y los elementos de estilo son defined in the DTD as containing CDATA. Esto significa que las entidades y las etiquetas se ignoran hasta que el analizador llegue a algo que se parece a una etiqueta final.

XHTML is different y entidades y etiquetas dentro de esos elementos funcionan de manera normal - pero sólo cuando se analiza como XHTML. Puede marcar explícitamente contenido como CDATA con <![CDATA[ … ]]>.

Los navegadores tratarán XHTML como texto/html utilizando reglas HTML que conducen a una gran bola de maldad mientras intenta escribir el código correcto bajo ambos conjuntos de reglas.

La forma más sencilla de evitar problemas es mantener scripts en archivos externos y utilizar el atributo src para incluirlos.

+0

1 Para mencionar XHTML también. – Gumbo

+0

Como ya tenía * * XHTML (en jsFiddle, también) 1 para los "navegadores tratarán XHTML servido como text/html usando reglas HTML" parte. – AndreKR

+0

@AndreKR: Es el tipo de medio MIME que importa, no el contenido. – Gumbo

10

Sí, el content model of STYLE and SCRIPT es especial:

Aunque los STYLE y SCRIPT elementos usan CDATA por su modelo de datos, para estos elementos, CDATA debe ser manejado de manera diferente por los agentes de usuario. El marcado y las entidades se deben tratar como texto sin formato y pasar a la aplicación como está. La primera aparición de la secuencia de caracteres "</" (etiqueta de fin delimitador abierto) se trata como que termina al final del contenido del elemento. En documentos válidos, esta sería la etiqueta final para el elemento.

Cuestiones relacionadas