2008-11-12 7 views

Antwort

7

Nein, in JavaScript gibt es dafür keine Unterstützung. Und diese Problemumgehung scheint sehr problematisch zu sein, da Sie jetzt die Fähigkeit verlieren, Schrägstriche zu haben.

Ich bin selbst auf dieses Problem gestoßen, als ich eine Warnmeldung oder etwas aus einem ASP.NET-Back-End erstellen und in eine JavaScript-Warnung am Frontend stecken musste. Das Problem war, dass Entwickler alles in der Page.Alert() -Methode eingeben konnten.

Was ich tat, war dies wie folgt zu lösen:

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

Es war nur ein Beispiel, gut geeignet für die gegebene Frage (Windows-Pfad). Du kannst/durch irgendein Zeichen ersetzen. – PhiLho

2

Ich werde wieder wiederholen, was bereits gesagt worden ist - wörtlich Strings in Javascript nicht möglich sind. Es ist eigentlich einfach, gültige Escape-Zeichen wie \n \\ \t usw. zu umgehen, aber das Problem kommt von der Entschlüsselung ungültiger Zeichen aufgrund der Art, wie sie in den verschiedenen Funktionen behandelt werden, die sie inkompatibel werden. Zum Beispiel

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

Auch wenn Sie bei einer Reihe von illegalen Sonderzeichen aussehen zB ["\a"] der Charakter aussehen wird wie ein a. Dies macht das, was Sie wollen, praktisch unmöglich.

Hoffe, dass es zumindest für Sie aufklärt.

3

Big Flickschusterei von Problem zu umgehen ...

<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

Dies hat zahlreiche Nebenwirkungen, Sie hoffen besser, dass es keine & in Ihrer Zeichenfolge gibt. –

+3

@Juan Mendes: Welchen Teil von "Big Kludge" hast du nicht verstanden? –

+8

Aus Wikipedia: "Ein Klud (oder Kluge) ist ein Workaround, eine schnelle und schmutzige Lösung, ein tollpatschiges oder unelegantes, ** aber effektives ** ..." Ihre Lösung erzeugt falsche Ergebnisse mit einfacher Eingabe, nicht gilt sogar als Kludge. –

7

Template Strings Unterstützung Zeilenumbrüche tun.

`so you can 
do this if you want` 

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

Es ist nicht natürlich Expansion verhindert die im Text vorkommen, und durch die Erweiterung, die Ausführung von Code, aber vielleicht ist das eine gute Sache?

Hinweis: Ich glaube nicht, dass es eine Möglichkeit, eine bestehende Zeichenfolge zu nehmen und es durch Ausdruck Interpolation ausgeführt werden. Dies macht es unmöglich, Code auf diese Weise zu injizieren, da der Code aus der Quelle stammen muss. Ich kenne keine API, die Expression-Interpolation nach Bedarf ausführen kann.

Hinweis 2: Template-Strings sind eine ES2015/ES6-Funktion. Unterstützung in jedem Browser außer (warten Sie darauf ...) IE! Edge unterstützt jedoch Vorlagenzeichenfolgen.

Hinweis 3: Template-Strings erweitern Escape-Sequenzen. Wenn Sie einen String in einem String haben, wird dieser String seine Escape-Sequenzen erweitern.

`"A\nB"` 

... wird in Folge:

"A 
B" 

...was nicht funktioniert mit JSON.parse, weil es jetzt eine neue Zeile im String-Literal gibt. Könnte gut sein zu wissen.

+0

Danke, das hat bei mir funktioniert. Ich brauchte einen schnellen Weg, um Zeichencodes zum Testen zu bekommen, und das funktionierte gut. – Teorist

4

Dies ist ein sehr alter Thread, aber ist immer noch hier eine Abhilfe:

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

, die Sie als diese verwenden:

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

Im Grunde, was hier passiert ist, dass js in der Tat behandelt Kommentare als Verbatim-Strings. Darüber hinaus sind diese zusammen mit der Funktion gespeichert. Was also hier passiert ist, dass wir eine Funktion mit einigen wortgetreuen Kommentaren erstellen, die wir in der Verbatim-Funktion extrahieren.

+0

Ich weiß nicht, warum es so viel über fliehende Charaktere und das Ersetzen von Strings gibt, da dies das Gegenteil von Verbatim zu sein scheint. Obwohl der OP zwischen Programmierung und JS verglichen hat, hat er nicht gesagt, dass er Interoperabilität zwischen ihnen benötigt. Diese Antwort funktioniert auf eine elegante und überraschende Art und Weise - es hat meinen Tag aufgehellt! Aber nur das Kopieren der JS gab mir den Fehler "Unable to property '1' von undefined oder Null Referenz". Ändere die return-Anweisung in 'return fn.toString(). Split ("/* ") [1] .split (" */") [0]' um nur alles zwischen den Kommentaren zu erhalten, habe ich das getan. mit Dank. – wunth

0

Verwenden Sie einfach String.raw()

String.raw`\n` 

ausgeben werden

\\n 

Aber ich weiß nicht, wie der Fall zu lösen:

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

Ich weiß nicht, wie man mitumgeht:(

Verwandte Themen