2008-11-12 11 views

Respuesta

7

No, no hay soporte para eso en JavaScript. Y esa solución parece muy problemática ya que ahora pierde la capacidad de tener barras diagonales.

Me he encontrado con este problema yo mismo cuando necesitaba crear un mensaje de alerta o algo de un back-end de ASP.NET, y pegarlo en una alerta de JavaScript en el front-end. El problema era que los desarrolladores podían ingresar cualquier cosa en el método Page.Alert().

Lo que hice para solucionar este fue el siguiente:

public void Alert(string message) 
{ 
    message = message.Replace("\\", "\\\\") 
     .Replace("\r\n", "\n") 
     .Replace("\n", "\\n") 
     .Replace("\t", "\\t") 
     .Replace("\"", "\\\""); 

    // and now register my JavaScript with this safe string. 
} 
+2

Fue solo un ejemplo, muy adecuado para la pregunta dada (ruta de Windows). Puedes reemplazar/por cualquier caracter. – PhiLho

2

Voy a reiterar lo que se ha dicho antes - cadenas literales no son posibles en javascript. De hecho, es fácil escapar de los caracteres de escape válidos, como \n \\ \t, etc. pero el problema proviene del escape de caracteres no válidos debido a la forma en que se manejan en las diferentes funciones que se vuelven incompatibles. Por ejemplo

"\a".replace("\a","\\a")  // WORKS \a 
"aa\a".replace("\a", "\\a") // FAILS \aaa 

Además, si nos fijamos en una matriz de caracteres especiales ilegales por ejemplo ["\a"] el carácter sólo se verá como un a. Esto hace que hacer lo que quieres sea esencialmente imposible.

Espero que al menos lo aclare.

3

Gran kludge de una solución ...

<html> 
<head> 
<script> 
function foo() { 
    var string = document.getElementById('foo').innerHTML; 
    alert(string); 
} 
window.onload=foo; 
</script> 
<style> 
#foo{ 
    display: none; 
} 
</style> 
</head> 
<body> 
Calling foo on page load. 
<div id="foo">\\server\path\to\file.txt</div> 
</body> 
</html> 
+0

Esto tiene numerosos efectos secundarios, es mejor que no haya & en su cadena. –

+3

@Juan Mendes: ¿Qué parte de "Big kludge" no entendiste? –

+8

De Wikipedia: "Un kludge (o kluge) es una solución temporal, una solución rápida y sucia, una torpe o poco elegante, ** pero efectiva ** ..." Su solución produce resultados incorrectos con una entrada simple, no lo hace incluso calificar como un kludge. –

7

cadenas de la plantilla do saltos de línea de apoyo.

`so you can 
do this if you want` 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

Esto no impide, por supuesto, la expansión se produzca el en el texto, y por extensión, la ejecución de código, pero tal vez eso es una buena cosa?

Nota: no creo que hay una manera de tomar una cadena existente y ejecutarlo a través de interpolación de expresión. Esto hace que sea imposible inyectar código de esta manera ya que el código tiene que originarse en la fuente. No sé de una API que pueda hacer interpolación de expresiones a pedido.

Nota 2: Las cadenas de plantillas son una función ES2015/ES6. Soporte en todos los navegadores excepto (espere ...) ¡IE! Sin embargo, Edge admite cadenas de plantillas.

Nota 3: Las cadenas de plantillas expanden las secuencias de escape, si tiene una cadena dentro de una cadena, esa cadena ampliará sus secuencias de escape.

`"A\nB"` 

... se traducirá en:

"A 
B" 

...que no funcionará con JSON.parse porque ahora hay una nueva línea en el literal de cadena. Sería bueno saberlo.

+0

Gracias, esto funcionó para mí. Necesitaba una forma rápida de obtener códigos de caracteres para las pruebas y esto funcionó bien. – Teorist

4

Este es un hilo muy antiguo, pero sigue aquí es una solución:

function verbatim(fn){return fn.toString().match(/[^]*\/\*\s*([^]*)\s*\*\/\}$/)[1]} 

que va a utilizar como esto:

var myText = verbatim(function(){/*This 
is a multiline \a\n\0 verbatim line*/}) 

Básicamente lo que ocurre aquí es que js trata los comentarios de hecho como cadenas verbatim. Además, estos se almacenan junto con la función. Entonces, lo que sucede aquí es que creamos una función con algunos comentarios verbatim que extraemos en la función textual.

+0

No sé por qué se habla de escapar caracteres y reemplazar cadenas, ya que parece ser lo opuesto a textualmente, aunque el OP comparado con programación y JS no indicaba que necesitara interoperabilidad entre ellos. Esta respuesta funciona de una manera elegante y sorprendente, ¡me iluminó un poco el día! Pero solo al copiar el JS me dio el error "No se pudo obtener la propiedad '1' de referencia indefinida o nula". Cambiar la declaración return para 'devolver fn.toString(). Split ("/* ") [1] .split (" */") [0]' para obtener solo todo lo que haya entre los comentarios, hice lo que necesitaba. con gracias. – wunth

0

sólo tiene que utilizar String.raw()

String.raw`\n` 

es la salida

\\n 

Pero no sé cómo resolver el caso:

String.raw`hello`hello` // It will throw an TypeError 
String.raw`hello\`hello` // Output is 'hello\\`hello' 

No sé cómo lidiar con ` :(

Cuestiones relacionadas