【问题标题】:Can JQuery detect new classes as they appear? E.G. new comment that has just been postedJQuery 可以在新类出现时检测到它们吗?例如。刚刚发布的新评论
【发布时间】:2012-04-09 16:10:20
【问题描述】:

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

由于我已经在我的表单上设置了 ajax,我现在希望在不刷新页面的情况下添加或添加微博。

到目前为止,我有:

if @micropost.save
  format.js   { render :post_on_wall }
else
  format.js   { render :form_errors }
end

您无需成为 ruby​​ on rails 专家即可了解此 sn-p 中发生了什么。如果表单通过了所有验证并且用户在单击发布之前实际上输入了有效的内容,那么“如果@micropost.save”将为真,它将在我命名为“post_on_wall”的文件中执行 js。如果 if "@micropost.save" 将执行 "form_errors" 中的代码。

在 form_errors 中,我添加了一个警报,只是为了检查当用户没有输入任何内容并点击帖子时,微博不会被发布。它工作正常。

在“post_on_wall”文件中我有这个:

$('.microposts').prepend('<%= j render("users/partials/microposts") %>');

这样做的问题是它基本上抓取了在“users/partials/microposts”呈现的文件中循环的所有微帖子,然后将它们放在“.microposts”中的所有内容之上分区。甚至位于“.microposts”顶部的实际发布微博的表单也会被推到刚刚添加到页面的内容下方。

这是我的 html 结构。

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

每个微帖子及其关联的 cmets 都存储在一个名为“.postHolder”的类中。

我觉得我做错了。这个:“users/partials/microposts”指向的文件基本上有代码可以帮助一次显示 10 个微帖子。这用于与我正在尝试做的完全不同的事情(分页+无限滚动)。

无论如何,我觉得我应该处理的方法是如何检测刚刚发布的新帖子。它应该被检测为一个新的“.postHolder”类,然后在找到它后应该将它添加到“postHolder”列表的顶部,而不是替换它上面的微帖子表单。

我正在考虑创建一个单独的 div 来保存所有微帖子,然后将此 div 放在微帖子表单下面。这样我就不用担心表单被推下,因为它不会在里面包含所有 microposts 的 div,实际上我将要添加这些微博。

无论如何,我真的很想要一个示例或一些好的建议来帮助我实现此功能。

感谢您的宝贵时间 亲切的问候。

【问题讨论】:

  • 所以你的问题是你的微博被插入到 DOM 中的位置?
  • 那你为什么不在.postHolder前面加上呢?
  • 因为 .postHolder 是一个保存每个微博的类。这只会将所有循环的微帖子添加到页面上的 .postHolder 类中。
  • d_inevitable:我要做的是通过它的类检测新发布的评论,然后添加它。
  • 过滤.postHolder 只显示最后x 个帖子对您有帮助吗?还是给每个帖子一个唯一的ID?

标签: javascript ajax jquery


【解决方案1】:

基于你的假设

  1. 希望帖子按时间降序排列
  2. 希望尽量减少为更新而返回的数据量

我建议您在成功提交帖子后,向服务器发起 AJAX 调用,以获取比上次显示的帖子更新的所有帖子。假设你的 postholder 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>

我会从服务调用中获取新帖子作为返回的 html

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);
            }
        }
    });
}

您也可以使用 setTimeout 作为心跳来每隔一段时间调用 getNewposts。

【讨论】:

  • 这似乎是一个很好的解决方案。我最初认为使用 id 会很好,但只是不知道如何。我会仔细阅读,看看这是否有助于解决我的问题。
【解决方案2】:

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

当新元素添加到页面时会触发一些事件 (DOMNodeInsertedIntoDocument),但这绝对是低效的(并且已弃用)。

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

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

【讨论】:

  • .live 在最新版本的 jQuery 中已被弃用。 “从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用 .on() 附加事件处理程序。旧版本 jQuery 的用户应该使用 .delegate() 而不是 .live()。” api.jquery.com/live
  • 是的,live() 我的意思是 on() + 后代选择器。但是 live() 是关于概念的,你不需要 jQuery 来应用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2019-09-08
相关资源
最近更新 更多