citas de JavaScript dentro de comillas, problema literal de cadena

Estoy tratando de mostrar el text en una información sobre herramientas de JavaScript

Sigo obteniendo literales de cadenas sin terminar a pesar de que: a) las citas están siendo recortadas, b) no hay saltos de línea

El text que bash mostrar es:

"No, we can't. This is going to be terrible." 

(es una cita de un individuo y quiero que esas citas se muestren en la información sobre herramientas)

Mi herramienta de ayuda funciona como esto

 onMouseOver="Tip('string here')" 

Después de ejecutar la cadena a través de mi function para limpiar javascript

 function jschars($str) { echo preg_replace("/\r?\n/", "\\n", addslashes($str)); } 

Se ve así en HTML:

 onMouseOver="Tip('\"No, we can\'t. This is going to be terrible.\"')" 

Esto me da el error string string sin terminar para el primero \ en Tip ('\

Supongo que es porque estoy tratando de poner citas directamente dentro de las comillas simples, ¿cómo puedo evitar esto en situaciones como esta? (He probado htmlspecial chars, como replace el "con & quot; – sigo recibiendo el error

Es porque estás poniendo comillas dobles dentro del valor de un elemento XML (o html):

 <div onMouseOver="Tip('\"....... 

la barra diagonal inversa no escapa del context de xml / html. Técnicamente, necesitarás codificar la cadena por entidad (después de javascript-escaping de ella). Algo como esto:

 <div onMouseOver="Tip('\&quot;No, we can\'t. This is going to be terrible.\&quot;')" > 

Varios browseres pueden o no lidiar con eso correctamente. Una manera mucho mejor de abordarlo sería darle al elemento un id (o una class, o alguna otra forma para que lo select), luego agregue el mouse sobre el manejador desde un script independiente.

Debido a la estructura de lo que estás haciendo:

 onMouseOver="Tip('string here')" 

… tienes que hacer dos cosas:

  1. Como dijo Lekensteyn, necesitas usar htmlspecialchars para convertir los caracteres HTML especiales en escapes de personajes. Hace cosas como convertir " en &quot; , lo que significa que puede encerrar de forma segura el atributo en " caracteres.

  2. Pero no solo estás usando esto como un atributo, también lo estás poniendo dentro de un literal de cadena, lo que significa que también necesitas hacer JavaScript escapando en la cadena. De lo contrario, (en su caso) un único carácter o barra invertida estropeará la cadena. Entonces su function jschars también necesita (en order) A) Convertir \ a \\ , B) Convertir ' a \' . Eso es lo mínimo, de todos modos, realmente necesita una function exhaustiva de "hacer esto seguro para poner en un literal de JavaScript". A partir de su pregunta, tuve la printing de que estaba haciendo esto de forma manual, pero mejor para automatizarlo por coinheritance.

Fuera de tema : por separado, recomendaría dejar de usar attributes para adjuntar controlleres. En su lugar, busque en attachEvent (IE) y addEventListener (W3C), o mejor aún, mire una biblioteca como jQuery , Closure , Prototype , YUI o cualquiera de varias otras que le aligerarán las cosas. Por ejemplo, asociar un manejador de mouseover a:

Puede usar este controller para manejar el mouseover:

 function handler() { Tip('Your message here'); } 

… que luego se engancha así con material DOM sin procesar (obviamente, harías una function de utilidad para esto):

 var div = document.getElementById('foo'); if (div.attachEvent) { // Uses "onmouseover", not "mouseover" div.attachEvent('onmouseover', handler); } else if (div.addEventListener) { // Uses "mouseover", not "onmouseover" div.attachEvent('mouseover', handler, false); } else { // Fallback to old DOM0 stuff div.onmouseover = handler; } 

Así es como Prototype simplifica ese process de connection:

 $('foo').observe('mouseover', handler); 

Así es como lo hace jQuery:

 $('#foo').mouseover(handler); 

Debería usar htmlspecialchars() para este propósito. El problema es ", pero HTML no comprenderá las citas de JavaScript, por lo que se detiene en \" .

 function jschars($str) { echo htmlspecialchars(preg_replace("/\r?\n/", "\\n", $str), ENT_QUOTES); } 

Puede mantener la cadena en javascript en lugar de HTML. p.ej:

 <a onmouseover="Tip(this, 123)">choice</a> 

Entonces algo como:

 var texts = { 123:"No, we can't. This is going to be terrible.", ... }; function Tip(elm, txtId){ showTip(elm, texts[txtid]; }