Kann jemand Event-Handler lösen, aber merken, um sie später wieder zu binden? Irgendwelche Vorschläge?jQuery: Event-Handler wieder losbinden, um sie später wieder zu binden
Antwort
In den Daten des Elements ist ein Ereigniselement enthalten. Dies sollte Ihnen den Start ermöglichen, Sie können Ihre Elemente lesen und die Handler in einem Array speichern, bevor Sie sie loslassen. Kommentar, wenn Sie mehr Hilfe benötigen. Ich habe diese Idee vom Lesen der $ .fn.Clone-Methode bekommen, also 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>
Super. Das kann funktionieren. Ich werde dies überprüfen – glaz666
Ich suchte auch nach der Lösung für dieses Problem, und diese Antwort funktioniert sehr. Um allgemeiner zu sein, können Sie auf events.click über einen Iterator zugreifen. – Achimnol
In jQuery 1.4.2 änderten sie, wie Ereignisse gespeichert werden, so dass dies nicht funktioniert: http: // blog.jquery.com/2010/02/19/jquery-142-released/. Ich bin mir nicht sicher, was Sie stattdessen tun müssen. –
Um einen Event-Handler zu lösen, müssen Sie die Handler-Funktion in unbind() übergeben. Sie haben also bereits die Handler-Funktion, alles was Sie tun müssen, ist sich daran zu erinnern.
Ich dachte, wenn Sie eine bestimmte Handler-Funktion nicht übergeben, gilt die Bindung für alle Ereignisse für dieses Objekt? – Helmut
@Helmut ja "unbind" wird alle Handler lösen, wenn Sie es ohne Argumente aufrufen. Sie können sie später nicht mehr binden, es sei denn, Sie haben einen Verweis auf sie gespeichert. Sie können auch Ereignisse aufheben, die Ihnen nicht bekannt sind - z. B. durch ein anderes Skript gebunden. Es empfiehlt sich, die Bindung mit einem bestimmten Handler aufzurufen, damit Sie sicher sein können. – meouw
Es ist jetzt eine gute jQuery-Plugin copyEvents, die Kopien Ereignisse von einem Objekt zum anderes genannt. Dies könnte sehr einfach verwendet werden, um Ereignisse von einem Element zu "speichern" und sie später zurückzubringen. Nur noch eine Option :)
Diese Verbindung ist tot. –
Hier ist, wie man das erreicht, bietet eine storeEvents
und eine restoreEvents
Methoden auf eine Auswahl. storeEvents
erstellt eine Momentaufnahme der Ereignisse in dem Moment, in dem sie aufgerufen wird. restoreEvents
stellt den letzten vorherigen Snapshot wieder her. Möglicherweise müssen Sie es ein wenig drehen, um die Entkopplung während der Wiederherstellung zu parametrisieren, vielleicht möchten Sie die gebundenen Ereignisse nach dem letzten Snapshot beibehalten.
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:
(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);
Da jQuery 1.4.2+ Änderungen, wie Event-Handler gespeichert sind, scheint dies relevant: Veranstaltung Namespacing zu verwenden
Der beste Weg, ich war gefunden , alle foobar-Ereignisse sind nicht gebunden. Beachten Sie, dass, wenn Sie feinere Kornsteuerung benötigt, können Sie jeden Klick-Handler Namespace konnte und korrelieren mit Ihrem Array von Handler:
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');
Nick Craver die correct answer für jQuery 1.4.2+ zu haben scheint. Er enthält auch eine hilfreiche fiddle. Seine Lösung ermöglicht es Ihnen, alle Event-Handler, die an ein jQuery-Element angehängt sind, abzurufen und herauszufinden, an welchen Handler sie angehängt wurden.
Leute, die abstimmen, sollten den Grund angeben, warum sie abstimmen. Hilft der Person zu lernen und bietet ein wenig Rechenschaftspflicht ... manchmal ist der Down Voter falsch. Jeder lernt. – traday
könnten Sie die event.handler
Parameter verwenden:
$(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, der das Ereignis empfangen hat, also durch das Weglassen der anderen Handler halten konnte.
Haben die Ereignisse eine gleiche Handler-Funktion? oder alle anders. – bendewey
sollte es nicht der Fall sein. Lassen Sie uns so tun, als ob sie alle anders sind und ich weiß nicht, was sie sind. – glaz666