当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《jQuery:取消绑定事件处理程序以便稍后再绑定它们》经验,为你挑选了3个好方法。

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



1> bendewey..:

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

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

test


在jQuery 1.4.2中,他们更改了事件的存储方式,因此不起作用:http://blog.jquery.com/2010/02/19/jquery-142-released/.我不确定你要做什么.

2> glmxndr..:

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



3> Michael Miko..:

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

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有