Imagine que j'ai ce code: Lorsque l'événement de clic est tiré, myFunc1 est appelé, puis myfunc2. Mais comment est-ce que je (si possible) stop myfunc2 d'être appelé si une condition dans myfunc1 est rencontrée? Merci. P> P> événement.stoppropagation () code> n'est pas la solution, car ce n'est pas un événement capturant / problème de bouillonnement. P>
5 Réponses :
Je vais commencer par la réponse la plus simple qui satisfasse les contraintes que vous avez données jusqu'à présent. Si cela ne répond pas à une condition, vous n'avez pas encore précisé, laissez-moi savoir et je vais le mettre à jour.
n'autorise qu'un seul gestionnaire de clic et appelez des fonctions en fonction des conditions là-bas. Votre code de test devient: p> et vous pouvez bien sûr mettre toutes les conditions que vous souhaitez en clickhandler. P> p>
Le problème est a) Je ne suis pas toujours en train de toujours utiliser les deux auditeurs en même temps, et b) les auditeurs sont ajoutés dans différents composants dans une grande bibliothèque de code modulaire, ainsi la fusionner non seulement sans sens, mais aussi assez difficile.
Vous recherchez toujours une meilleure solution, mais cela peut être le seul moyen de le faire: pensées / commentaires Bienvenue. P> P>
la méthode DOM Niveau 3 Event.StopimmediatePropagation code>
est exactement ce dont j'ai besoin ici. Malheureusement, ce n'est actuellement implémenté dans aucun navigateur (que je connais de) del>. p>
Merci d'avoir mentionné cela. Il est actuellement mis en œuvre dans beaucoup de navigateurs .
Il y a un autre problème: l'ordre que les auditeurs d'événements sont exécutés est indéfini. Vous aurez besoin de gérer l'envoi des événements par vous-même pour me contourner, ce qui nous conduit à une variante de la suggestion de Llimllib.
function dispatchSleightEvent(evt) { var listeners = evt.currentTarget.sleightListeners[evt.type]; // can't use for-in because enumeration order is implementation dependent for (var i=0; i<listeners.length; ++i) { if (listeners[i]) { if (! listeners[i].call(evt.currentTarget, evt)) { return false; } } } return true; } function mixinSleightTarget(obj) { if (! obj.sleightListeners) { obj.sleightListeners = {} obj.addSleightListener = function(type, listener) { if (!this.sleightListeners[type]) { this.sleightListeners[type] = []; this.addEventListener(type, dispatchSleightEvent); } if (!this.sleightListeners[type+listener] { this.sleightListeners[type+listener] = this.sleightListeners[type].length; this.sleightListeners[type].push(listener); } } obj.removeSleightListener = function(type, listener) { if (this.sleightListeners[type+listener] { delete this.sleightListeners[type][this.sleightListeners[type+listener]]; delete this.sleightListeners[type+listener]; } } } }
Jusqu'à ce que StopimMédiediatePropagation () soit implémentée, un gestionnaire d'événements personnalisé est la meilleure solution, donc je l'ai marqué comme la réponse. Bien que vous ayez raison que l'ordre est indéfini, il est défini dans DOM NIVEAU-3 (FIFO) et chaque test que j'ai fait dans Gecko suggère que cette commande est cohérente dans la mise en œuvre actuelle (ceci est pour une application interne que seulement doit travailler dans FF3). Pour rien, mais la simplicité pour le moment, j'ai actuellement opté pour une solution similaire à mon premier anwser.
Il y a un problème que j'étais inquiet, l'ordre que les auditeurs sont ajoutés, mais cela ressemble à ce qui n'est pas un problème pour le moment. Un meilleur design supporterait des dépendances explicites auditeur.
I Deuxièmement, la solution OUTS, sonne comme si vous devez décorer ou adapter le modèle de distribution d'événement DOM existant avec votre propre répartiteur d'événement. P>
Quelques recherches et ont trouvé ce lien, qui peut ou non répondre à vos besoins, sur la base d'une mise en œuvre du répartiteur ActionScript, datée de 2007. p>
http://positionnaBsolute.net/blog/2007/ 06 / événement-Dispatcher.php Strike> P>
Lien d'archive Web: https://web.archive.org/web/20170330152239/http://positionnaBsolute.net/blog/2007/06/event-dispatcher.php P>
Bien sûr que je ne suis pas vraiment un javascriper, alors donnez-moi une tête si cela n'est pas pertinent. P>
Sont-ils toujours appelés ensemble?
Non, parfois je n'utilise que l'un ou l'autre. Et les auditeurs sont ajoutés dans différents composants, vous ne pouvez donc pas être combiné.