我在jspx中有以下循环:
<c:forEach var="var" items="${dataFile.list.rows}">
<li>
<div>
<a href="#" onClick="myFunct('${var.url}','escape(${var.title}),'escape(${var.descr})');">
<img width="108" height="66" alt="" src="${var.img}" />
</a>
</div>
</li>
</c:forEach>
函数myFunct自己做了一些事情。当${var.title}
或${var.descr}
包含引号或双引号时,我的问题就出现了。我事先无法知道是否会有某些或哪些。
我尝试了上面的内容,我在元素之前尝试了一个小帮助js部分,但不知道我将要使用哪种引号我无法猜测是否需要放escape("${var.title}");
或{ {1}}。
关于如何解决这个问题的任何想法?感谢。
答案 0 :(得分:2)
您应该在服务器端执行此操作,而不是在客户端执行此操作。无论如何,在客户端这样做太晚了。根据值的唯一目的,它是否将用作HTML的一部分并且不包含换行符,或者作为JS代码,您可以使用JSTL提供的EL函数fn:escapeXml()
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<a onclick="myFunct('${var.url}','${fn:escapeXml(var.title)}','${fn:escapeXml(var.descr)}');">
或创建一个自定义EL函数,该函数使用了Apache Commons Lang StringEscapeUtils#escapeJavaScript()
。
<%@taglib prefix="my" uri="http://example.com/functions" %>
...
<a onclick="myFunct('${var.url}','${my:escapeJs(var.title)}','${my:escapeJs(var.descr)}');">
您可以在this answer底部找到如何创建EL函数的具体示例。
我猜它会被用作HTML的一部分,所以fn:escapeXml()
就足够了。
答案 1 :(得分:1)
您不需要创建自己的EL函数,但可以直接从自定义.tld中使用apache-commons:
<function>
<name>escapeJavaScript</name>
<function-class>org.apache.commons.lang.StringEscapeUtils</function-class>
<function-signature>java.lang.String escapeJavaScript(java.lang.String)</function-signature>
</function>
答案 2 :(得分:0)
我建议您在服务器上进行编码 http://www.roseindia.net/jsp/jsp-url-encoding.shtml
或将内容存储在隐藏元素中
<span id="url" style="display:none">${var.URL}</span>
<span id="title" style="display:none">${var.title}</span>
<span id="desc" style="display:none">${var.descr}</span>
并执行onClick="return myFunct(['url','title','desc'])">...</a>
function myFunct(parms) {
var url = parms[0]?document.getElementById(parms[0]).innerHTML:"No url";
var title = parms[1]?document.getElementById(parms[1]).innerHTML:"No title";
var descr = parms[2]?document.getElementById(parms[2]).innerHTML:"No description";
return false;
}
答案 3 :(得分:0)
您需要将有效的JavaScript字符串文字传递给myFunct
。 escape
是一个JavaScript函数,它也需要一个有效的String。因此,您需要将Java String转换为有效的JavaScript文本。使用apache commons-lang StringEscapeUtils.escapeECMAScript
来逃避它。你可以把它变成EL函数,因此使用像
onClick="myFunct('${myFn:escapeJs(var.url)}','${myFn:escapeJs(var.title)}, '${myFn:escapeJs(var.descr)}');"