jQuery: Unbind manipuladores de events para vinculá-los novamente mais tarde

Alguém sabe como desvincular o conjunto de manipuladores de events, mas memorizá-los para ligá-los novamente mais tarde? Alguma sugestão?

Existe um elemento de events nos dados do item. Isso deve ser iniciado, você pode ler seus elementos e armazenar os manipuladores em uma matriz antes de desvincular. Comente se precisar de mais ajuda. Eu tenho essa idéia de ler o método $ .fn.clone então dê uma olhada nisso também.

$(document).ready(function() { $('#test').click(function(e) { alert('test'); var events = $('#test').data("events"); $('#test').unbind('click', events.click[0]); }); }); test 

Veja como conseguir isso, fornece um storeEvents e um método restoreEvents em uma seleção. storeEvents faz um instantâneo dos events no momento em que é chamado. restoreEvents restaurado para o último instantâneo anterior. Pode ser necessário torcer um pouco para parametrizar o unbinding durante a restauração, talvez você queira manter os events ligados após o último snapshot.

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

Como o jQuery 1.4.2+ muda a forma como os manipuladores de events são armazenados, isso parece relevante:

A melhor maneira que encontrei foi usar o namespace de evento:

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

No exemplo acima, todos os events foobar são desvinculados. Observe que, se você precisasse de um controle de granularidade mais refinado, seria possível nomear cada manipulador de cliques e correlacioná-lo com sua matriz de manipuladores:

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

Existe agora um bom plugin jQuery chamado copyEvents , que copia events de um object para outro. Isso poderia muito facilmente ser usado para “salvar” events de um elemento e trazê-los de volta mais tarde. Apenas mais uma opção 🙂

Para desvincular um manipulador de events, você precisa passar a function de manipulador para unbind (). Então você já tem a function de manipulador, tudo que você precisa fazer é lembrar.

Você poderia usar o parâmetro event.handler :

 $(document).ready(function() { $('#test').click(function(e) { e.preventDefault(); alert('test'); $('#test').unbind('click', e.handler); //Do Something... $('#test').click(); }); }); test 

event.handler retorna o manipulador atual que recebeu o evento. Portanto, omitindo-o, você poderia manter os outros manipuladores.

Nick Craver parece ter a resposta correta para o jQuery 1.4.2+. Ele também inclui um violino útil. Sua solução permite recuperar todos os manipuladores de events anexados a um elemento jQuery e descobrir qual manipulador eles estavam anexados.