2009-11-02 18 views
33

Me encuentro con un problema donde tener una etiqueta de script de finalización dentro de una cadena entrecomillada en JavaScript, y está matando la secuencia de comandos. Supongo que esto no es un comportamiento esperado. Un ejemplo de esto se puede ver aquí: http://jsbin.com/oqepe/editEtiqueta de script en cadena de JavaScript

Mi buscador de casos de prueba para el interesado: Mozilla/5.0 (X11; U; Linux i686; es-US; rv: 1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.4.

Respuesta

64

¿Qué ocurre?

El analizador HTML del navegador verá el </script> dentro de la cadena y lo interpretará como el final del elemento script.

Mira el coloreado de sintaxis de este ejemplo:

<script> 
var test = 'foo... </script> bar.....'; 
</script> 

notar que la palabra barra está siendo tratado como contenido de texto exterior del elemento de guión ...

Una técnica muy utilizada es para utilizar el operador de concatenación:

var test = '...... </scr'+'ipt>......'; 
+3

Esto funciona, pero estoy sorprendido de que tengo que hacerlo. Parte del problema es que estoy raspando una página y almacenando los resultados en una variable JS. No tengo expectativas reales de lo que está volviendo. – re5et

+0

¿Cómo lo almacena en una variable? ¿Estás raspando el lado del servidor y luego generando 'var x = ;'? Si es así, no te olvides de codificar JSON. – orip

+12

Escape de/no separe la cuerda en partes. IIRC sigue siendo un error en HTML 4.x. Ciertamente es más complicado escribir, más complicado de leer, más personajes con los que lidiar y menos eficiente (ya que la concatenación de cadenas no es la más barata de las operaciones de JS) – Quentin

11

Tienes que escapar, de lo contrario será una parte del HTML.

var test = 'what the hell... \<\/script\> \<h1\>why?!?!?!\<\/h1\>'; 
+5

esto es incorrecto. esta es una variable que está almacenando texto. No está insertado en el HTML. Usar una etiqueta que no sea una secuencia de comandos no tendrá los mismos resultados. – re5et

+0

Es la forma en que se está procesando XML. También puede ajustar la secuencia de comandos con . No sucederá con otras etiquetas debido a la forma en que funciona el analizador XML (en especial, trata la secuencia de comandos como texto y no como código). – LiraNuna

+1

@LiraNuna Umm. No. Un analizador XML tratará '' como "Fin del script" y '' como un error de buena forma. Un analizador de HTML tratará '' como "fin del guión" y luego, si es '' como "Error al manejar indefinido por la especificación". Solo un analizador de sopa de etiquetas (y posiblemente un analizador de HTML5, no he leído el borrador lo suficiente como para estar seguro) tratará '' como parte del guión. – Quentin

Cuestiones relacionadas