2011-12-21 49 views
1

我有一个JSPX以下循环:逃避传递给js函数字符串可能报价在onclick事件

<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}");escape('${var.title}');

关于如何解决这个问题的任何想法?谢谢。

回答

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()可能就足够了。

+0

这为我工作。是的,这不应该做客户端,但不幸的是我没有权力。我知道它只会是文本,所以我使用了escapeXml。谢谢。 – Stephan 2011-12-22 11:34:47

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; 
} 
0

你需要通过有效的JavaScript字符串字面值为myFunctescape是一个JavaScript函数,它也需要一个有效的字符串。因此,您需要将Java String转换为有效的JavaScript文本。使用apache commons-lang StringEscapeUtils.escapeECMAScript来转义它。您可以将其设置为EL功能,因此可以使用类似于

onClick="myFunct('${myFn:escapeJs(var.url)}','${myFn:escapeJs(var.title)}, '${myFn:escapeJs(var.descr)}');" 
1

你不需要创建自己的EL功能,而是直接从您的自定义.TLD使用Apache的公地:

<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>