it-swarm.com.de

jQuery: Deaktivieren Sie die Ereignishandler, um sie später erneut zu binden

Weiß jemand, wie man eine Gruppe von Event-Handlern löst, sich diese aber auswendig lernt, um sie später wieder zu binden? Irgendwelche Vorschläge?

37
glaz666

In den Daten des Elements ist ein Ereigniselement enthalten. Dies sollte Ihnen den Einstieg erleichtern. Sie können Ihre Elemente lesen und die Handler in einem Array speichern, bevor Sie die Bindung aufheben. Kommentieren Sie, wenn Sie weitere Hilfe benötigen. Diese Idee habe ich durch das Lesen der $ .fn.clone-Methode erhalten. Schauen Sie sich das auch an.

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

Da jQuery 1.4.2+ die Speicherung von Ereignishandlern ändert, scheint dies relevant zu sein:

Der beste Weg, den ich gefunden habe, war die Verwendung des Event-Namespaces:

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

Im obigen Beispiel sind alle foobar-Ereignisse ungebunden. Wenn Sie eine genauere Kornsteuerung benötigen, können Sie für jeden Klick-Handler einen Namespace erstellen und mit Ihrem Array von Handlern korrelieren:

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

So können Sie dies erreichen, bietet eine storeEvents- und eine restoreEvents-Methode für eine Auswahl. storeEvents erstellt eine Momentaufnahme der Ereignisse zum Zeitpunkt des Aufrufs. restoreEvents stellt den letzten vorherigen Schnappschuss wieder her. Möglicherweise müssen Sie die Einstellung ein wenig ändern, um die Unbindung beim Wiederherstellen zu parametrieren. Möglicherweise möchten Sie die gebundenen Ereignisse nach dem letzten Schnappschuss beibehalten.

(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

Es gibt ein jQuery-Plugin namens Copy Events , das Ereignisse von einem Objekt in ein anderes kopiert. Dies kann sehr leicht dazu verwendet werden, Ereignisse von einem Element zu "speichern" und sie später wieder herzustellen. Nur noch eine Option :)

Bearbeiten: Fehlerhafter Link behoben

1
Mike

Sie können den Parameterevent.handlerverwenden:

$(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 gibt den aktuellen Handler zurück, der das Ereignis erhalten hat. Wenn Sie es weglassen, können Sie die anderen Handler beibehalten.

0
Avi

Um einen Event-Handler zu lösen, müssen Sie die Handler-Funktion in unbind () übergeben. Sie haben also bereits die Handler-Funktion, Sie müssen sich nur noch daran erinnern.

0
meouw