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

IT技术 javascript jquery events
2021-02-06 18:57:59

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

6个回答

项目的数据中有一个事件元素。这应该让您开始,您可以在解除绑定之前读取您的元素并将处理程序存储在数组中。如果您需要更多帮助,请发表评论。我从阅读 $.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>
在 jQuery 1.4.2 中,他们改变了事件的存储方式,所以这不起作用:blog.jquery.com/2010/02/19/jquery-142-released我不确定你必须做什么。
2021-03-28 18:57:59
我也在寻找这个问题的解决方案,这个答案非常有效。为了更通用,您可以通过迭代器访问 events.click。
2021-04-10 18:57:59
要处理 1.4.2 之后的绑定,请参阅下面有关命名空间事件的帖子。
2021-04-14 18:57:59

下面是如何实现这一点,在选择上提供了 astoreEvents和 arestoreEvents方法。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');

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

编辑:修复断开的链接

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

@Helmut yesunbind如果您不带参数调用它,将取消绑定所有处理程序。除非您保留了对它们的引用,否则您以后将无法再次绑定它们。您还可以取消绑定您不知道的事件 - 例如被另一个脚本绑定。最好使用特定的处理程序调用 unbind 以便您可以确定。
2021-03-15 18:57:59
我想如果您不传递特定的处理程序函数,unbind 是否适用于该对象的所有事件?
2021-04-07 18:57:59