2012-04-09 71 views
0

我有一個微博/評論系統,每次提交新的微博或評論時,頁面將刷新以顯示它。JQuery可以檢測出新類嗎?例如。剛剛發佈的新評論

因爲我已經在表單上設置了ajax,所以我現在想要添加微博或添加沒有頁面刷新。

到目前爲止,我有:

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

你不需要是在軌道上的專家紅寶石明白髮生了什麼事在這個片段。如果表單在點擊帖子之前通過了所有驗證和用戶實際類型的驗證,那麼「if @ micropost.save」將爲true,並且它將在我命名爲「post_on_wall」的文件內執行js。如果「@ micropost.save」將執行「form_errors」中的代碼。

裏面的form_errors我添加了一個提醒只是爲了檢查微博不發佈,當用戶什麼都沒有輸入,並點擊張貼。它工作正常。

在「post_on_wall」文件,我有這樣的:

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

的問題,這是它基本上抓住一切都是通過循環在文件這就是正在呈現「用戶/諧音/ 微柱的微觀柱「然後將它們放在」.microposts「div中的所有內容之上。即使發佈位於「.microposts」頂部的micropost的實際表單也被壓低到剛剛添加到頁面的內容下方。

這是我的html結構。

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

每個微博及其相關注釋存儲在名爲「.postHolder」的類中。

我覺得我這樣做是錯誤的。文件this:「users/partials/microposts」指向基本上有幫助一次顯示10個微博的代碼。這是用來完全不同於我想要做的事情(分頁+無盡的滾動)。

無論如何,我覺得我應該接近的方式是如何檢測剛剛發佈的新帖子。它應該被檢測爲一個新的「.postHolder」類,然後發現它應該被添加到「postHolder」列表的頂部,而不是替換它上面的micropost表單。

我想創建一個單獨的div來容納所有的microposts,然後將這個div放在micropost窗體的下面..這樣我就不用擔心窗體被推下來了,因爲它不會是裏面的div包含所有microposts,事實上將是我將要預先考慮的。

無論如何,我真的很喜歡一個例子或一些很好的建議,可以幫助我實現此功能。

謝謝你的時間 親切的問候。

+0

所以你的問題是你的微博插入DOM中的位置? – 2012-04-09 16:22:07

+0

那麼爲什麼不加入'.postHolder'呢? – Alexander 2012-04-09 16:29:34

+0

因爲.postHolder是一個持有每個微博的類。這隻會將所有循環微博添加到頁面上的.postHolder類中。 – LondonGuy 2012-04-09 16:30:51

回答

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> 

我想從一個服務調用

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

獲得新職位爲返回的HTML你也可以使用的setTimeout的心跳調用getNewposts幾乎每經常。

+0

這似乎是一個很好的解決方案。我原本以爲使用id會很好,但不知道如何。我會閱讀,看看這是否有助於我解決我的問題。 – LondonGuy 2012-04-09 17:57:25

0

要回答這個問題,標題「JQuery的可檢測新的類,因爲他們出現在哪裏?」:第

有事件火的時候新的元素被添加到頁面(DOMNodeInsertedIntoDocument),但是那絕對低效(和不建議使用)。

在添加新元素的代碼中,使用jQuery的.trigger()方法更好地激發自定義事件。有了這個,你可以通知獨立模塊有新的元素。

但是,當您在尋找新元素的事件處理程序註冊時,您應該看看jQuery的.live()方法。

+2

.live已棄用在最新版本的jQuery中。 「從jQuery 1.7開始,不推薦使用.live()方法。使用.on()附加事件處理程序。老版本jQuery的用戶應該優先使用.delegate(),而不是.live()。 http://api.jquery.com/live/ – 2012-04-09 17:03:36

+0

是的,與live()我的意思是()+後代選擇器。但live()是關於這個概念的,你不需要jQuery來應用它。 – Bergi 2012-04-09 18:09:24

+0

只是讓你知道什麼是更新的傢伙:} – 2012-04-09 18:10:32

相關問題