2008-11-12 6 views

Répondre

7

Non, il n'y a pas de support pour cela dans JavaScript. Et cette solution semble très problématique car vous perdez la possibilité d'avoir des barres obliques.

J'ai moi-même été confronté à ce problème lorsque j'ai dû créer un message d'alerte ou quelque chose à partir d'un backend ASP.NET, et le coller dans une alerte JavaScript sur le frontal. Le problème était que les développeurs pouvaient entrer n'importe quoi dans la méthode Page.Alert().

Ce que je l'ai fait pour résoudre c'était la suivante:

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

Ce n'était qu'un exemple, bien adapté à la question donnée (chemin Windows). Vous pouvez remplacer/par n'importe quel personnage. – PhiLho

2

Je Réitérons ce qui a été dit avant - les chaînes verbatim ne sont pas possibles en javascript. Il est en fait facile d'échapper des caractères d'échappement valides comme \n \\ \t etc, mais le problème vient de l'échappement des caractères non valides en raison de la façon dont ils sont gérés dans les différentes fonctions, ils deviennent incompatibles. Par exemple

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

Aussi, si vous regardez un tableau de caractères spéciaux illégaux par exemple ["\a"] le personnage simplement ressembler à un a. Cela rend ce que vous voulez essentiellement impossible.

Espérons qu'au moins, il le nettoie pour vous.

3

Big bidouille d'une solution de contournement ...

<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

Cela a de nombreux effets secondaires, vous feriez mieux d'espérer qu'il n'y a pas de & dans votre chaîne. –

+3

@Juan Mendes: Quelle partie de "Big kludge" n'avez-vous pas compris? –

+8

De Wikipedia: "Un kludge (ou kluge) est une solution de contournement, une solution rapide et sale, un maladroit ou inélégant, ** mais efficace ** ..." Votre solution produit de mauvais résultats avec une simple entrée, ne même qualifier comme un kludge. –

7

chaînes de modèle ne pas les sauts de ligne de soutien.

`so you can 
do this if you want` 

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

Il n'empêche pas bien sûr l'expansion de se produire le dans le texte, et par extension, l'exécution de code mais peut-être est une bonne chose?

Note: Je ne pense pas qu'il y ait un moyen de prendre une chaîne existante et l'exécuter par interpolation d'expression. Cela rend impossible l'injection de code de cette façon puisque le code doit provenir de la source. Je ne connais pas d'API capable de faire une interpolation d'expression à la demande.

Remarque 2: Les chaînes de modèle sont une fonctionnalité ES2015/ES6. Support dans tous les navigateurs sauf (attendez-le ...) IE! Toutefois, Edge prend en charge les chaînes de modèles.

Note 3: Les chaînes de modèle étendent les séquences d'échappement, si vous avez une chaîne dans une chaîne, cette chaîne développera ses séquences d'échappement.

`"A\nB"` 

... se traduira par:

"A 
B" 

...qui ne fonctionnera pas avec JSON.parse parce qu'il y a maintenant une nouvelle ligne dans le littéral de chaîne. Ça pourrait être bon à savoir.

+0

Merci, cela a fonctionné pour moi. J'avais besoin d'un moyen rapide d'obtenir des codes de caractères pour les tests et cela a bien fonctionné. – Teorist

4

C'est un fil très vieux, mais toujours est ici une solution de contournement:

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

que vous utiliserez comme ceci:

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

Fondamentalement, ce qui se passe ici est que js traite des commentaires en effet comme des chaînes de verbatim. En outre, ceux-ci sont stockés avec la fonction. Donc, ce qui se passe ici, c'est que nous créons une fonction avec des commentaires verbatim que nous extrayons dans la fonction verbatim.

+0

Je ne sais pas pourquoi il est question d'échapper des caractères et de remplacer des chaînes car cela semble être le contraire de verbatim - bien que l'OP comparé entre programmation et JS n'a pas dit qu'il avait besoin d'interopérabilité entre eux. Cette réponse fonctionne d'une manière élégante et surprenante - cela a éclairé ma journée! Mais la simple copie du JS m'a donné l'erreur "Impossible d'obtenir la propriété '1' de référence indéfinie ou nulle". Changer l'instruction de retour à 'return fn.toString(). Split ("/* ") [1] .split (" */") [0]' pour obtenir seulement tout ce qui est entre les commentaires fait ce dont j'ai besoin. avec mes remerciements. – wunth

0

Il suffit d'utiliser String.raw()

String.raw`\n` 

volonté sortie

\\n 

Mais je ne sais pas comment résoudre le cas:

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

Je ne sais pas comment faire face ` :(