Digamos que tengo una aplicación web que tiene una página que puede contener 4 bloques de script: el script que escribo se puede encontrar en uno de esos bloques, pero no sé cuál es el controlador.
Ato algunos onclick
eventos a un botón, pero encuentro que a veces se ejecutan en un orden que no esperaba.
¿Hay alguna manera de garantizar el orden o cómo ha manejado este problema en el pasado?
javascript
jquery
events
mkoryak
fuente
fuente
Respuestas:
Había intentado durante años generalizar este tipo de proceso, pero en mi caso solo me preocupaba el orden del primer oyente de eventos en la cadena.
Si es de alguna utilidad, aquí está mi complemento jQuery que une un detector de eventos que siempre se activa antes que cualquier otro:
** ACTUALIZADO en línea con los cambios de jQuery (gracias Toskan) **
Cosas a tener en cuenta:
fuente
this.data("events")
, vea aquí stackoverflow.com/questions/12214654/…Si el orden es importante, puede crear sus propios eventos y vincular devoluciones de llamada para que se activen cuando esos eventos se activen por otras devoluciones de llamada.
Algo así al menos.
fuente
El método de Dowski es bueno si todas tus devoluciones de llamada siempre estarán presentes y estás contento de que dependan unas de otras.
Sin embargo, si desea que las devoluciones de llamada sean independientes entre sí, podría aprovechar el burbujeo y adjuntar eventos posteriores como delegados a elementos primarios. Los manejadores en un elemento primario se activarán después de los manejadores en el elemento, continuando hasta el documento. Esto es bastante bueno, ya que puede usar
event.stopPropagation()
,event.preventDefault()
etc. para omitir controladores y cancelar o cancelar la acción.O, si no le gusta esto, puede usar el complemento bindLast de Nick Leaches para forzar que un evento se vincule en último lugar: https://github.com/nickyleach/jQuery.bindLast .
O, si está utilizando jQuery 1.5, también podría hacer algo inteligente con el nuevo objeto diferido.
fuente
.delegate
ya no se usa y ahora debería usarlo.on
, sin embargo, no sé cómo puede alcanzar el mismo comportamiento conon
El orden en que se invocan las devoluciones de llamada enlazadas se gestiona mediante los datos de eventos de cada objeto jQuery. No hay ninguna función (que yo sepa) que le permita ver y manipular esos datos directamente, solo puede usar bind () y unbind () (o cualquiera de las funciones auxiliares equivalentes).
El método de Dowski es el mejor, debe modificar las varias devoluciones de llamada enlazadas para enlazar a una secuencia ordenada de eventos personalizados, con la "primera" devolución de llamada vinculada al evento "real". De esa manera, no importa en qué orden estén vinculados, la secuencia se ejecutará de la manera correcta.
La única alternativa que puedo ver es algo que realmente no desea contemplar: si sabe que la sintaxis de enlace de las funciones puede haberse vinculado antes que usted, intente deshacer todas esas funciones y luego volver a vincularlas en el orden correcto usted mismo. Eso es solo pedir problemas, porque ahora tienes un código duplicado.
Sería genial si jQuery le permitiera simplemente cambiar el orden de los eventos enlazados en los datos de eventos de un objeto, pero sin escribir algún código para engancharlo al núcleo de jQuery que no parece posible. Y probablemente haya implicaciones de permitir esto en lo que no he pensado, así que tal vez sea una omisión intencional.
fuente
Tenga en cuenta que en el universo jQuery esto debe implementarse de manera diferente a partir de la versión 1.8. La siguiente nota de lanzamiento es del blog jQuery:
Tenemos control completo del orden en que los manejadores se ejecutarán en el universo jQuery . Ricoo señala esto arriba. No parece que su respuesta le haya ganado mucho amor, pero esta técnica es muy útil. Considere, por ejemplo, cada vez que necesite ejecutar su propio controlador antes de algún controlador en un widget de biblioteca, o necesite tener el poder de cancelar la llamada al controlador del widget condicionalmente:
fuente
simplemente vincula el controlador normalmente y luego ejecuta:
así por ejemplo:
fuente
$._data(element, 'events')[name].reverse()
funcionafuente
Puedes probar algo como esto:
fuente
Tengo el mismo problema y encontré este tema. Las respuestas anteriores pueden resolver esos problemas, pero no creo que sean buenos planes.
pensemos en el mundo real.
Si usamos esas respuestas, tenemos que cambiar nuestro código. Tienes que cambiar tu estilo de código. algo como esto:
original:
cortar a tajos:
A medida que pasa el tiempo, piense en su proyecto. ¡el código es feo y difícil de leer! La razón de antojo es simple, siempre es mejor. si tiene 10 bindAtTheStart, es posible que no haya errores. si tiene 100 bindAtTheStart, ¿está realmente seguro de que puede mantenerlos en el orden correcto?
así que si tiene que vincular los mismos eventos múltiples. Creo que la mejor manera es controlar el orden js-file o js-code. jquery puede manejar datos de eventos como cola. el orden es primero en entrar, primero en salir. No necesitas cambiar ningún código. solo cambia el orden de carga.
fuente
Aquí está mi oportunidad, cubriendo diferentes versiones de jQuery:
fuente
En algunos casos especiales, cuando no puede cambiar la forma en que se enlazan los eventos de clic (los enlaces de eventos se hacen a partir de los códigos de otros), y puede cambiar el elemento HTML, aquí hay una posible solución ( advertencia : esta no es la forma recomendada para enlazar eventos, otros desarrolladores pueden asesinarte por esto):
Con esta forma de vinculación, su gestor de eventos se agregará primero, por lo que se ejecutará primero.
fuente
JQuery 1.5 presenta promesas, y aquí está la implementación más simple que he visto para controlar el orden de ejecución. Documentación completa en http://api.jquery.com/jquery.when/
fuente