在发布ajax Javascript后刷新特定类

在发布ajax Javascript后刷新特定类,javascript,jquery,html,ajax,symfony,Javascript,Jquery,Html,Ajax,Symfony,因此,经过大量研究,我来到这里请求您的帮助,这是我的问题: 我有一个评论系统,在同一个页面上有多个表单(我在Symfony上使用FOSCommentBundle)。我希望能够使用Ajax发布评论(这部分工作正常,没有问题),并在提交帖子后刷新评论部分(我被困在这部分) 下面是一个代码示例: $(document).on(“submit”,“postAjax”,函数(e){ e、 预防默认值(); $(此)。加载Overlay(“显示”); 数据=$(this.serializeObject()

因此,经过大量研究,我来到这里请求您的帮助,这是我的问题:

我有一个评论系统,在同一个页面上有多个表单(我在Symfony上使用FOSCommentBundle)。我希望能够使用Ajax发布评论(这部分工作正常,没有问题),并在提交帖子后刷新评论部分(我被困在这部分)

下面是一个代码示例:

$(document).on(“submit”,“postAjax”,函数(e){
e、 预防默认值();
$(此)。加载Overlay(“显示”);
数据=$(this.serializeObject();
$.ajax({
url:$(this.attr('action'),
键入:“POST”,
成功:函数(){
$(“.comments”).load(window.location.href+“.comments”);
}
});
});

试试这个

$(document).on("submit", ".postAjax", function(e){
    e.preventDefault();
    $(this).LoadingOverlay("show");
    data = $(this).serializeObject();

    var $comment = $(this).next(".comments");

    $.ajax({
        url: $(this).attr('action'),
        type: 'POST',
        success:function(){
            $comment.append("<div />");
            $comment.last("div").load(window.location.href + " .comments");
        }
    });
});
$(document).on(“submit”,“postAjax”,函数(e){
e、 预防默认值();
$(此)。加载Overlay(“显示”);
数据=$(this.serializeObject();
var$comment=$(this.next(“.comments”);
$.ajax({
url:$(this.attr('action'),
键入:“POST”,
成功:函数(){
$comment.append(“”);
$comment.last(“div”).load(window.location.href+“.comments”);
}
});
});

首先,在提供的代码中,
标记缺少操作属性,代码无法正常工作

然后,为了回答您的问题,修改控制器操作(保存新注释的操作),以便它返回提交的注释的信息(json格式更好)。然后,将返回的json转换为html代码,并将结果附加到注释中,例如:

$(document).on("submit", ".postAjax", function(e){
    e.preventDefault();
    $(this).LoadingOverlay("show");
    data = $(this).serializeObject();
    var element = $(this);

    $.ajax({
        url: $(this).attr('action'),
        type: 'POST',
        success:function(newCommentData){
            /* do some process here to transform your newCommentData array into html code */
            $(element).next(".comments").append(newCommentData);
        }
    });
});

此外,如果您希望它更干净,您可以有一个隐藏的“div”,其模型与注释div相同,但每个内容都由模式替换(例如:
%commentTitle%
%commentBody%
)。然后,每次发布新的注释时,都可以获得隐藏的
div
,并用注释数据替换模式。这样,如果以后更改注释部分结构,JS脚本仍将以相同的方式工作,无需进行调整。

使用
ajax
而不是加载。收到响应后,将响应附加到现有的。它取决于从中间层发送的响应。如果它只发送最后一条评论,您可以更新它,@brk谢谢,但问题是响应不仅是评论,而且是整个页面,所以我不能只在页面的最后一个“.comments”类上使用它,因此如果我在页面的第一个表单上发布评论,评论将附加在最后一个“.comments”类,而不是第一个“.comments”类:/@Kodmit在哪种情况下触发ajax调用?有实际的代码,它是用submit:
$(document)触发的。在(“submit”、“.postAjax”上,函数(e){e.preventDefault();$(this)。加载overlay(“show”);data=$(this.serializeObject();$.ajax({url:$(this.attr('action'),type:'POST',dataType:'json',data:data,success:function(data){$(“.reloadZone”).append(“”;$(“.reloadZone div:last”).load(window.location.href+“.reloadZone”);}};
(我已经编辑了帖子)它加载了,但什么也没有出现,当我在$comment上执行console.log时,我有这样一句话:“n.fn.init[prevObject:n.fn.init(1),context:form.postAjax]”正常吗?@Kodmit有输入错误,更新了答案。注释应该是
。注释
谢谢你的回答。返回的结果是JSON,但有一个问题,我用twig的“render”函数呈现我的注释部分,如下所示:{{render(controller('KM\\CommentBundle\\controller\\CommentController::CommentAction',{'id':post.id}}}}因此返回的数据直接集成在页面中,我不能通过附加它的方式只返回空白页面上的数据。因此,如果您有比“render”更好的解决方案要在页面上集成我的注释,我不明白你的意思。像这样呈现的注释部分是不相关的。Javascript运行后期呈现。因此,无论渲染生成的html代码是什么,你都可以通过检查元素来查看类名/元素。我的错误,append工作得很好,但是现在,如何仅在good“comments”类,而不是所有的comments类?谢谢,我编辑了我的答案,所以它只附加到具有.comments类的下一个元素。不过,最好的方法是将每个表单/注释部分包装在一个div中,这样您就可以浏览父元素。奇怪的是,代码不适用于
$(this).next(.comments”).append(数据);
但使用
$(“.comments”).append(数据);
处理所有注释类,但我认为这是一个小JS问题,您给了我足够的帮助,让我自己解决它,非常感谢!