2011-09-19 61 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);之后。