繁体   English   中英

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

[英]escape possible quotes in string passed to a js function in a onclick event

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

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

您应该在服务器端执行此操作,而不是在客户端执行此操作。 无论如何,在客户端进行此操作为时已晚。 根据值的唯一用途,是将其用作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)}');">

您可以在此答案的底部找到一个具体的示例如何创建EL函数。

我猜它会被用作HTML的一部分,所以fn:escapeXml()就足够了。

您不需要创建自己的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>

我建议您在服务器上进行编码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;
}

您需要将有效的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)}');"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM