¿Alguien sabe cómo desvincular un conjunto de manejadores de eventos, pero memorizarlos para vincularlos más tarde? ¿Alguna sugerencia?jQuery: Desvincular los controladores de eventos para vincularlos más tarde
Respuesta
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>
Super. Eso puede funcionar Voy a comprobar esto – glaz666
También estaba buscando la solución para este problema, y esta respuesta funciona en gran medida. Para mayor generalidad, puede acceder a events.click a través de un iterador. – Achimnol
En jQuery 1.4.2, cambiaron la forma en que se almacenan los eventos, por lo que esto no funcionará: http: // blog.jquery.com/2010/02/19/jquery-142-released/. No estoy seguro de lo que tienes que hacer en su lugar. –
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.
Pensé que si no pasas una función de controlador específico, la desvinculación se aplica a todos los eventos para ese objeto? – Helmut
@Helmut yes 'unbind' desvinculará todos los controladores si lo llama sin argumentos. No podrá volver a enlazarlos más tarde a menos que haya guardado una referencia a ellos. También puede desvincular eventos de los que no tiene conocimiento, por ejemplo, vinculados por otro script. Lo mejor es desvincularlo con un controlador específico para que pueda estar seguro. – meouw
En la actualidad existe un buen plugin de jQuery llamado copyEvents, que copia los 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 :)
Ese enlace está muerto. –
Aquí se muestra cómo lograr eso, proporciona los métodos storeEvents
y 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 los cambios jQuery 1.4.2+ cómo se almacenan los controladores de eventos, esto parece relevante:
La mejor manera que encontré fue utilizar espacios de nombre del 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');
En el ejemplo anterior , todos los eventos foobar sin consolidar. Tenga en cuenta que si usted necesita un control de grano más fino, se puede namespace cada controlador de clic y correlacionar a su gama 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');
Nick Craver parece tener el correct answer para jQuery 1.4.2+. También incluye un útil fiddle. Su solución le permite recuperar todos los manejadores de eventos adjuntos a un elemento jQuery y averiguar a qué controlador fueron asignados.
Las personas que voten negativamente deben proporcionar la razón por la que votan. Ayuda a la persona a aprender y proporciona un poco de responsabilidad ... a veces el votante de abajo está equivocado. Todos aprenden. – traday
Se puede utilizar 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 manejador actual que ha recibido el evento, por lo omitiendo que se podía mantener los otros manipuladores.
- 1. ¿Manejo de eventos jQuery para desmarcar() y desvincular() eventos?
- 2. JavaScript/jQuery: Escuche los controladores de eventos recién registrados
- 3. Cómo eliminar todos los controladores de eventos Click en Jquery
- 4. jQuery Traversing + Controladores de eventos en vivo
- 5. jQuery, agregar y eliminar controladores de eventos
- 6. jquery controladores de eventos "on" y "off"
- 7. jQuery Controladores de eventos múltiples: ¿cómo cancelar?
- 8. jQuery 1.8 encontrar controladores de eventos
- 9. Detener más controladores de eventos en un elemento
- 10. Cuándo conectar los controladores de eventos asp.net
- 11. ¿Los controladores de eventos no están seguros?
- 12. Backbone.js Vista no puede desvincular eventos adecuadamente
- 13. Elimine correctamente los controladores de eventos de funciones anónimas
- 14. jQuery más tarde que la carga de la ventana
- 15. Controladores de eventos jQuery que no se activan en IE
- 16. C# Controladores de eventos
- 17. jQuery encontrar controladores de eventos registrados con un objeto
- 18. añadir dinámicamente controladores de eventos de jQuery a HTML dinámico
- 19. jquery vacío de funciones y controladores de eventos
- 20. C# controladores de eventos personalizados
- 21. ¿Escala ahora o más tarde?
- 22. Acceso a funciones vinculadas a controladores de eventos con jQuery
- 23. Eliminación de controladores de eventos
- 24. Desvincular evento de pulsación especial
- 25. Los manejadores de eventos de Jquery devuelven los valores
- 26. ¿Cómo deshacerse de los controladores de eventos de forma segura?
- 27. ¿Cómo eliminar todos los controladores de eventos Click?
- 28. Unidad de prueba Controladores de eventos Flex
- 29. ¿Cuándo entran en juego los controladores de eventos de dominio?
- 30. ¿Se procesan los controladores de eventos de forma asíncrona?
¿Tienen eventos la misma función de controlador? o todo diferente. – bendewey
no debería ser el problema. Vamos a pretender que todos son diferentes y no sé qué son – glaz666