如何在onClick处理程序中的JavaScript代码中转义字符串?
也许我只是想这太难了,但我有一个问题搞清楚在链接的onClick处理程序内的一些JavaScript代码中使用字符串的内容。 例:
<a href="#" onclick="SelectSurveyItem('<%itemid%>', '<%itemname%>'); return false;">Select</a>
<%itemid%>
和<%itemname%>
是模板替换发生的地方。 我的问题是项目名称可以包含任何字符,包括单引号和双引号。 目前,如果它包含单引号,则会打破JavaScript代码。
我的第一个想法是使用模板语言的函数来JavaScript - 转义项名称,它只是转义引号。 这不会解决包含破坏链接HTML的双引号的字符串的情况。 这个问题通常如何解决? 我需要HTML转义整个onClick处理程序吗?
如果是这样,那看起来很奇怪,因为模板语言的转义函数也会将括号,引号和分号HTML化...
此链接正在为搜索结果页面中的每个结果生成,因此在JavaScript代码中创建单独的方法是不可能的,因为我需要为每个结果生成一个。
另外,我使用的模板引擎是在我工作的公司内部生成的,因此,针对特定工具包的解决方案对我来说毫无用处。
在JavaScript中,您可以将单引号编码为“ x27”,将双引号编码为“ x22”。 因此,使用这种方法,您可以在JavaScript字符串文字的(双引号或单引号)内引用 x27 x22而不用担心任何嵌入的引号“爆发”您的字符串。
xXX用于chars <127和用于Unicode的 uXXXX,因此具备这些知识,您可以为不在通常白名单中的所有字符创建强大的JSEncode函数。
例如,
<a href="#" onclick="SelectSurveyItem('<% JSEncode(itemid) %>', '<% JSEncode(itemname) %>'); return false;">Select</a>
根据服务器端语言的不同,您可以使用以下其中一种语言:
.NET 4.0
string result = System.Web.HttpUtility.JavaScriptStringEncode("jsString")
Java的
import org.apache.commons.lang.StringEscapeUtils;
...
String result = StringEscapeUtils.escapeJavaScript(jsString);
蟒蛇
import json
result = json.dumps(jsString)
PHP
$result = strtr($jsString, array('' => '\', "'" => "'", '"' => '"',
"r" => 'r', "n" => 'n' ));
Ruby on Rails
<%= escape_javascript(jsString) %>
对每个参数<%itemid%>
和<%itemname%>
分别使用隐藏跨度,并在其中写入它们的值。
例如, <%itemid%>
<span id='itemid' style='display:none'><%itemid%></span>
看起来像<span id='itemid' style='display:none'><%itemid%></span>
并在javascript函数SelectSurveyItem
中选择参数跨越' innerHTML
。
上一篇: How do I escape a string inside JavaScript code inside an onClick handler?