0

所以,情况就是这样。我有几个相同类型的对象都在监听同一个事件。每个对象的处理程序都操作 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
    }
4

2 回答 2

0

假设元素有一个类似的类“测试”,

你可以做的是:

$('.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
})
于 2013-01-16T22:26:43.560 回答
0

事件处理委托给祖先 div,声明如下:

$(someDiv).on("customEvent", this, this.eventHandler);

如果这是附加的唯一语句this.eventHandler,并且如果您eventHandler在删除目标元素后仍然看到行为,则somediv 必须仍然包含一些其他元素,该元素也将其“customEvent”委托给祖先 div。

根据@charlietfl 的建议,事件命名空间可以很好地解决眼前的问题,但我认为这不是一个完整的解决方案。需要修复一些更基本的东西。

您可能将“customEvent”委托给比您意识到的更多的元素。

于 2013-01-16T23:08:59.217 回答