2011-09-19 95 views
2

我需要在插入一些行後對其進行排序。我現在正在做的是:排序和重新插入元素將刪除綁定函數

var $r = $tbody.find('tr').sort(function(a,b) { 
    return compare(taxstatusOf(a), taxstatusOf(b)); 
}); 
$tbody.empty().append($r); 

這工作,除了這是註定要包含的行元素的功能將不再綁定(或不再火災,其數額爲同樣的事情)。

那麼,有沒有一種正確的方法來排序行失敗像這樣?我必須重新綁定嗎?

回答

2

D'oh。

體育迷的正確答案是.detach().remove()應該剝離被刪除的元素(刪除本地數據和綁定函數等),這非常適合垃圾收集等等,但是當您打算稍後重新附加它們時,它們就是您不想要的。

工作代碼:

var $r = $tbody.find('tr').sort(function(a,b) { 
    return compare(taxstatusOf(a), taxstatusOf(b)); 
}).detach().appendTo($tbody); 

(我不會「接受」我自己一小會兒,以防有人回答想出了一個更好的。)

(我猜這是我發現問題後30秒的答案。現在下一個SO的人將從我的錯誤中獲利)。

+0

不錯的方法! +1 –

+0

+1將我介紹給'detach()'。儘管我認爲我的回答是正確的,但我更喜歡你的解決方案。因此,顯然,+1。 –

+1

@DavidThomas - 是的,'.live()'和'.delegate()'讓我非常非常緊張。他們讓我想起了所有那些科幻故事,其中有人構建了一臺機器來執行一些有用的功能,並*繼續這樣做*。幾個世紀以後...... – Malvolio

0

從您提供的示例代碼,它看起來像你從原始元素中刪除DOM a然後重新添加它們。由於最初綁定事件時DOM中不存在新排序的元素,因此它們沒有綁定到它們的事件/函數。

要解決此問題,您可以使用live()delegate()分配原始函數/事件,該函數將綁定到'future'以及'current'元素;或者你確實必須在排序代碼中重新綁定事件,顯然是在$tbody.empty().append($r);之後。