Jquery 使用处理程序删除元素时的最佳实践是什么?

Jquery 使用处理程序删除元素时的最佳实践是什么?,jquery,event-delegation,Jquery,Event Delegation,在删除委托处理程序所附加的元素时,我在IE8上使用jQuery的.delegate()方法时遇到了一个问题。下面是一个场景:我有一个表,其中的行都有一个删除按钮。行是动态创建的,因此删除按钮是使用委托连接起来的,以处理单击事件。当需要删除最后一行时,整个表都被删除了(只有在至少有一个值要创建一行时才创建表)。除了IE8之外,这几乎在任何地方都可以正常工作。即使这样,它在某些页面上也能工作,但不是一个页面(每个页面上使用的代码完全相同)。对于这一特定页面,删除最后一行将在IE8中生成一个js错误,

在删除委托处理程序所附加的元素时,我在IE8上使用jQuery的.delegate()方法时遇到了一个问题。下面是一个场景:我有一个表,其中的行都有一个删除按钮。行是动态创建的,因此删除按钮是使用委托连接起来的,以处理单击事件。当需要删除最后一行时,整个表都被删除了(只有在至少有一个值要创建一行时才创建表)。除了IE8之外,这几乎在任何地方都可以正常工作。即使这样,它在某些页面上也能工作,但不是一个页面(每个页面上使用的代码完全相同)。对于这一特定页面,删除最后一行将在IE8中生成一个js错误,声明“Object required”(需要对象)——有问题的行位于代理的jQuery代码中

所以问题是,当处理程序正在使用的一些DOM元素被删除时,处理程序的最佳实践是什么?是否应该在某个时候调用undelegate,如果是,在哪里?

使用jQuery:

要删除元素本身及其内部的所有内容时,请使用
.remove()
。除元素本身外,还将删除与元素关联的所有绑定事件和jQuery数据


或者删除所有子元素,但保留顶级元素。

Kinakuta,从您所说的,可能只是正确设置委派并适当地使用删除的措辞,而不是使用或不使用
remove()
。很难理解为什么只有IE8应该行为不端,但jQuery中可能存在一些IE8问题

使用jQuery 1.7+
取代了
.bind()
.live()
.delegate()
,并可能提供了一条前进的道路。我希望做这样的事情:

$("#myContainer").on("click", "button.delete", function(event){
    $(this).closest("tr", "#myContainer").remove();
});

如果您使用的是jQuery代码,那么使用
.delegate()
无疑可以实现类似的效果。。。。。因为我认为代码中存在问题,而不是“最佳实践”…如何从DOM中删除表元素?发布代码。希望这能给你一个想法或什么@Reigel-我想知道,但OP没有说,可能正在使用
.html()
.detach()
或普通DOM方法。这个问题问的是“最佳实践”,所以我已经回答了…所以这提出了一个很好的观点,也许最佳实践的问题放错了地方。正在使用.html()在主干视图中创建表。如果连接的主干集合中至少包含一个模型,则使用.html构建表html并将其放置在容器中-如果删除集合中的最后一项,则html设置为空字符串。也许真正的问题是我需要一种更好的方法来创建和删除视图代码中的DOM元素?好吧,
.html()
方法的jQuery doco没有提到它(我可以看到),但我只是快速查看了代码,它似乎试图在替换/删除它之前清理现有html的事件和数据(我不知道这是否适用于旧版本;我在看1.7.1)。FWIW,jQuery的
html()
文档的当前版本确实说它解除了事件处理程序的绑定。