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?
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>
É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');
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);
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
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.
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.