在jQuery中删除特定于事件的事件处理程序的最佳方法
所以,情况是这样的。我有几个类型相同的对象,它们都在侦听同一事件。每个对象的处理程序都操作DOM的某些部分。这些对象几乎可以在任何时候重新创建或销毁,当它们被销毁时,它们将成为它们负责的DOM的一部分。问题是,这些对象的处理程序仍然存在,并在对象被销毁后继续尝试操作DOM 下面是我的代码,似乎工作。但是,我不关心处理程序被销毁的方式,我怀疑这可能对jQuery不好。有更好的办法吗在jQuery中删除特定于事件的事件处理程序的最佳方法,jquery,Jquery,所以,情况是这样的。我有几个类型相同的对象,它们都在侦听同一事件。每个对象的处理程序都操作DOM的某些部分。这些对象几乎可以在任何时候重新创建或销毁,当它们被销毁时,它们将成为它们负责的DOM的一部分。问题是,这些对象的处理程序仍然存在,并在对象被销毁后继续尝试操作DOM 下面是我的代码,似乎工作。但是,我不关心处理程序被销毁的方式,我怀疑这可能对jQuery不好。有更好的办法吗 var ID: "uniqueID", connectEvents: function ()
var ID: "uniqueID",
connectEvents: function ()
{
$(someDiv).on("customEvent", this, this.eventHandler);
},
eventHandler: function (e)
{
//do some stuff to the DOM
},
destroy: function ()
{
var gridCell = this;
if (jQuery(someDiv).data("events"))
{
var handlers = jQuery(someDiv).data("events").customEvent
var handlerIndex = -1;
$(handlers).each(function (i, handler)
{
if (handler.data.ID === ID)
handlerIndex = i;
});
if (handlerIndex > 0)
{
handlers.splice(handlerIndex, 1);
}
}
//Destroy some Dom elements
}
假设元素有一个类似的类“test” 你能做的是:
$('.test').click(function(){
$(this).off(); // remove all event handlers assigned to this object with class test that has been clicked.
$(this).remove(); // removes the element
})
事件处理通过以下语句委托给祖先div:
$(someDiv).on("customEvent", this, this.eventHandler);
如果这是唯一附加this.eventHandler
的语句,并且在删除目标元素后仍然看到eventHandler
行为,那么somediv
必须仍然包含一些其他元素,这些元素也将其“customEvent”委托给祖先div
按照@charlietfl的建议,事件名称空间可以很好地解决眼前的问题,但我认为这不是一个完整的解决方案。一些更基本的问题需要解决
您可能正在将“customEvent”委派给比您意识到的更多的元素。可以为事件命名并使用
off('customEvent.namespace
)`如果您使用$(elem).remove()
从DOM中删除元素,那么所有jQuery事件处理程序和所有常规DOM事件处理程序都会自动为您清理。我不明白你为什么会有这个问题。也许您可以说明实际存在的问题,并向我们展示从DOM中删除项的代码。当元素从DOM中删除时,如果您正确地删除它们,则不必清理事件处理程序。所以,问题可能就在你试图解决问题的上游。谢谢@charlietfl,这正是我所需要的。我不了解事件名称空间,但现在它可以正常工作了。要设置处理程序,我使用:$(someDiv).on(“customEvent.”+this.ID,this,this.eventHandler);要断开连接:$(someDiv).off(“customEvent.”+this.ID,this.eventHandler);确保先移除事件处理程序,然后移除用于拥有handler的元素。我的想法是,我不想从尚未销毁的对象中移除事件处理程序。这些事件处理程序需要保持活动状态。“关闭”会杀死一切。这就是正在发生的事情,也是人们想要的行为。对不起,我之前不清楚,但有些人永远不会被移除。移除的div是someDiv的子级