在jQuery中删除特定于事件的事件处理程序的最佳方法

在jQuery中删除特定于事件的事件处理程序的最佳方法,jquery,Jquery,所以,情况是这样的。我有几个类型相同的对象,它们都在侦听同一事件。每个对象的处理程序都操作DOM的某些部分。这些对象几乎可以在任何时候重新创建或销毁,当它们被销毁时,它们将成为它们负责的DOM的一部分。问题是,这些对象的处理程序仍然存在,并在对象被销毁后继续尝试操作DOM 下面是我的代码,似乎工作。但是,我不关心处理程序被销毁的方式,我怀疑这可能对jQuery不好。有更好的办法吗 var ID: "uniqueID", connectEvents: function ()

所以,情况是这样的。我有几个类型相同的对象,它们都在侦听同一事件。每个对象的处理程序都操作DOM的某些部分。这些对象几乎可以在任何时候重新创建或销毁,当它们被销毁时,它们将成为它们负责的DOM的一部分。问题是,这些对象的处理程序仍然存在,并在对象被销毁后继续尝试操作DOM

下面是我的代码,似乎工作。但是,我不关心处理程序被销毁的方式,我怀疑这可能对jQuery不好。有更好的办法吗

        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的子级