Comment continuer la propagation de l'évènement après l'annulation?
Lorsqu'un utilisateur clique sur un lien, je tiens à présenter avec une boîte de dialogue de confirmation. Si on clique sur "Oui", je voudrais continuer la navigation d'origine. Un hic: ma boîte de dialogue de confirmation est mis en œuvre par le retour de jQuery.Différée objet qui est résolu que lorsque/si l'utilisateur clique sur le bouton Oui. Donc, fondamentalement, la boîte de dialogue de confirmation est asynchrone.
Donc, fondamentalement, je veux quelque chose comme ceci:
$('a.my-link').click(function(e) {
e.preventDefault(); e.stopPropogation();
MyApp.confirm("Are you sure you want to navigate away?")
.done(function() {
//continue propogation of e
})
})
Bien sûr, je pourrais être un drapeau et re-trigger sur, mais c'est salissant que diable. Aucun moyen naturel de le faire?
- Avez-vous essayé
$this.trigger(e);
(edit qui aurait besoin d'un drapeau si cela a fonctionné) ou$this.parent().trigger(e)
(dans le rappel), où$this
se réfère à l'cliqué éléments? - Cela ne marchera pas parce que
e.preventDefault(); e.stopPropogation();
a envoyé des drapeaux sur l'e. Si il y avait moyen d'en prendre une copie de l'e à l'e2 alors que je pourrais appeler quelque chose le long des lignes dee.handler(e2)
qui je pense pourrait fonctionner. - Eh bien, j'ai pensé que peut-être que jQuery est assez intelligent et réinitialise les drapeaux lorsqu'elle est passée à
trigger
... - bon appel, mais je viens de vérifier le code - pas de chance.
- Je viens d'essayer votre
.parent()
solution à l'aide de l'objet d'événement, et il semble bien fonctionner. jsfiddle.net/vTzDM je me demande pourquoi elle n'avait pas de travail pour George. - Je suppose qu'il a essayé
.trigger(e)
(qui ne fonctionne pas). Dans votre cas, l'objet event est juste passé comme paramètre pour le gestionnaire d'événements, mais ses propriétés ne sont pas utilisés pour le nouvel événement de l'objet, de sorte que le passant ne semble pas être nécessaire. Je ne sais pas si l'OP a besoin ou pas..parent().click()
semble être une bonne alternative, mais cela dépend de ce que les autres gestionnaires d'événements dans la hiérarchie sont en train de faire. Merci d'essayer 🙂 - Ah, vous avez raison. J'ai mal dans ma réponse trop.
- Je pense que la deuxième et la troisième suggestion sont vraiment bon.
- Merci, mais si l'original de l'objet d'événement n'est pas nécessaire, alors
.parent().click()
serait de loin la plus simple.
Vous devez vous connecter pour publier un commentaire.
Ci-dessous sont les bits du code qui fonctionne dans Chrome 13, à ma grande surprise.
Ce n'est pas très croix-navigateur, et peut-être sera corrigé à l'avenir, car il se sent comme risque pour la sécurité, à mon humble avis.
Et je ne sais pas ce qui se passe, si vous annulez la propagation de l'évènement.
return false
doit appelere.stopPropogation()
- mais ce pourrait être un navigateur de mise en œuvreJ'ai résolu le problème par la voie de l'un de mes projets. Cet exemple fonctionne avec certains de base de la gestion d'événements, comme les clics etc. Gestionnaire de confirmation doit être le premier gestionnaire d'lié.
$(el).data('events')
a été supprimé. Il n'est pas officiel et non pris en charge de façon à obtenir des événements en faisant$._data(el, 'events')
noter que el doit être un objet DOM et pas jquerySi je suis la compréhension du problème correctement, je pense que vous pouvez juste le mettre à jour l'événement à l'origine de l'événement de clôture que vous avez là. Donc juste un ensemble e = e.originalEvent dans le .fait fonction.
https://jsfiddle.net/oyetxu54/
ici est un violon avec un autre exemple (garder la console ouverte de sorte que vous pouvez voir les messages):
cela a fonctionné pour moi sur chrome et firefox
J'ai résolu ce problème par:
JS:
HTML:
La raison que j'ai ajouté l'écouteur d'événement pour le parent et non pas le lien lui-même est parce que le jQuery
on
événement vont se lier à l'élément jusqu'à ce que dit le contraire. Ainsi, même si l'élément n'a pas la classeanother-page
il a encore de l'écouteur d'événement attaché ainsi, vous devez prendre avantage deevent delegation
pour résoudre ce problème.PIÈGES c'est très état. c'est à dire si vous avez besoin de demander à l'utilisateur CHAQUE fois qu'ils cliquent sur un lien, vous aurez à ajouter un 2ème auditeur à readd la
another-page
retour en classe sur le lien. c'est à dire:note de côté vous pouvez également supprimer l'écouteur d'événement sur
container
si l'utilisateur accepte, si vous faites cela, assurez-vous d'utilisernamespace
événements, car il pourrait y avoir d'autres auditeurs sur le conteneur, vous pourriez involontairement supprimer. voir https://api.jquery.com/event.namespace/ pour plus de détails.Nous avons une exigence analogue dans notre projet et cela fonctionne pour moi. Testé sur chrome et IE11.
J'ai édité votre code. De nouvelles fonctionnalités que j'ai ajouté:
Code:
Ce n'est pas testée, mais pourrait servir comme une solution de contournement pour vous