jQuery: отсоедините обработчики событий, чтобы связать их позже - PullRequest
38 голосов
/ 05 февраля 2009

Кто-нибудь знает, как отменить привязку множества обработчиков событий, но запомнить их, чтобы связать их позже? Есть предложения?

Ответы [ 7 ]

23 голосов
/ 05 февраля 2009

В данных элемента есть элемент событий. Это должно помочь вам начать работу, вы можете прочитать ваши элементы и сохранить обработчики в массиве, прежде чем снимать привязку. Прокомментируйте, если вам нужна дополнительная помощь. Я понял эту идею, прочитав метод $ .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>
8 голосов
/ 06 апреля 2011

Поскольку 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');
8 голосов
/ 17 июля 2009

Вот как это сделать, предоставляет методы 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);
1 голос
/ 06 июля 2009

Существует плагин jQuery с именем Копировать события , который копирует события из одного объекта в другой. Это можно очень легко использовать для «сохранения» событий из одного элемента и их последующего возврата. Еще один вариант:)

Редактировать: исправлена ​​неработающая ссылка

0 голосов
/ 07 августа 2014

Вы можете использовать параметр 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 возвращает текущий обработчик, который получил событие, поэтому, пропустив его, вы можете оставить другие обработчики.

0 голосов
/ 29 июня 2012

Ник Крэйвер, кажется, имеет правильный ответ для jQuery 1.4.2+. Он также включает в себя полезную скрипку . Его решение позволяет вам извлечь все обработчики событий, прикрепленные к элементу jQuery, и выяснить, к какому обработчику они были присоединены.

0 голосов
/ 05 февраля 2009

Чтобы отменить привязку обработчика события, вам нужно передать функцию обработчика в unbind (). Итак, у вас уже есть функция обработчика, все, что вам нужно сделать, это запомнить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...