2010-02-21 10 views
1

如果我發佈評論,如「hello there dog」它的效果很好,但如果有任何特殊字符,如「或」,評論已成功發佈到數據庫,但jQuery的代碼沒有任何提示顯示在列表中的註釋jQuery,發表評論的評論是行不通的,否則它的效果很好

感謝

function feedbacksubmit() { 
// Show the Ajax Loader 
$("#ajaxloader").css("display","inline"); 
var textsubmitted = $("#feedbackinput").val(); 

if (textsubmitted.length < 5) { 
    alert("Don't forget to write something!"); 
    // Hide the Ajax Loader 
    $("#ajaxloader").css("display","none"); 
} 
else { 
    $.post("/feedback/ajax/insert/", {feedback: textsubmitted}, 
     function(data) { 
      // Place the comment in the top of the list 
      $('<li></li>').prependTo("#comment-list").hide().prepend(data.commenttext2insert).fadeIn('slow'); 
      // Hide the Ajax Loader 
      $("#ajaxloader").css("display","none"); 
      // Clear out the textarea 
      $("#feedbackinput").val(''); 
    }, "json"); 
} 
} 

這裏是不是與上面的jQuery代碼工作的例子迴應:。

{"returnmessage":"The Ajax operation was successful.","returncode":"0","commenttext2insert":"\n\t<div class=\"comment-header\">\n\t\t<span class=\"comment-avatar\">\n\t\t\t<a href=\"\">\n\t\t\t\t\n\t\t\t\t\t<img src=\"/_images/users/photos//17941/nobosh.jpg\" />\t\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t</a>\n\t\t</span>\n\t\t<span class=\"comment-author\">\n\t\t\t<a href=\"\">\n\t\t\t\t<b>BOB Man</b>\n\t\t\t</a>\n\t\t</span>\n\t\t<span class=\"comment-timestamp\">just now</span>\n\t</div>\n\t<div class=\"comment-body\">\n\t\t<p>12wsa\'</p>\n\t</div>\n"} 
+0

您使用哪種服務器端語言?此外,您是否考慮過返回* real * JSON對象並在jQuery中構建HTML,而不是使用服務器準備的HTML返回JSON? – BalusC 2010-02-21 00:20:52

+0

我正在使用Coldfusion ...最好不要使用服務器準備的HTML?爲什麼? – AnApprentice 2010-02-21 00:26:51

+0

JSON非常棒,但是如果您要返回HTML,最好將它作爲HTML而不是JSON返回,以減少服務器和客戶端所需的不必要的處理,並且代碼會更乾淨。或者像BalusC提到的那樣,您可以轉到其他路由並返回JSON並在客戶端構建HTML。所有三個技術上都可行,但HTML over JSON可能是最難處理的問題。 – 2010-02-21 16:34:42

回答

1

你的ColdFusion看起來像什麼(至少是你返回瀏覽器的部分)?如果BalusC在你的返回數據中需要轉義html字符是正確的,那麼你可以用HTMLEditFormat函數包裝你的文本,而不需要用Java編寫任何東西。

1

試着這麼做:

$.post("/feedback/ajax/insert/", {feedback: escape(textsubmitted)}, 
... 
+0

問題說:*評論已成功發佈到數據庫*所以我不認爲這是問題;) – BalusC 2010-02-21 00:28:40

+0

正確評論已成功發佈到數據庫。我嘗試過,但它發回評論爲12weqdsa%27asdadasd%27 – AnApprentice 2010-02-21 00:31:32

0

如果你在服務器端準備HTML,你需要確保在用戶控制輸入所有保留的HTML字符是正確轉義,否則可能會導致JS代碼變得語法無效(並使您的網站容易出現XSS)。你需要逃避至少保留HTML字符<>&,分別&lt;&gt;&amp;&quot;&apos;"'成HTML實體。

您提到您正在使用基於Java的Coldfusion。由於標準Java SE/EE API不提供內置設施來逃避它們,所以您需要自己寫一個,例如

public static final String escapeHTML(String string){ 
    StringBuilder builder = new StringBuilder(); 
    for (char c : string.toCharArray()) { 
     switch (c) { 
      case '<': builder.append("&lt;"); break; 
      case '>': builder.append("&gt;"); break; 
      case '&': builder.append("&amp;"); break; 
      case '"': builder.append("&quot;"); break; 
      case '\'': builder.append("&apos;"); break; 
      default: builder.append(c); break; 
     } 
    } 
    return builder.toString(); 
} 

..這可以用作

input = escapeHTML(input); 

..或者到再次抓住例如Apache Commons LangStringEscapeUtils#escapeHtml4其可以用作

input = StringEscapeUtils.escapeHtml4(input); 

,只爲用戶執行此控制輸入​​。您不需要爲在服務器端代碼中硬編碼的任何HTML代碼執行此操作(否則它將按原樣顯示)。這樣做:

StringBuilder comment = new StringBuilder(); 
comment.append("<div class=\"comment\">"); 
comment.append(escapeHTML(input)); 
comment.append("</div>"); 

這麼說,我已經與你最好這樣做jQuery中的提示你的問題的評論,因爲這是爲了可維護性和可重用性畢竟要好得多。您不希望將原始HTML隱藏在Java代碼深處。您也不想讓JSON結果取決於目的。只需返回一個通用的(和HTML清理的)JSON結果並讓jQuery構建HTML。