web-dev-qa-db-fra.com

jQuery: les gestionnaires d'événements Unbind pour les lier ultérieurement

Est-ce que quelqu'un sait comment dissocier un ensemble de gestionnaires d'événements, mais les mémoriser pour les lier ultérieurement? Aucune suggestion?

37
glaz666

Il y a un élément d'événements dans les données de l'élément. Cela devrait vous aider à commencer, vous pouvez lire vos éléments et stocker les gestionnaires dans un tableau avant de dissocier. Commentez si vous avez besoin de plus d'aide. J'ai eu cette idée en lisant la méthode $ .fn.clone alors jetez-y un coup d'oeil également.

$(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>
23
bendewey

Étant donné que jQuery 1.4.2+ modifie le mode de stockage des gestionnaires d'événements, cela semble pertinent:

Le meilleur moyen que j'ai trouvé était d'utiliser l'espacement de noms d'événement:

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

Dans l'exemple ci-dessus, tous les événements foobar sont non liés. Notez que si vous avez besoin d'un contrôle de grain plus fin, vous pouvez créer un espace de noms pour chaque gestionnaire de clics et établir une corrélation avec votre tableau de gestionnaires:

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
Michael Mikowski

Voici comment y parvenir, fournit une storeEvents et une restoreEvents méthodes sur une sélection. storeEvents prend un instantané des événements au moment où il est appelé. restoreEvents restaure le dernier instantané précédent. Vous aurez peut-être besoin de le tordre un peu pour paramétrer la suppression de la liaison lors de la restauration. Vous souhaitez peut-être conserver les événements liés après le dernier instantané.

(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);
8
glmxndr

Il existe un plug-in jQuery appelé Copy Events , qui copie les événements d'un objet à un autre. Cela pourrait très facilement être utilisé pour "sauvegarder" des événements d'un élément et les ramener plus tard. Encore une option :)

Edit: lien cassé fixe

1
Mike

Vous pouvez utiliser le paramètreevent.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 renvoie le gestionnaire actuel qui a reçu l'événement. Par conséquent, en l'omettant, vous pouvez conserver les autres gestionnaires.

0
Avi

Afin de dissocier un gestionnaire d'événements, vous devez passer la fonction de gestionnaire à unbind (). Donc, vous avez déjà la fonction de gestionnaire, tout ce que vous avez à faire est de vous en souvenir.

0
meouw