2011-12-21 19 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>