Comment faire pour désactiver temporairement un gestionnaire de clic en jQuery?
Dire que j'ai quelque chose comme ce qui suit pour intercepter l'événement click d'un bouton:
$("#button_id").click(function() {
//disable click event
//do something
//re-enable click event
}
Comment puis-je désactiver temporairement l'événement click du bouton jusqu'à la fin du traitement de l'original, cliquez sur se produit? J'ai pratiquement la div disparaissent après que le bouton est cliqué, mais si l'utilisateur clique sur le bouton rapide à plusieurs reprises, il traite toutes les clics avant la div obtient une chance de disparaître. Je veux "anti-rebond" sur le bouton de sorte que seul le premier clic est enregistré avant le div disparaît.
- similaire: stackoverflow.com/questions/4674991/...
- 3 bonnes façons de le faire stackoverflow.com/a/1922012/781695
Vous devez vous connecter pour publier un commentaire.
J'ai remarqué que ce post est vieux mais il s'affiche en haut sur google et ce genre de solution n'a jamais été offert donc j'ai décidé de le poster quand même.
Vous pouvez simplement désactiver le curseur d'événements et de les réactiver plus tard, via le css. Il est pris en charge sur tous les principaux navigateurs et peut s'avérer utile dans certaines situations.
.css()
appels. Voir jsfiddle.net/at75H/16 pour une démonstration; ouvrez votre console, cliquez sur le bouton un tas de fois, et observer que le gestionnaire s'exécute plusieurs fois de suite en dépit de vous désactiver les événements de pointeur.C'est un plus idiomatiques alternative à l'artificiel, de l'état de la variable solutions:
Un ne sont exécutés qu'une seule fois (jusqu'à ce attachés à nouveau). Plus d'infos ici: http://docs.jquery.com/Events/one
setTimeout
appelez - je vais écrire une réponse à ce sujet quand j'ai de la chance.N'oubliez pas que l' $.de données() ne fonctionne que pour les articles avec ID.
dont
attribut à 0.Vous pouvez séparer votre gestionnaire avec
.off
, mais il y a une mise en garde; si vous ne le faites pas tout simplement empêcher le gestionnaire d'être déclenché à nouveau alors qu'il est déjà en cours d'exécution, vous devez reporter reconsolidation du gestionnaire.Considérons par exemple ce code, qui utilise un 5-deuxième chaud de sommeil pour simuler quelque chose synchrone et coûteuse en termes de calcul étant effectué directement depuis le gestionnaire (comme lourd de manipulation du DOM, par exemple):
Cela ne fonctionnera pas. Comme vous pouvez le voir si vous l'essayer dans cette JSFiddle, si vous cliquez sur le bouton pendant que le gestionnaire est déjà en cours d'exécution, le gestionnaire d'exécuter une deuxième fois, après la première exécution de finitions. Qui plus est, au moins dans Chrome et Firefox, ce serait vrai même si vous n'avez pas utiliser jQuery et utilisé
addEventListener
etremoveEventListener
d'ajouter et de supprimer le gestionnaire de la place. Le navigateur exécute le gestionnaire d'après le premier clic, la déliaison et la reconsolidation du gestionnaire, et puis gère le deuxième clic et vérifie si il y a un gestionnaire de clic sur exécuter.Pour contourner ce problème, vous devez reporter une nouvelle liaison de la gestionnaire de l'aide
setTimeout
, de sorte que les clics qui se passe pendant que le premier gestionnaire est en cours d'exécution seront traitées avant vous rattachez le gestionnaire.Vous pouvez le voir en action à cette modification JSFiddle.
Naturellement, cela est inutile si ce que vous faites dans votre gestionnaire est déjà asynchrone, car alors vous êtes déjà à la cession du contrôle du navigateur et de le laisser rincer tous les événements de clic avant de vous relier à votre gestionnaire. Par exemple, un code comme cela fonctionne très bien sans une
setTimeout
appel:Vous pouvez le faire comme d'autres personnes avant moi, dit l'aide d'un coup d'oeil:
A.) D'Utilisation .données de l'élément de bouton pour partager un coup d'oeil variable (ou juste dans la variable globale)
B.) Désactiver la souris signaux
C.) Si c'est un bouton en HTML, vous pouvez le désactiver (input [type=submit] ou le bouton)
Mais regarder dehors pour d'autres discussions! J'ai échoué à plusieurs reprises en raison de mon animation (en voie de disparition dans ou à l'extérieur) a pris une seconde.
E. g. fadeIn/fadeOut prend en charge une fonction de rappel comme deuxième paramètre.
Si il n'y a pas d'autre moyen juste de le faire à l'aide de
setTimeout(callback, delay)
.Accueille,
Thomas
Si #button_id implique un standard bouton en HTML (comme un bouton), vous pouvez utiliser le 'disabled' attribut faire sur le bouton inactif pour le navigateur.
Ce que vous devez être prudent avec, cependant, est l'ordre dans lequel ces choses peuvent arriver. Si vous utilisez jquery cacher commande, vous voudrez peut-être inclure le "$('#button_id').removeAttr('disabled');" dans le cadre d'un appel de retour, de sorte qu'il ne se produit pas jusqu'à ce que la peau est complète.
[modifier] exemple de fonction à l'aide d'un rappel:
disabled
attribut. Vous devez reporter la suppression de l'attribut (par exemple, avecsetTimeout
) pour que cela fonctionne.Essayer en utilisant
.one()
JS:
CSS:
HTML:
setTimeout
), mais il n'y a aucune explication de ce qui se passe; je n'ai pas envie que ce serait utile pour moi si je ne l'avais pas déjà fait comprendre la nécessité de reporter les réinstallant le gestionnaire.setTimeout
), mais il n'y a aucune explication de ce qui se passe L'approche actuelle consiste à utiliser.one()
.setTimeout
,.fadeOut()
,.fadeIn()
ont été à des fins de démonstration de l'utilisation de.one()
. C'est, d'événement est appelé plus d'une fois; re-joindre événement à l'aide de.one()
lorsque tous synchrone ou asynchrone d'un processus. Si sur aubutton
se produit avant d'effectuer des tâches, aucun événement sera fixé; l'événement est attaché, re-joint un à la foisil est préférable que l'utilisation actuelle de l'événement et de ne pas sauver gestionnaire mondial de gestionnaire.
je reçois élément courant de l'événement, puis séparer puis de lier à nouveau.
pour un gestionnaire.
pour tout gestionnaire
J'ai juste rencontré ce problème quand j'essaie d'afficher un chargement spinner pendant que j'attendais pour une fonction à remplir. Parce que j'étais en ajoutant la touche de navigation dans le code HTML, le compteur serait dupliqué à chaque fois que le bouton a été cliqué, si vous n'êtes pas à l'encontre de la définition d'une variable à l'échelle mondiale, puis cela a bien fonctionné pour moi.
Avis, tout ce que je suis en train de faire est de déclarer une variable, et tant que sa valeur est null, les mesures à prendre après le clic, puis par la suite définir les variables de la valeur à "true" (il pourrait être n'importe quelle valeur, tant qu'il n'est pas vide), plus de la désactivation de la touche jusqu'à ce que le navigateur est actualisé ou la variable est définie sur null.
Regardant en arrière, il aurait probablement fait plus de sens de il suffit de régler le hasCardButtonBeenClicked variable "false" pour commencer, puis alterner entre "vrai" et "faux" en tant que de besoin.
Cet exemple.
Code HTML:
jQuery:
Ne pas utiliser
.attr()
faire les handicapés, utiliser.prop()
, c'est mieux.Ce code affiche le chargement sur l'étiquette du bouton, et le bouton de réglage de désactivation de l'état, puis, après traitement, de le ré-activer et retourner l'original du texte du bouton: