2010-01-31 22 views
6

Lo que necesita ser escapado exactamente en las cadenas de javascript. O, más específicamente, ¿por qué¿Por qué necesito escapar del carácter '/' en JavaScript?

var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px"></script>'; 

dan un error de sintaxis? Escapar el <\/script> final parece arreglar el error de sintaxis, pero esto no tiene sentido para mí como un principiante de javascript.

+2

Consulte http://mathiasbynens.be/notes/etago para obtener una explicación detallada. –

Respuesta

11

El problema puede ser que el navegador web ve la secuencia "</script>" y decide que es el final del bloque de scripts.

Otra forma de solucionar el problema aparte de usar una secuencia de escape como lo hizo es romperlo en 2 cadenas que se concatenan:

"<" + "/script>" 

El comportamiento que estamos viendo es no un error n la parte del navegador.

Los navegadores no "miran dentro" de un bloque de scripts, solo pasan el contenido al motor de scripts. La secuencia "</script>" es como saben que han llegado al final del bloque, y como el navegador no interpreta el contenido del bloque, no tiene forma de saber que está en el contexto de una cadena literal en el código de script

Recuerde que los navegadores pueden admitir más lenguajes de guiones que solo Javascript, incluso si no se ve comúnmente. Internet Explorer es compatible con VBscript (y creo que cualquier lenguaje de scripts que pueda ejecutar un servidor de secuencias de comandos de Windows, pero no estoy seguro de eso). Y cuando la capacidad de tener bloques de script se puso en los navegadores desde mucho antes, nadie podía estar seguro de que el Javascript fuera a ser tan universal.

+0

Lo he visto en el código de Google Analytics. +1 –

+0

De hecho, también ves "" mucho en esta misma situación. – JAL

+0

¿Es esto un error? Parece una cosa bastante fácil de analizar. – Tristan

2

El analizador HTML interpretará el final de Token de etiqueta (delimitador ETAGO </) de la cadena, como el final de la etiqueta script actual, dándole la cadena incompleta SyntaxError.

Hay varias soluciones, incluyendo el uso de CDATA bloques, pero la forma más sencilla consiste en escapar de ese carácter, o hacer una concatenación de cadenas:

var snaphtml = '<script src="...">\x3C/script>'; 

var snaphtml = '<script src="..."><' + '/script>'; 

Y, por supuesto, también puede crear su elemento script programación y añadirlo a la cabeza:

var newScript = document.createElement("script"); 
newScript.src = "..."; 
//... 
+0

¿El analizador de HTML no se da cuenta de que estoy en una cadena? Parece extraño. – Tristan

4

en realidad estás corriendo en un problema html-escape: el navegador interpreta </script> en su cadena como el primer tag para el script elemento en el que está incrustado el javascript - así al navegador, su línea parece que le falta el cierre comilla simple:

var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px"> 

solucionarlo, ya que has encontrado, sólo tiene que cambiar </script> a cualquier otra cosa, como <\/script> o \074/script>, etc.

Los únicos caracteres por los que normalmente debe preocuparse en una cadena de javascript son comillas dobles (si está citando la cadena con una comilla doble), comillas simples (si está citando la cadena con una comilla simple), barra diagonal inversa, retorno de carro (\ r) o salto de línea (\ n).

Cuestiones relacionadas