2009-09-24 18 views

Respuesta

39

consideran este ejemplo simplificado:

<script> 
document.write("something </script> something"); 
</script> 

del navegador analizador HTML vería la </script> dentro de la cadena de JavaScript e interpretar que a medida que el extremo del elemento de guión.

El analizador HTML no conoce la sintaxis de JavaScript; todo lo que sabe es que el elemento <script> termina en el siguiente </script>.

(También sabe que no puede haber anidado <script> elementos, por lo tanto, la ruptura de la apertura <script>, así como el cierre </script> en su ejemplo.)

+13

Nota : de la misma manera se comporta la coloración del código en SO Observe el "algo" que está siendo tratado como un contenido de texto fuera del elemento de script –

+1

realidad, no, elemento SCRIPT termina en la primera aparición de " ". Consulte: http://www.w3.org/TR/html4/types.html#type-cdata – kangax

+1

¿Es esto una solución para navegadores antiguos o se aplica incluso a los navegadores modernos? – hasen

3

de modo que no quede evaluada, pero se inserta como una cadena.

3

Es una mala forma de evitar que los validadores XML/XHTML y HTML griten en el código fuente.

+2

Entonces, ¿por qué Google Analytics utiliza este método si es malo? "document.write (unescape ("% 3Cscript src = '"+ gaJsHost +" google-analytics.com/ga.js "... ¿por qué incluso lo hacen con document.write? No lo entiendo. – vsync

0

Algunos navegadores tienden a "actuar" para ayunar cuando analizar un documento e inmediatamente intentar ejecutar el javascript cuando encuentren una etiqueta de script (incluso si está en una pieza de js). Para evitar esto, rompen la etiqueta de la etiqueta.

+0

No entendí bien lo que acaba de decir, ¿puede proporcionar más lecturas sobre el tema por favor? Es muy, muy interesante. – vsync

+0

Digamos que abre una página con IE, que tiene document.write ('

4

Supongamos que está escribiendo una herramienta que detecta el comienzo y el final de los bloques de script en un fragmento de texto. Supongamos que se ve

<blah><blahdeblah><script> 

blah blah blah 

blah 

print("</script>") 

print("<script>") 

blah 

</script> 

</blahdeblah></blah> 

Sin conocer la sintaxis del lenguaje de script, ¿cómo se sabe que su herramienta que esta es una bloque de script y no dos bloques de script con ") bla entre ellos?

Un navegador web es .. una herramienta de este tipo es una práctica razonable para asegurarse de que nunca confundir el navegador web por no tener <script> o </script> en su registro a menos que en realidad es una etiqueta de script

0

para una discusión completa de este tema, consulte:
    http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/

La respuesta corta es que su código se analiza en dos pasos discretos.

El primero es XML. Y eso significa que el elemento <SCRIPT> está buscando un </SCRIPT >. Es importante recordar que los elementos XML son independientes del contenido. Eso significa que el analizador no sabe pero que hay JavaScript allí.

Una vez que se tiene el contenido del elemento > < SCRIPT, a continuación, Procesa ese pedazo de texto, que presumiblemente es JavaScript.

Al dividir la etiqueta con un operador de concatenación de cadenas, evita que una constante interrumpa la fase XML.

Una solución simple es poner & lt; y & gt; en el texto Javascript

+2

Todo bien, excepto que se analiza como HTML (es decir, SGML), no XML. HTML tiene una redacción muy específica para ''. De ahí por qué funciona este truco JS. XML, por el contrario, simplemente sería vomitar en el primer '<' dentro, a menos que utilice CDATA (y si usted hace uso de CDATA, entonces no es necesario JS truco). –