2

我有一种情况,我需要将一个处理程序绑定到一个事件,然后,如果最终我需要绑定另一个处理程序,我需要取消绑定前一个处理程序。

我知道如果我有对前一个处理程序的引用,我可以做到这一点,在这种情况下我会这样做unbind,但在我的场景中这很困难。此外,我知道我也可以取消绑定每个处理程序,这是我试图避免的。

我想要的是这样的:

$("#myInput").bind("click", myHandler, "key");

// here, as I'm passing the same key, this handler will overwrite the previous
$("#myInput").bind("click", myHandler2, "key");

但这似乎不存在。

有什么建议吗?

4

2 回答 2

2

不,事件处理程序不会被覆盖。您需要手动删除它们。

但是,您可以命名您的事件名称,以便您可以在不明确知道它们的情况下删除旧的(而不仅仅是分离所有点击处理程序):

$("#myInput").on("click.key", myHandler);

$("#myInput").off(".key").on("click.key", myHandler2);

否则,您将需要手动覆盖处理程序:

var handler = null;
$("#myInput").on("click", function() {
    if (typeof handler=='function') handler.apply(this, arguments);
});

handler = myHandler;

handler = myHandler2;
于 2012-12-11T21:41:29.840 回答
0

您可以使用 .data() 方法访问绑定到元素的所有事件处理程序,它返回数组对象。所以你可以找到最后一次点击处理程序。代码可能是这样的:

var lastHandler = null;
jQuery.each($("#myInput").data("events"), function(i, event){
   if(i == 'click'){
      lastHandler = event[event.length-1].handler;
   }
});
$("#myInput").unbind("click", lastHandler);
于 2012-12-12T13:51:36.683 回答