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

时间:2009-02-05 15:07:36

标签: javascript jquery events

有没有人知道如何取消绑定事件处理程序集,但是记住它们以便以后再绑定它们?有什么建议吗?

7 个答案:

答案 0 :(得分:23)

项目数据中有一个事件元素。这应该是你的开始,你可以读取你的元素并在解除绑定之前将处理程序存储在一个数组中。评论您是否需要更多帮助。我从阅读$ .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>

答案 1 :(得分:8)

以下是如何实现这一点,在选择上提供storeEventsrestoreEvents方法。 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);

答案 2 :(得分:8)

由于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');

答案 3 :(得分:1)

有一个名为Copy Events的jQuery插件,它将事件从一个对象复制到另一个对象。这可以非常容易地用于从一个元素“保存”事件并在以后将它们带回来。还有一个选择:)

编辑:修复损坏的链接

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以使用 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返回已收到事件的当前处理程序,因此省略它可以保留其他处理程序。

答案 6 :(得分:-2)

Nick Craver似乎拥有jQuery 1.4.2+的correct answer。他还包括一个有用的fiddle。他的解决方案允许您检索附加到jQuery元素的所有事件处理程序,并找出它们附加到哪个处理程序。