2010-04-07 4 views
13

J'ai une étiquette d'ancrage <a class="next">next</a> faite dans un "bouton". Parfois, cette balise doit être cachée s'il n'y a rien de nouveau à montrer. Tout fonctionne bien si je cache simplement le bouton avec .hide() et le ré-affiche avec .show(). Mais je voulais utiliser .fadeIn() et .fadeOut() à la place. Le problème que j'ai est que si l'utilisateur clique sur le bouton pendant l'animation fadeOut, il peut causer des problèmes avec la logique que j'ai en cours d'exécution de l'émission. La solution que j'ai trouvée consistait à dissocier l'événement click du bouton après le début de la fonction de clic d'origine, puis à le relier une fois l'animation terminée.Comment "relier" l'événement click après unbind ('click')?

$('a.next').click(function() { 
    $(this).unbind('click'); 
    ... 
    // calls some functions, one of which fades out the a.next if needed 
    ... 
    $(this).bind('click'); 
} 

La dernière partie de l'exemple ci-dessus ne fonctionne pas. L'événement click n'est pas re-lié à l'ancre. est-ce que quelqu'un sait la bonne manière d'accomplir ceci? Je suis un gars jquery autodidacte, donc certaines des choses de plus haut niveau comme unbind() et bind() sont sur ma tête, et la documentation de jquery n'est pas vraiment assez simple pour que je puisse la comprendre.

Répondre

15

Je voudrais juste ajouter un chèque pour voir si elle est d'abord animant:

$('a.next').click(function() { 
    if (!$(this).is(":animated")) { 
     // do stuff 
    } 
}); 
+0

Merci nickf, Cela a fonctionné parfaitement. Mais je suis toujours curieux de savoir comment je "relier" l'événement click si quelqu'un le sait. – Ben

6

Lorsque vous REBIND l'événement click, vous commencez partout. Vous devez fournir la fonction que vous avez l'intention de gérer les événements. jQuery ne se souvient pas d'eux pour vous après avoir appelé "unbind".

Dans ce cas particulier, c'est un peu plus compliqué. Le problème est que lorsque vous démarrez ces animations, vous lancez une série d'actions qui sont pilotées par une minuterie. Ainsi, le désengagement et la reliaison du gestionnaire de "click" à l'intérieur du gestionnaire de clic lui-même n'aidera vraiment rien. Ce que aiderait (en supposant que vous ne voulez pas résoudre le problème avec l'astuce is(":animated")) serait de délier le gestionnaire, puis de rebondir dans le rappel "finish" de votre animation.

Lorsque vous configurez le gestionnaire « clic » en premier lieu, vous pouvez séparer la déclaration de la fonction de l'appel à « cliquez sur() »:

var handler = function() { 
    $(this).whatever(); 
}; 
$('a.next').click(handler); 

Ensuite, si vous finissez par vouloir Pour dissocier/relier, vous pouvez répéter cet appel pour "cliquer" et vous référer à la fonction "gestionnaire" de la même manière.

+0

Je comprends ce que vous dites, mais je ne sais pas comment le traduire en code. La fonction que je veux arriver est exactement ce que click() était. Comment puis-je coder cela? – Ben

+0

Comment le "clic" est-il lié en premier lieu (avant d'appeler "unbind")? Oh attends je vois - c'est * le * gestionnaire de clic. OK, attendez et je vais modifier ma réponse. – Pointy

+0

Je pense que je comprends ce que vous dites.Dans votre exemple ci-dessus "handler" est une fonction, et je pense que lorsque vous appelez une fonction, vous avez besoin des parenthèses d'ouverture et de fermeture(). – Ben

2

Une simple et courte solution

(sans utiliser la liaison/méthode unbind)

est d'ajouter une classe à l'objet si vous souhaitez le dissocier supprimer ensuite cette classe pour rebind ex;

$('#button').click(function(){ 
    if($(this).hasClass('unbinded')) return; 
    //Do somthing 
}); 

$('#toggle').click(function(){ 
    $('#button').toggleClass('unbinded'); 
});