我只是在使用javascript上的问题我正在使用asp.net上的代码,经过几个小时的计算后发现它变成了转义字符的问题。
起初我使用它。
ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can't delete this data because it is bound with rate plan');", true);
这会导致javascript错误,因为“不能”的引号需要使用转义字符,所以我使用。
ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can\'t delete this data because it is bound with rate plan');", true);
但它仍无效。
最后我用
ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can\\'t delete this data because it is bound with rate plan');", true);
没关系。
我很好奇为什么我们需要使用\\'
代替\'
才能使转义字符正常工作。
答案 0 :(得分:7)
\
是JavaScript中C#和中的转义字符。
当你给C#"\'"
时,会创建一个包含撇号的字符串。
当您提供C#"\\'"
时,第一个\
会转义第二个\
(因此第二个\
不会被视为转义字符)和{{ 1}}被视为普通'
(因为该字符串未与'
分隔。
答案 1 :(得分:3)
在ac#字符串中,\
需要进行转义,因为它是\n
等内容的特殊前缀。您可能会发现使用逐字strig文字更容易,不需要转义("
到""
除外)。
例如:
@"... can\'t ..."
注意字符串文字之前的前导@
,表示替代转义规则的用法。这也允许在字符串中直接使用换行符,即
@"foo
bar
blip"
答案 2 :(得分:3)
因为“\”也是C#的转义字符。
我更喜欢在字符串开始之前使用@ special运算符,因为它告诉C#它不能处理转义字符。
例如:
ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", @"alert('Can\'t delete this data because it is bound with rate plan');", true);
无论如何,我没有找到单一的观点。您可以使用双字符串表示法避免转义此单引号:
ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert(\"Can't delete this data because it is bound with rate plan\");", true);
我不理解JavaScript中滥用单引号的情况,如果我不记得有很多PHP编码器贡献脚本,因为这种语言的行为方式不同,取决于单引号或双引号字符串。 / p>
无论如何,您可以在JavaScript中查看有关单引号和双引号的其他问题:
答案 3 :(得分:1)
当您使用 \\ 时,它将转义为逃脱角色的实际javascript中的 \ 。你本质上是逃避两次
答案 4 :(得分:0)
名称中的单引号和撇号(例如O'Brian)通常会在动态客户端脚本中造成麻烦,因为它们会破坏它们并允许插入恶意代码(即脚本攻击)。
我为代码隐藏编写了以下 C#6 扩展方法来解决此问题:
// contains apostroph (aka single quote) and is dangerous for your script block
var name = "O'Brian";
var nameEscp = name.ToSQEscapedStringJS(); // creates JS expression from it
// building up the script
string strScript =
$"<script>window.opener.document.forms(0).{control.Value}.value = {nameEscp};</script>";
ClientScript.RegisterClientScriptBlock(this.GetType(), "anything", strScript);
它的用法很简单。请考虑以下动态脚本示例:
nameEscp
注意 =
已被单引号包围,因此您可以安全地将其放在.value = ('O@@@Brian'.replace(/@{3}/g, String.fromCharCode(0x27));
之后。
诀窍是字符串被转义并且在分配时立即转义(通过执行JavaScript表达式),即
.value
将是插入的赋值表达式,它将作为脚本发送到客户端。执行后,O'Brian
包含<!DOCTYPE html>
<html lang="en">
<head>
<title>Modal Popup Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2>Modal Popup Example</h2>
<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>
<!-- Modal -->
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Modal Header</h4>
</div>
<div class="modal-body">
<p>Some text in the modal.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
。