Comment ordonner les évènements liés avec jQuery
Permet de dire que j'ai une application web qui a une page qui peut contenir 4 blocs de script le script que j'écris peut être trouvée dans l'un de ces blocs, mais je ne sais pas laquelle, qui est géré par le contrôleur.
- Je lier certains onclick
événements à un bouton, mais je trouve que, parfois, ils s'exécutent dans un ordre, je ne m'attendais pas.
Est-il un moyen d'assurer l'ordre, ou comment avez-vous traité ce problème dans le passé?
- Ajoutez vos rappels à un objet de Rappel et quand vous voulez le feu eux, vous pouvez les tirer tous à la fois, et elles s'exécutent dans l'ordre ajouté. api.jquery.com/jQuery.Callbacks
Vous devez vous connecter pour publier un commentaire.
J'avais essayé pour les âges de généraliser ce type de démarche, mais dans mon cas, j'ai été intéressée uniquement par l'ordre du premier écouteur d'événement dans la chaîne.
Si c'est de toute utilisation, voici mon plugin jQuery qui lie un écouteur d'événement qui est toujours déclenché avant toutes les autres:
** Mise à JOUR en ligne avec jQuery changements (merci Toskan) **
Choses à noter:
this.data("events")
, voir ici stackoverflow.com/questions/12214654/...Si l'ordre est important, vous pouvez créer vos propres événements et de lier des rappels à feu lors de ces événements sont déclenchés par d'autres rappels.
Quelque chose comme ça au moins.
Dowski de la méthode est bonne si tous vos rappels sont toujours présents et vous êtes heureux avec eux être dépendants les uns des autres.
Si vous voulez que les rappels à être indépendants les uns des autres, cependant, vous pourrait être pour profiter de bulles et de joindre les événements ultérieurs que les délégués des parents d'éléments. Les gestionnaires sur les éléments de parent sera déclenchée après les gestionnaires sur l'élément, en continuant jusqu'à ce document. C'est assez bonne, que vous pouvez utiliser
event.stopPropagation()
,event.preventDefault()
, etc sauter des gestionnaires et d'annuler ou de l'onu-annuler l'action.Ou, si vous n'aimez pas cela, vous pouvez utiliser Nick Lessive bindLast plugin à la force d'un événement lié dernier: https://github.com/nickyleach/jQuery.bindLast.
Ou, si vous utilisez jQuery 1.5, vous pouvez aussi être de faire quelque chose d'intelligent avec le nouveau Différé d'objet.
.delegate
n'est plus utilisé, et vous devriez maintenant utiliser.on
, mais je ne sais pas comment vous pouvez atteindre le même comportement avecon
L'ordre lié à des rappels sont appelés, est gérée par chaque objet jQuery de données d'événement. Il n'y a pas toutes les fonctions (que je connais) qui vous permettent de visualiser et de manipuler directement les données, vous ne pouvez utiliser bind() et unbind() (ou l'équivalent des fonctions d'assistance).
Dowski de la méthode est la meilleure, vous devez modifier les divers liés rappels à se lier à une séquence ordonnée d'événements personnalisés, avec la "première" de rappel lié à la "vraie" de l'événement. De cette façon, peu importe dans quel ordre ils sont liés, la séquence s'exécute dans le droit chemin.
La seule alternative que je peux voir, c'est quelque chose que vous vraiment, vraiment pas envie de contempler: si vous connaissez la syntaxe de liaison de l'fonctions peuvent avoir été lié, devant vous, essayez de l'onu-lier toutes ces fonctions, et puis re-lier dans le bon ordre vous-même. C'est juste des ennuis, parce que maintenant vous avez le code dupliqué.
Ce serait cool si jQuery vous a permis de vous tout simplement de changer l'ordre des événements liés à un objet de données de l'événement, mais sans écrire un peu de code pour accrocher dans le jQuery de base qui ne semble pas possible. Et il y a probablement des implications de permettre à ce que je n'ai pas pensé, peut-être que c'est une omission intentionnelle.
Veuillez noter que dans le jQuery univers cela doit être mis en œuvre différemment de la version 1.8. La suite de la parution de la note est de le jQuery blog:
Nous faire avoir le contrôle complet de l'ordre dans lequel les gestionnaires d'exécuter dans le jQuery univers. Ricoo des points ci-dessus. Ne ressemble pas à sa réponse lui a valu beaucoup d'amour, mais cette technique est très pratique. Considérons, par exemple, chaque fois que vous devez exécuter votre propre gestionnaire avant un gestionnaire dans une bibliothèque widget, ou vous devez avoir le pouvoir d'annuler l'appel pour le widget du gestionnaire conditionnellement:
juste lier gestionnaire normalement, puis exécutez:
ainsi, par exemple:
$._data(element, 'events')[name].reverse()
œuvresVous pouvez essayer quelque chose comme ceci:
J'ai le même problème et a trouvé ce sujet. les réponses ci-dessus peut résoudre ces problème, mais je ne pense pas que eux sont de bons projets.
permettez-nous de penser le monde réel.
si nous utilisons ces réponses, nous devons changer notre code. vous devez changer votre style de code. quelque chose comme ceci:
original:
hack:
comme le temps passe, pensez à votre projet. le code est moche et difficile à lire! anthoer raison est simple est toujours la meilleure. si vous avez 10 bindAtTheStart, il peut pas de bugs. si vous avez 100 bindAtTheStart, êtes-vous vraiment sûr que vous pouvez garder dans le bon ordre?
donc, si vous devez lier mêmes événements multiples.Je pense que la meilleure façon de contrôler les js-fichier ou js-code de l'ordre de chargement. jquery peut gérer des données d'événements comme la file d'attente. la commande est du premier entré, premier sorti. vous n'avez pas besoin de modifier le code. il suffit de changer l'ordre de chargement.
Voici mon coup, couvrant les différentes versions de jQuery:
Dans certains cas particuliers, lorsque vous ne pouvez pas changer la façon dont les événements de clic sont liés (les liaisons d'événements sont fabriqués à partir d'autres codes), et vous pouvez modifier l'élément HTML, voici une solution possible (avertissement: c'est pas la méthode recommandée pour lier les événements, d'autres développeurs vous assassiner pour cela):
Avec cette façon de liaison, votre événement virage sera ajouté en premier, de sorte qu'il sera exécuté en premier.
JQuery 1.5 introduit des promesses, et voici l'implémentation la plus simple que j'ai vu pour contrôler l'ordre d'exécution. Une documentation complète à http://api.jquery.com/jquery.when/