Quiero celebrar un evento hasta que esté listo para dispararlo, por ejemplo
$('.button').live('click', function(e){
e.preventDefault();
// do lots of stuff
e.run() //this proceeds with the normal event
}
¿Hay un equivalente a la run()
función descrita anteriormente?
jquery
jquery-events
Mazateca
fuente
fuente
Respuestas:
No Una vez que el evento ha sido cancelado, se cancela.
Sin embargo, puede volver a disparar el evento más adelante, utilizando una bandera para determinar si su código personalizado ya se ha ejecutado o no, como este (ignore la flagrante contaminación del espacio de nombres):
Una variante más generalizada (con el beneficio adicional de evitar la contaminación global del espacio de nombres) podría ser:
Uso:
Bonus jQuery súper minimalista con
Promise
soporte:Uso:
fuente
lots_of_stuff_already_done = true;
bandera; de lo contrario, no hay forma de que la función se repita.Una versión más reciente de la respuesta aceptada.
Versión breve:
Un buen caso de uso para algo como esto es cuando puede tener algún código de formulario heredado que funcione, pero se le ha pedido que mejore el formulario agregando algo como validación de dirección de correo electrónico antes de enviar el formulario. En lugar de buscar en el código postal del formulario back-end, puede escribir una API y luego actualizar su código front-end para acceder a esa API primero antes de permitir que el formulario haga su POST tradicional.
Para hacer eso, puede implementar un código similar al que he escrito aquí:
fuente
Puedes hacer algo como
fuente
Anule la propiedad de
isDefaultPrevented
esta manera:En mi humilde opinión, esta es la forma más completa de volver a activar el evento con exactamente los mismos datos.
fuente
e
es indefinido. debería serevt.preventDefault()
. Traté de editar, pero mis ediciones tienen que ser> 6 caracteres y acabo de agregar 2 :(event.isPropagationStopped = function(){ return false; };
. También agregué una propiedad personalizada al evento para que pueda detectar en el controlador si la verificación que impidió la acción se realizó para que no se vuelva a realizar. ¡Excelente!Es posible utilizar
currentTarget
elevent
. El ejemplo muestra cómo proceder con el envío del formulario. Del mismo modo, podría obtener la función delonclick
atributo, etc.fuente
submit()
al mismo elemento, ¿no devolverá su código `` $ ('form'). on ('submit') y lo rehacerá una y otra vez?Simplemente no realice
e.preventDefault();
, o realice condicionalmente.Ciertamente no puede modificar cuando ocurre la acción del evento original.
Si desea "recrear" el evento de IU original algún tiempo después (por ejemplo, en la devolución de llamada para una solicitud de AJAX), entonces tendrá que fingirlo de otra manera (como en la respuesta de vzwick) ... aunque yo cuestionar la usabilidad de tal enfoque.
fuente
Una respuesta más reciente utiliza hábilmente
jQuery.one()
https://stackoverflow.com/a/41440902/510905
fuente
mientras "un montón de cosas" no esté haciendo algo asíncrono, esto es absolutamente innecesario: el evento llamará a cada controlador en su camino en secuencia, por lo que si hay un evento onklick en un elemento padre, esto se disparará después del onclik- evento del niño ha procesado por completo. javascript no hace algún tipo de "subprocesamiento múltiple" aquí que hace que "detener" el procesamiento de eventos sea necesario. conclusión: "pausar" un evento solo para reanudarlo en el mismo controlador no tiene ningún sentido.
si "muchas cosas" es algo asíncrono, esto tampoco tiene sentido, ya que impide que las cosas asíncronas hagan lo que deberían hacer (cosas asincrónicas) y que se comporten como si todo estuviera en secuencia (donde volvemos a mi primer párrafo )
fuente
async
-fag: api.jquery.com/jQuery.ajax ) ... pero hacer una solicitud ajax sincrónica es una mala idea en casi todos los casos, entonces sería mejor encontrar una solución diferente.El enfoque que uso es este:
fuente
La solución aceptada no funcionará en caso de que esté trabajando con una etiqueta de anclaje. En este caso, no podrá volver a hacer clic en el enlace después de llamar
e.preventDefault()
. Eso es porque el evento de clic generado por jQuery es solo una capa encima de los eventos del navegador nativo. Por lo tanto, activar un evento 'clic' en una etiqueta de anclaje no seguirá el enlace. En su lugar, podría usar una biblioteca como jquery-simulate que le permitirá iniciar eventos del navegador nativo.Más detalles sobre esto se pueden encontrar en este enlace
fuente
Otra solución es usar window.setTimeout en el detector de eventos y ejecutar el código una vez que el proceso del evento haya finalizado. Algo como...
fuente
Sé que este tema es antiguo, pero creo que puedo contribuir. Puede activar el comportamiento predeterminado de un evento en un elemento específico en cualquier momento en su función de controlador si ya conoce ese comportamiento. Por ejemplo, cuando activa el evento click en el botón de reinicio, en realidad llama a la función de reinicio en el formulario más cercano como comportamiento predeterminado. En su función de controlador, después de usar la función preventDefault, puede recuperar el comportamiento predeterminado llamando a la función de reinicio en el formulario más cercano en cualquier parte de su código de controlador.
fuente
Si este ejemplo puede ayudar, agrega un "popin de confirmación personalizado" en algunos enlaces (conservo el código de "$ .ui.Modal.confirm", es solo un ejemplo para la devolución de llamada que ejecuta la acción original):
fuente