Je souhaite organiser un événement jusqu'à ce que je sois prêt à le déclencher, par exemple
$('.button').live('click', function(e){
e.preventDefault();
// do lots of stuff
e.run() //this proceeds with the normal event
}
Existe-t-il un équivalent à la run()
fonction décrite ci-dessus?
jquery
jquery-events
Mazatec
la source
la source
Réponses:
Nan. Une fois l'événement annulé, il est annulé.
Vous pouvez toutefois relancer l'événement plus tard, en utilisant un indicateur pour déterminer si votre code personnalisé a déjà été exécuté ou non - comme celui-ci (veuillez ignorer la pollution flagrante de l'espace de noms):
Une variante plus généralisée (avec l'avantage supplémentaire d'éviter la pollution globale de l'espace de noms) pourrait être:
Usage:
Plugin jQuery super-minimaliste bonus avec
Promise
support:Usage:
la source
lots_of_stuff_already_done = true;
drapeau - sinon, il n'y a aucun moyen pour la fonction de continuer à se répéter.Une version plus récente de la réponse acceptée.
Version abrégée:
Un bon cas d'utilisation pour quelque chose comme celui-ci est où vous pouvez avoir un code de formulaire hérité qui fonctionne, mais il vous a été demandé d'améliorer le formulaire en ajoutant quelque chose comme la validation de l'adresse e-mail avant de soumettre le formulaire. Au lieu de fouiller dans le code postal du formulaire principal, vous pouvez écrire une API, puis mettre à jour votre code frontal pour accéder à cette API avant d'autoriser le formulaire à faire son POST traditionnel.
Pour ce faire, vous pouvez implémenter un code similaire à ce que j'ai écrit ici:
la source
Vous pouvez faire quelque chose comme
la source
Remplacez la propriété
isDefaultPrevented
comme ceci:IMHO, c'est le moyen le plus complet de redéclencher l'événement avec exactement les mêmes données.
la source
e
n'est pas défini. devrait êtreevt.preventDefault()
. J'ai essayé de modifier, mais mes modifications doivent être> 6 caractères et je viens d'ajouter 2 :(event.isPropagationStopped = function(){ return false; };
. J'ai également ajouté une propriété personnalisée à l'événement afin que je puisse détecter dans le gestionnaire si la vérification qui a empêché l'action a été effectuée afin qu'elle ne soit plus effectuée. Génial!Il est possible d'utiliser
currentTarget
leevent
. L'exemple montre comment procéder avec l'envoi du formulaire. De même, vous pouvez obtenir la fonction de l'onclick
attribut, etc.la source
submit()
le même élément, ne reviendrez-vous pas sur votre code `` $ ('form'). on ('submit') et ne le referez-vous pas encore et encore?Ne l'exécutez pas
e.preventDefault();
ou ne l'exécutez pas sous condition.Vous ne pouvez certainement pas modifier le moment où l'action d'événement d'origine se produit.
Si vous souhaitez "recréer" l'événement d'interface utilisateur d'origine quelque temps plus tard (par exemple, dans le rappel d'une requête AJAX), vous devrez simplement le simuler d'une autre manière (comme dans la réponse de vzwick) ... même si je remettre en question l'opportunité d'une telle approche.
la source
Une réponse plus récente utilise habilement
jQuery.one()
https://stackoverflow.com/a/41440902/510905
la source
tant que "beaucoup de choses" ne font pas quelque chose d'asynchrone, cela est absolument inutile - l'événement appellera chaque gestionnaire sur son chemin dans l'ordre, donc s'il y a un événement onklick sur un élément parent, cela se déclenchera après l'onclik- l'événement de l'enfant a été traité complètement. javascript ne fait pas ici une sorte de "multithreading" qui rend "l'arrêt" du traitement des événements nécessaire. conclusion: «mettre en pause» un événement juste pour le reprendre dans le même gestionnaire n'a aucun sens.
si "beaucoup de trucs" est quelque chose d'asynchrone, cela n'a pas non plus de sens car cela empêche les choses asynchrones de faire ce qu'elles devraient faire (trucs asynchrones) et les fait baisser comme si tout était en séquence (où nous revenons à mon premier paragraphe )
la source
async
-fag: api.jquery.com/jQuery.ajax ) ... mais faire une requête ajax synchrone est une mauvaise idée dans presque tous les cas, il vaudrait donc mieux trouver une solution différente.L'approche que j'utilise est la suivante:
la source
La solution acceptée ne fonctionnera pas si vous travaillez avec une balise d'ancrage. Dans ce cas, vous ne pourrez plus cliquer sur le lien après avoir appelé
e.preventDefault()
. C'est parce que l'événement de clic généré par jQuery est juste une couche au-dessus des événements de navigateur natifs. Ainsi, le déclenchement d'un événement «clic» sur une balise d'ancrage ne suivra pas le lien. Au lieu de cela, vous pouvez utiliser une bibliothèque comme jquery-simulate qui vous permettra de lancer des événements de navigateur natifs.Plus de détails à ce sujet peuvent être trouvés dans ce lien
la source
Une autre solution consiste à utiliser window.setTimeout dans l'écouteur d'événements et à exécuter le code une fois le processus de l'événement terminé. Quelque chose comme...
la source
Je sais que ce sujet est ancien mais je pense que je peux y contribuer. Vous pouvez déclencher le comportement par défaut d'un événement sur un élément spécifique à tout moment dans votre fonction de gestionnaire si vous connaissez déjà ce comportement. Par exemple, lorsque vous déclenchez l'événement de clic sur le bouton de réinitialisation, vous appelez en fait la fonction de réinitialisation sur le formulaire le plus proche comme comportement par défaut. Dans votre fonction de gestionnaire, après avoir utilisé la fonction preventDefault, vous pouvez rappeler le comportement par défaut en appelant la fonction de réinitialisation sur le formulaire le plus proche n'importe où dans votre code de gestionnaire.
la source
Si cet exemple peut aider, ajoute un "popin de confirmation personnalisé" sur certains liens (je garde le code de "$ .ui.Modal.confirm", c'est juste un exemple pour le callback qui exécute l'action d'origine):
la source