Javascript JQuery可以在新类出现时检测它们吗?例如,刚刚发布的新评论

Javascript JQuery可以在新类出现时检测它们吗?例如,刚刚发布的新评论,javascript,ajax,jquery,Javascript,Ajax,Jquery,我有一个micropost/评论系统,每次提交新的micropost或评论时,页面都会刷新以显示它 因为我已经在我的表单上设置了ajax,所以我现在希望在不刷新页面的情况下添加micropost或 到目前为止,我已经: if @micropost.save format.js { render :post_on_wall } else format.js { render :form_errors } end 您不需要成为RubyonRails专家就可以理解这段代码中的内容。如

我有一个micropost/评论系统,每次提交新的micropost或评论时,页面都会刷新以显示它

因为我已经在我的表单上设置了ajax,所以我现在希望在不刷新页面的情况下添加micropost或

到目前为止,我已经:

if @micropost.save
  format.js   { render :post_on_wall }
else
  format.js   { render :form_errors }
end
您不需要成为RubyonRails专家就可以理解这段代码中的内容。如果表单通过了所有验证,并且用户在单击post之前实际键入了一些有效的内容,那么“If@micropost.save”将为true,它将在我命名为“post_on_wall”的文件中执行js。如果“@microspost.save”,将执行“form_errors”中的代码

在form_错误中,我添加了一个警报,以检查当用户输入nothing并单击post时,micropost不会被发布。它很好用

在“墙上张贴”文件中,我有以下内容:

$('.microposts').prepend('<%= j render("users/partials/microposts") %>');
$('.microposts')。前置('');
问题是,它基本上会抓住文件中循环的所有微操作,这些文件被呈现为“users/partials/micropost”,然后将它们放在“.micropost”分区中的所有内容之上。即使是实际的表单,也会在“.micropost”的顶部发布一个micropost在刚刚添加到页面的内容下方向下推

这是我的html结构

<div class='cf' id='content'>
    <div id='leftColumn'>
    </div>
    <div class='microposts'>
    </div>
    <div id='rightColumn'>
  </div>
</div>

每个micropost及其相关注释都存储在一个名为“.postHolder”的类中

我觉得我走错了方向。“users/partials/microspots”指向的文件基本上有代码可以帮助一次显示10个microspots。这是用于完全不同于我试图做的事情(分页+无休止的滚动)

不管怎样,我觉得我应该做的是如何检测刚刚发布的新帖子。它应该被检测为一个新的“.postHolder”类,然后在找到它之后,它应该被添加到“postHolder”列表的顶部,而不是替换它上面的micropost表单

我想创建一个单独的div来保存所有的micropost,然后把这个div放在micropost表单下面。。这样,我就不必担心表单会被压下,因为它不会在包含所有微操的div中,而事实上,我将准备使用这些微操

无论如何,我真的很想有一个例子或一些好的建议,可以帮助我实现这个功能

谢谢你的时间
问候。

回答标题问题“JQuery可以在新类出现时检测它们吗?”:否

将新元素添加到页面时会触发一些事件(
domandeinsertedintodocument
),但这绝对是低效的(而且不推荐使用)

最好在添加新元素的代码中使用jQuery的方法触发自定义事件。这样,您就可以通知独立模块有新元素


但是,当您在新元素上寻找事件处理程序注册时,您可能应该看看jQuery的方法。

基于您所做的假设

  • 想要按时间顺序降序排列的帖子吗
  • 希望最小化更新时必须返回的数据量
  • 我建议您在成功提交一篇文章后,向服务器发起一个AJAX调用,以获得比上次显示的文章更新的所有文章。假设你的帖子持有者HTML可以这样总结

    <div id='microposts'>
        <form id='new_post'></form>
        <div class='postholder' id='some-id-number'></div>
        <div class='postholder' id='some-older-id-number'></div>
        ...
    </div>
    

    您还可以使用setTimeout作为心跳信号,每隔一段时间调用getNewposts。

    那么您的问题是在DOM中插入micropost的位置?为什么不在
    .postHolder
    前面加上前缀呢?因为.postHolder是一个包含每个micropost的类。这只会将所有通过microposts的循环添加到页面上的.postHolder类中。d_不可避免:我试图做的是通过它的类检测新发布的评论,然后对其进行预处理。是否会筛选
    。postHolder
    仅显示最后的x篇帖子对您有帮助?或者给每篇文章一个唯一的id?.live在最新版本的jQuery中是不推荐的。“从jQuery 1.7开始,.live()方法已被弃用。请使用.on()附加事件处理程序。较旧版本的jQuery用户应优先使用.delegate(),而不是.live()。”是的,对于live(),我指的是on()+子代选择器。但是live()是关于这个概念的,您不需要jQuery来应用它,这似乎是一个很好的解决方案。我原本以为使用id会很好,但只是不知道如何使用。我会仔细阅读,看看这是否有助于解决我的问题。
    function getNewPosts(){
        $.ajax({
            url: 'Your-New-Posts-Url',
            data: {lastId: $('.postholder:first').attr('id')},
            success: function(newPosts){
                if(newPosts && newPosts.length > 0){
                    $('.postholder:first').before(newPosts);
                }
            }
        });
    }