我遇到了传递参数的问题,我认为我应该能够优雅地解决(使用1行代码),但我似乎无法解决问题。我有一个删除项目的链接,如下所示:
<a href="javascript:confirmDelete('${result.headline}',${result.id});">
当result.headline包含像'或'等字符或其他破坏javascript调用的字符时出现问题。我已经尝试${fn:replace(result.headline,"'","")}
修复了问题'但是我想做某种URLEncode(我认为)所以这些角色不会打破javascript调用。有关如何在不改变后端任何内容的情况下修复此问题的任何想法?
答案 0 :(得分:3)
避免在元素中放入内联JavaScript,特别是javascript:
伪URL(除了永远不应该使用的邪恶之外)是HTML-in-URL-in-HTML。你必须采取标题:
\
,'
,控制字符和可能的Unicode字符,或者只使用JSON编码器为您执行此操作。)然后,最好将数据放在标记中,您只需要像其他地方一样担心简单的HTML编码,以避免跨站点脚本:
<a href="#" class="confirmdelete-${fn:escapeXml(result.id)}" title="${fn:escapeXml(result.headline)}">Delete</a>
让JavaScript解压缩它们:
<script type="text/javascript">
for (var i= document.links.length; i-->0;) {
var link= document.links[i];
if (link.className.indexOf('confirmdelete-')===0) {
link.onclick= function() {
confirmDelete(this.title, this.className.substring(14));
return false;
};
}
}
</script>
(使用实用程序函数或框架可能有更简单,更简洁或更清晰的方式来编写上述内容,并且有一个争论是关于链接是否真的是这种操作的正确标记,但这是基本的想法。)
答案 1 :(得分:0)
只要您可以依赖字符串没有换行符这一事实,您只需要将所有反斜杠加倍并转义所有单引号。
例如:
replace(replace(result.headline, "\\", "\\\\"), "'", "\\'")
这可能不是您服务器端语言中的有效语法;我不承认。