w3schools multiple change javascript jquery events

javascript - multiple - jQuery: desvincular los controladores de eventos para vincularlos de nuevo más tarde



jquery selector (7)

Ahora hay un buen complemento jQuery llamado copyEvents , que copia eventos de un objeto a otro. Esto podría usarse muy fácilmente para "guardar" eventos de un elemento y traerlos de vuelta más tarde. Solo una opción más :)

¿Alguien sabe cómo desvincular un conjunto de manejadores de eventos, pero memorizarlos para volver a vincularlos más tarde? ¿Alguna sugerencia?


Aquí se muestra cómo lograr eso, proporciona los métodos storeEvents y a restoreEvents en una selección. storeEvents toma una instantánea de los eventos en el momento en que se llama. restoreEvents restaura a la última instantánea anterior. Puede que sea necesario girarlo un poco para parametrizar la anulación mientras se restaura, tal vez le gustaría conservar los eventos enlazados después de la última instantánea.

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


Dado que jQuery 1.4.2+ cambia la forma en que se almacenan los controladores de eventos, esto parece relevante:

La mejor forma que encontré fue usar espacios de nombres de eventos:

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

En el ejemplo anterior, todos los eventos de foobar sin consolidar. Tenga en cuenta que si necesita un control de grano más fino, puede asignar un nombre a cada manejador de clic y correlacionarlo con su conjunto de manejadores:

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


Hay un elemento de eventos en los datos del elemento. Esto debería comenzar, puedes leer tus elementos y almacenar los manejadores en una matriz antes de desvincularlos. Comente si necesita más ayuda. Obtuve esta idea al leer el método $ .fn.clone, así que échale un vistazo a eso también.

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


Nick Craver parece tener la respuesta correcta para jQuery 1.4.2+. Él también incluye un fiddle útil. Su solución le permite recuperar todos los manejadores de eventos adjuntos a un elemento jQuery y averiguar a qué controlador fueron asignados.


Para desvincular un controlador de eventos, debe pasar la función de controlador a desvincular (). Entonces ya tienes la función de controlador, todo lo que tienes que hacer es recordarlo.


Puede usar el parámetro event.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 devuelve el controlador actual que ha recibido el evento, por lo que al omitirlo puede mantener los otros controladores.