jQuery框架由于使用方便,語言優雅,在ROR項目中經常被使用。比較常用的是給特定的元素(比如一個button)綁定一些JS時間,拿最簡單的click事件來說,給 class='btn-alert'的一個button綁定一個alert事件:
$(".btn-alert").click ->
alert "hellow"
可見,實現上述功能,代碼是非常簡單且直觀的。
現在問題來了,如果有這么一個需求,寫一個model的index頁面,該模型的增刪改查都在這個頁面實現,全程要求不刷新頁面。
仔細分析一下這個需求,我們會發現,刪除不刷新頁面比較容易實現,向后臺用$.ajax請求,期待返回一個script類型的數據,將已經被刪除的這一行tr進行hide()或者slideUp()即可(假設index頁的數據是通過.each do方法,每條數據輸出一行tr),但是添加動作就有點問題了。
問題不是出在后臺的action上,也不是前臺append一行tr數據,而且通過append()方法新增的數據,同樣需要那個有alert功能的按鈕,并且這些新增的按鈕,在不刷新頁面的情況下,還必須起作用(不是放出來裝樣子的)。
我們可以通過html代碼,來寫出這個按鈕,結構和其他按鈕保持一致,但發現點了這些按鈕,并沒有alert事件出現,原因主要是因為jQuery綁定JS事件的機制:當頁面加載完成后,根據jQuery代碼的綁定事件,會自動給這些button綁定上這些事件,當用ajax提交新增了一條數據后,該button雖然有相同的class(btn-alert),看似能觸發.btn-alert該具備的 click事件,但由于頁面沒有刷新,這個按鈕其實沒有被綁定這個click事件,因此才不起作用。
通過查詢資料,發現這個問題是比較容易解決的,解決的方法就是調用bind()
當我們用jquery代碼append一個button之后,就調用bind()方法給這個button事實綁定上該有的時間:
$(".btn-alert").first().bind 'click', ->
message_id = $(this).data("message-id")
return
如此之后,新增的那個button也同樣具備alert的click事件了,解決了這個問題,全稱不刷新頁面的需求也隨之迎刃而解了。