jQuery:取消绑定事件处理程序,以便以后再绑定它们

有人知道如何解除绑定事件处理程序,但记住它们以便以后再绑定它们吗? 有什么build议么?

该项目的数据中有一个事件元素。 这应该让你开始,你可以阅读你的元素,并在解除绑定之前将处理程序存储在数组中。 评论,如果你需要更多的帮助。 我通过阅读$ .fn.clone方法得到了这个想法,所以看看这个。

$(document).ready(function() { $('#test').click(function(e) { alert('test'); var events = $('#test').data("events"); $('#test').unbind('click', events.click[0]); }); }); <a id="test">test</a> 

这里是如何实现的,在select上提供了一个storeEvents和一个restoreEvents方法。 storeEvents在被调用的瞬间获取事件的快照。 restoreEvents恢复到上一个​​快照。 在恢复时可能需要稍微扭转一下参数来解除绑定,也许你想保留最后一个快照之后的绑定事件。

 (function($){ function obj_copy(obj){ var out = {}; for (i in obj) { if (typeof obj[i] == 'object') { out[i] = this.copy(obj[i]); } else out[i] = obj[i]; } return out; } $.fn.extend({ storeEvents:function(){ this.each(function(){ $.data(this,'storedEvents',obj_copy($(this).data('events'))); }); return this; }, restoreEvents:function(){ this.each(function(){ var events = $.data(this,'storedEvents'); if (events){ $(this).unbind(); for (var type in events){ for (var handler in events[type]){ $.event.add( this, type, events[type][handler], events[type][handler].data); } } } }); return this; } }); })(jQuery); 

由于jQuery 1.4.2+更改了事件处理程序的存储方式,这似乎是相关的:

我发现的最好的方法是使用事件命名空间:

 var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ]; for ( idx = 0; idx < ary_handlers.length; idx++ ){ $('#test').bind('click.foobar',ary_handlers[idx]); } // and then later: $('#test').unbind('.foobar'); 

在上面的例子中,所有的foobar事件都没有绑定。 请注意,如果您需要更细粒度的控制,您可以命名空间每个点击处理程序,并关联到您的处理程序数组:

 var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ]; for ( idx = 0; idx < ary_handlers.length; idx++ ){ $('#test').bind('click.ns_' + String(idx), ary_handlers[idx]); } // and then later you could pick off a specific one to unbind $('#test').unbind('.ns_2'); 

现在有一个名为copyEvents的好的jQuery插件,它将事件从一个对象复制到另一个对象。 这可以很容易地用来“保存”来自一个元素的事件,并在稍后将其返回。 只是一个选项:)

为了解除绑定事件处理程序,您需要将处理函数传递给unbind()。 所以你已经有处理函数了,你所要做的就是记住它。

你可以使用event.handler参数:

 $(document).ready(function() { $('#test').click(function(e) { e.preventDefault(); alert('test'); $('#test').unbind('click', e.handler); //Do Something... $('#test').click(); }); }); <a id="test">test</a> 

event.handler返回接收到事件的当前处理程序,所以通过省略它可以保留其他处理程序。

Nick Craver似乎对jQuery 1.4.2+有正确的答案 。 他还包括一个有用的小提琴 。 他的解决scheme允许您检索附加到jQuery元素的所有事件处理程序,并找出它们所附加的处理程序。