Plusieurs JS gestionnaires d'événements sur un seul élément
Je suis en train de travailler avec une web app, dans l'application, il existe une variété de soumettre des boutons de différentes formes, certains à l'aide de http post, certains de définition d'une fonction onClick, et certains de liaison d'un js gestionnaire d'événement pour le bouton à l'aide d'une classe sur l'élément.
Ce que je veux faire, c'est de lier un autre gestionnaire d'événement pour ces boutons de par le simple ajout d'une classe pour les boutons, mais ce que je veux déterminer est le nouveau gestionnaire d'événement garanti pour être exécuté, ou pourrait-on du formulaire de soumission actions se passent avant qu'il ne la sens ma nouvelle fonction n'est pas touché.
Le scénario de l'exemple est que je veux ajouter une classe à ces boutons qui bimds tous à une fonction js qui se connecte simplement l'utilisation de certaines api. Il y a un risque que la fonction d'enregistrement n'est pas appelé parce que le formulaire de soumission a navigué à partir de la page?
Je n'ai pas fait de charges de js de développement, et j'ai pu tester, 100 fois plus et juste avoir de la chance avec elle de tir.
Ci-dessous est un code que j'ai testé avec pour l'un des exemples - encore une fois, je ne suis pas demandant comment lier plusieurs événements, la question est à propos de ma compréhension de la spécification et si l'exécution de tous les gestionnaires est garanti.
$(document).ready(function(){
$('.testingBtn').click(function() {
window.location.replace("http://stackoverflow.com");
});
$( ".testingBtn" ).click(function(){
alert('submitting!');
});
});
<input class="testingBtn" type="submit" id="submitform" value="Complete Signup" />
Comme vu ci-dessus, je peux lier les événements multiples, et dans cet exemple, juste redirigé vers une autre url, mais cela pourrait être un form.submit()
etc. Dans mon test, l'alerte a toujours tiré la première, mais je suis juste en train de chance avec les conditions de course?
- Êtes-vous à l'aide de jQuery, ou d'autres DOM et de la bibliothèque d'événements? Parce que c'est un cas que la plupart de ces bibliothèques couvrir avec une extrême élégance.
- Yep requête, même si il est plus adapté lib serait heureux d'entendre parler d'eux.
query
? Voulez-vous direjQuery
?- Oui, désolé. Sur mobile.
- J'étais sur mon portable, donc ne pouvait pas facilement ajouter code - ajouter un peu de la question maintenant, cependant, je pense que votre commentaire est un peu injuste - Ma question n'est pas de savoir comment faire quelque chose, il est à préciser ou de corriger ma compréhension de certains js concepts (par exemple, plusieurs gestionnaires d'événements garantie, même si l'on est de la navigation à partir de la page). J'ai essayé, et dans mes expériences qu'ils ont terminé - mais si les conditions de course sont impliquées, comme mentionné, j'ai pu courir le test 1000 fois et avoir de la chance, et il ne suffit pas de prouver le contraire
- désolé, mais j'ai un peu frustré par la lecture de beaucoup de paresseux-questions. Retrait du commentaire, et a ajouté une VanillaJS réponse, avec un lien pour les lire sur le sujet des événements, des événements d'ordre et le lot...
- pas de probs, comprendre la douleur - merci pour la réponse, très utile.
Vous devez vous connecter pour publier un commentaire.
En JS, vous n'avez pas vraiment avoir le contrôle sur ce afin que les gestionnaires d'événements sont appelés, mais avec de l'attention de la délégation et bien placé auditeurs, c'est possible.
Délégation est l'une des fonctionnalités les plus puissantes du modèle d'événement. Comme vous pouvez ou ne pouvez pas savoir: en JS, un événement est remis au haut de la cathédrale, d'où il se propage à l'élément sur lequel l'événement doit être appliquée. Il va de soi, par conséquent, qu'un écouteur d'événement attaché à l'objet global va appeler son maître avant à un auditeur qui a été attaché à l'élément lui-même.
Il est important de noter que nous avons réellement l'accès à l'objet de l'événement dans les gestionnaires. Dans ce cas, nous avons laissé l'objet d'événement intacte, donc il va tout simplement continuer à se propager jusqu'à la cible, sur son chemin vers le bas, il peut répondre avec quelque chose comme ceci:
Maintenant, ce gestionnaire sera appelé après que l'auditeur au niveau de la fenêtre appelle à son aide. Cette fois, l'événement est changé si l'élément cliqué n'ai pas eu le
clickable
classe, ou si l'élément est un lien. L'événement est annulé, mais il vit encore. L'événement est toujours libre de se propager plus bas dans les dom, de sorte que nous pourrions rencontrer quelque chose comme:Ici, en appelant
stopPropagation
, l'événement est tué. Il ne peut pas se propager plus bas dans les dom à sa cible, à moins que l'événement a déjà été modifié. Si non, l'objet de l'événement se déplace plus bas dans les DOM, comme si rien ne s'était passé.Une fois qu'il atteint sa cible, nœud, l'événement entre dans sa deuxième phase: la phase de propagation. Au lieu de se propageant vers le bas dans les profondeurs de la DOM, il remonte jusqu'à, vers le haut niveau (tout le chemin à l'objet global, où elle a été envoyée... par où il est venu et tout le reste).
Dans la phase de propagation, tous les mêmes règles s'appliquent que dans la phase de propagation, seulement dans l'autre sens. L'objet de l'événement iront à la rencontre des éléments qui sont les plus proches de l'élément cible première, et l'objet global dernière.
Il y a beaucoup de pratique, et des schémas clairs pour ce ici. Je ne peux pas le mettre tout de mieux que le bon vieux quirksmode, donc je vous suggère de lire ce qu'ils ont à dire, il y a.
Ligne du bas: lorsque vous traitez avec 2 écouteurs d'événements, de les attacher à la fois à un niveau différent de tri de la file d'attente de la manière que vous souhaitez.
Si vous souhaitez garantir à la fois sont appelés, arrêter seulement le cas de la propagation dans ce gestionnaire qui sera appelé en dernier.
Quand vous avez deux auditeurs, attachés à la même élément/objet pour le même événement, je n'ai jamais rencontré une situation où l'auditeur qui était attaché à la première, n'était pas aussi appelé en premier.
Ça y est, je suis au lit, en espérant que j'ai fait sens
jQuery facilite cette tâche.
Gestionnaires alors à la fois le feu sur cliquez sur. jQuery conserve une file d'attente de droitiers, pour vous. Et les poignées de document de clics correspondant à un sélecteur de votre choix afin qu'ils puissent être déclenchée n'importe quand vos boutons sont créés.
Je suis/a avoir un problème similaire que celui-ci. Cependant, je ne peux pas affecter l'ordre de/délégué de la pré-existant ', cliquez sur' événements (ajouté par Guichet cadre).
Mais j'ai encore besoin d'exécuter un nouvel événement personnalisé avant tout le "clic" ou "modifier" événements gérés par le framework.
Heureusement, il y a plusieurs événements qui sont effectivement exécutés dans l'ordre. Le "mousedown" et le "mouseup" arrive à passer avant le "click".
http://en.wikipedia.org/wiki/DOM_events
OU
Cela permettra à l'enregistrement pour être fait (par exemple via ajax) avant l'événement, est exécutée par exemple, un changement de page via ajax () lien.
Bien sûr, vous pouvez avoir besoin d'avoir des moyens plus sophistiqués pour détecter ce que les autres la gestion des événements devrait être fait, mais vous pouvez utiliser par exemple la "cible" de l'information pour cela. => Ce script surveille tout sur la page, car c'est ainsi que j'ai besoin de le faire.