40 Stimmen

jQuery: Event-Handler lösen, um sie später wieder zu binden

Weiß jemand, wie man die Bindung von Ereignis-Handlern aufhebt, sie aber speichert, um sie später wieder zu binden? Irgendwelche Vorschläge?

0 Stimmen

Haben die Ereignisse dieselbe Handler-Funktion oder sind sie alle unterschiedlich?

0 Stimmen

Sollte das nicht der Fall sein. Lassen Sie uns so tun, als ob sie alle unterschiedlich sind und ich nicht weiß, was sie sind

23voto

bendewey Punkte 38830

Es gibt ein Ereigniselement in den Daten des Artikels. Dies sollte den Anfang machen, Sie können Ihre Elemente lesen und die Handler in einem Array speichern, bevor Sie die Bindung aufheben. Kommentieren Sie, wenn Sie mehr Hilfe benötigen. Ich habe diese Idee aus dem Lesen der $.fn.clone-Methode, so werfen Sie einen Blick auf, dass als gut.

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

1 Stimmen

Ich habe mich auch nach einer Lösung für dieses Problem umgesehen, und diese Antwort funktioniert hervorragend. Für mehr Allgemeingültigkeit, könnten Sie events.click über einen Iterator zugreifen.

3 Stimmen

In jQuery 1.4.2, sie geändert, wie Ereignisse gespeichert werden, so wird dies nicht funktionieren: blog.jquery.com/2010/02/19/jquery-142-freigegeben . Ich bin mir nicht sicher, was Sie stattdessen tun müssen.

1 Stimmen

Zur Behandlung von Bindungen nach 1.4.2 siehe den Beitrag über Namespacing-Ereignisse weiter unten.

8voto

glmxndr Punkte 43786

Wie Sie das erreichen können, erfahren Sie hier storeEvents y un restoreEvents Methoden auf eine Auswahl. storeEvents erstellt einen Schnappschuss der Ereignisse in dem Moment, in dem er aufgerufen wird. restoreEvents stellt den letzten vorherigen Snapshot wieder her. Möglicherweise müssen Sie es ein wenig für die Parametrisierung der Aufhebung der Bindung während der Wiederherstellung verdrehen, vielleicht möchten Sie die gebundenen Ereignisse nach dem letzten Snapshot zu halten.

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

8voto

Michael Mikowski Punkte 1259

Seit jQuery 1.4.2+ ändert, wie Ereignis-Handler gespeichert werden, scheint dies relevant:

Der beste Weg, den ich gefunden habe, ist die Verwendung von Event-Namespacing:

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

In dem obigen Beispiel sind alle foobar-Ereignisse ungebunden. Beachten Sie, dass Sie, wenn Sie eine feinere Steuerung benötigen, jeden Click-Handler mit einem Namensraum versehen und mit Ihrem Array von Handlern korrelieren können:

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

1voto

Mike Punkte 4504

Es gibt ein jQuery-Plugin namens Ereignisse kopieren die Ereignisse von einem Objekt auf ein anderes kopiert. Dies könnte sehr leicht verwendet werden, um Ereignisse von einem Element zu "speichern" und sie später zurückzubringen. Nur eine weitere Option :)

Edit: Fehlerhafter Link korrigiert

0voto

meouw Punkte 40856

Um die Bindung eines Event-Handlers aufzuheben, müssen Sie die Handler-Funktion an unbind() übergeben. Sie haben die Handler-Funktion also bereits, Sie müssen sie sich nur noch merken.

0 Stimmen

Ich dachte, wenn Sie nicht eine bestimmte Handler-Funktion übergeben, unbind gilt für alle Ereignisse für dieses Objekt?

0 Stimmen

@Helmut ja unbind hebt die Bindung aller Handler auf, wenn Sie es ohne Argumente aufrufen. Sie können sie später nicht wieder binden, es sei denn, Sie haben einen Verweis auf sie gespeichert. Sie können auch die Bindung von Ereignissen aufheben, von denen Sie nichts wissen - z. B. wenn sie von einem anderen Skript gebunden wurden. Es ist am besten, unbind mit einem bestimmten Handler aufzurufen, damit Sie sicher sein können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X