2008-11-12 119 views

回答

7

不,在JavaScript中不支持。这种解决方法似乎很成问题,因为你现在失去了正斜杠的能力。

当我需要从ASP.NET后端创建警报消息或其他东西时,我自己遇到了这个问题,并将其粘贴在前端的JavaScript警报中。问题是开发人员可以在Page.Alert()方法中输入任何内容。

我做了什么来解决这个如下:

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

这只是一个例子,非常适合给定的问题(Windows路径)。你可以替换/任何角色。 – PhiLho 2008-11-12 16:54:35

2

我再次重申什么了之前说的 - 逐字的字符串是不可能的JavaScript。它实际上很容易逃脱像\n \\ \t等有效的转义字符,但问题来自逃避无效字符,因为他们在不同的功能处理方式,他们变得不兼容。例如

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

此外,如果你看的非法特殊字符数组,例如["\a"]该角色会只是看起来像一个a。这使得做你想要的东西基本上不可能。

希望至少为你清除它。

3

一个解决办法的大杂牌...

<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

这有很多副作用,你最好希望在你的字符串中没有&。 – 2011-06-30 20:22:59

+3

@Juan Mendes:“大kludge”的哪部分你不了解? – 2011-06-30 21:17:36

+8

维基百科,自由的百科全书跳转至:导航,搜索维基百科,自由的百科全书跳转至:导航,搜索维基百科,自由的百科全书跳转至:导航,搜索维基百科,自由的百科全书跳转至:甚至有资格作为杂食。 – 2011-06-30 22:06:31

7

模板串做支撑​​换行符。

`so you can 
do this if you want` 

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

这当然并不阻止扩展在文本中出现的,并推而广之,代码执行,但也许这是好事吗?

注:我不认为有一种方式来利用现有的字符串,并通过表达插补运行它。这使得不可能以这种方式注入代码,因为代码必须源自源代码。我不知道可以按需进行表达式插值的API。

注2:模板字符串是ES2015/ES6功能。除了(等待它......)IE之外,在每个浏览器中都支持!但是,Edge支持模板字符串。

注3:模板字符串展开转义序列,如果在字符串内部有一个字符串,该字符串将展开其转义序列。

`"A\nB"` 

...将导致:

"A 
B" 

...这不会与JSON.parse一起工作,因为现在在字符串文字中有一个换行符。可能很高兴知道。

4

这是一个非常古老的线程,但还是这里有一个解决方法:

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

,你会这样使用:

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

基本上就是在这里发生的是,js的治疗意见的确作为逐字串。此外,这些都是随功能一起存储的。因此,这里发生的是我们创建了一个函数,其中包含一些我们在逐字函数中提取的逐字评论。

0

只需使用String.raw()

String.raw`\n` 

将输出

\\n 

但我不知道如何解决的情况下:

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

我不知道如何处理` :(