【问题标题】:jQuery, comments posted with quotes aren't working, otherwise it works greatjQuery,带引号的评论不起作用,否则效果很好
【发布时间】:2012-06-18 21:03:12
【问题描述】:

如果我发表类似“hello there dog”之类的评论,效果会很好,但如果有任何特殊字符(如 ' 或 "),则评论已成功发布到数据库,但 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"}

【问题讨论】:

  • 您使用什么服务器端语言?此外,您是否考虑过返回一个 real JSON 对象并在 jQuery 中构造 HTML,而不是返回带有服务器准备的 HTML 的 JSON?
  • 我正在使用 Coldfusion... 最好不要使用服务器准备的 HTML?这是为什么呢?
  • JSON 很棒,但如果您要返回 HTML,最好将其返回为 HTML 而不是 JSON,以减少服务器和客户端所需的不必要处理,并且代码会更简洁.或者正如 BalusC 提到的,您可以走另一条路并返回 JSON 并在客户端构建 HTML。这三个在技术上都可以工作,但 JSON 上的 HTML 可能是最难处理的问题。

标签: java jquery html coldfusion


【解决方案1】:

您的 ColdFusion 是什么样的(至少是您向浏览器返回内容的部分)?如果 BalusC 需要在返回数据中转义 html 字符是正确的,那么您可以使用 HTMLEditFormat 函数包装您的文本,而不需要用 Java 编写任何内容。

【讨论】:

    【解决方案2】:

    尝试类似:

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

    【讨论】:

    • 问题说:评论已成功发布到数据库 所以我不认为这是问题;)
    • 更正评论已成功发布到数据库。我试过了,但它会将评论发送回 12weqdsa%27asdadasd%27
    【解决方案3】:

    如果你在服务器端准备HTML,你需要确保用户控制输入中所有保留的HTML字符都被正确转义,否则可能会导致JS代码变成语法无效(并使您的网站容易出现XSS)。您需要至少将保留的 HTML 字符 &amp;lt;&amp;gt;&amp;amp;"' 转义为 HTML 实体 &amp;lt;&amp;gt;&amp;amp;,分别为&amp;quot;&amp;apos;

    您提到您正在使用基于 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 Lang StringEscapeUtils#escapeHtml4 可以用作

    input = StringEscapeUtils.escapeHtml4(input);
    

    再一次,仅对用户控制的输入执行此操作。您不需要对在服务器端代码中硬编码的任何 HTML 代码执行此操作(否则它将按原样显示)。因此,请执行以下操作:

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

    也就是说,我已经在您的问题中评论说您最好在 jQuery 中执行此操作,因为这对于可维护性和可重用性来说要好得多。您不希望在 Java 代码深处隐藏原始 HTML。您也不想让 JSON 结果依赖于目的。只需返回一个通用的(和经过 HTML 过滤的)JSON 结果,然后让 jQuery 构建 HTML。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多