转义传递给onclick事件中js函数的字符串中的可能引号

时间:2011-12-21 17:26:46

标签: javascript jsp quotes

我在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}}。

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

4 个答案:

答案 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字符串文字传递给myFunctescape是一个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)}');"