2010-02-21 9 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。