2013-03-10 1 views
0

J'ai une fonction que j'ai besoin de réutiliser souvent. Le problème se produit lorsque je charge une autre page dans la page en cours, la fonction se déclenche deux fois. J'ai essayé cette solution mais je n'ai pas réussi à l'obtenir (Disable jquery function after 1 click, to prevent multiple executions). Des solutions pour empêcher la fonction de tirer plusieurs fois pendant qu'une demande est faite? La fonction devrait seulement se déclencher une fois par clic.Empêche l'exécution de la fonction jQuery pendant l'exécution de la requête

(function($) { 
    $.fn.likeclick = function(thiss, key) { 
     var $this = thiss; 
     var pid=key; 
     if ($this.hasClass('addd')) { 
      $.post("/blah.php?id="+pid, function(data) { 
       if (data=="ok"){ 
        $this.removeClass('addd').addClass('rem'); 
        $('.ccount#'+pid).html(function(i,val) { 
         return (parseFloat(val) + 1).toFixed(0); 
        }); 
       } 
      }); 
     } else { 
      $.post("/blah1.php?id="+pid, function(data) { 
       if (data=="okk"){ 
        $this.removeClass('rem').addClass('addd'); 
        $('.ccount#'+pid).html(function(i,val) { 
         return (parseFloat(val) - 1).toFixed(0); 
        }); 
       } 
      }); 
     } 
    }; 
})(jQuery); 

Utilisation:

<div class="like addd"></div> 

$('.like').click(function() { 
    likeclick($(this),this.id); 
}); 
+1

Il semble que cela devrait fonctionner pour votre cas. –

+0

"charger une autre page dans la page en cours" - ce qui signifie une sorte d'ajax obtenir? Si oui, que faites-vous après la requête ajax? ce serait plus facile si vous publiez tout le code pertinent. – darshanags

Répondre

0

Si je comprends bien votre question, ce dont vous avez besoin est un moyen pour la fonction de savoir que s'il y a actuellement des demandes actives avant de faire sa demande. Pourquoi ne pas ajouter un booléen comme hasActiveRequest pour garder une trace de cela? Donc par défaut c'est false, puis quand ils cliquent dessus, vérifiez ce booléen ... si faux alors mettez-le à true et faites la demande; sinon si c'est true, alors ne faites pas de requête (puisqu'il y en a déjà une en cours). Lorsque la requête est terminée, redéfinissez le booléen sur false.

+0

pourriez-vous me montrer où placer les booléens. Je sais de quoi vous parlez (if (hasActiveRequest) renvoie false;) mais je ne peux pas savoir où les mettre dans le code – Patriotec

+0

Vous pouvez simplement définir 'var hasActiveRequest = false; 'en haut, ajoutez la ligne juste avant' $ .fn.likeclick = ... ' – sweetamylase

0

Étant donné que les fonctions ne fonctionnaient pas sur les pages (ou les données) chargées avec la méthode .post(), j'ai essayé d'ajouter la fonction jQuery directement ou avec un fichier .js à la page chargée. Dans les deux cas, le code était exécuté plusieurs fois après le chargement de quelques pages à l'aide de .post(). Si j'ai utilisé des retards, des fonctions de temporisation ou des booléens ajoutés pour essayer d'empêcher que la fonction ne soit déclenchée plusieurs fois par clic, la fonction est toujours exécutée plusieurs fois. Après une recherche interminable, je suis tombé sur cet article (http://docs.jquery.com/FAQ#Why_do_my_events_stop_working_after_an_AJAX_request.3F) dans la documentation de jQuery.

Dans cet article, il est écrit:

Attention! À partir de jQuery 1.4.2, le fait de lier plusieurs fois le même gestionnaire au même élément le fera s'exécuter plusieurs fois. Ce diffère des versions précédentes de jQuery ainsi que de la spécification DOM 2 Events (qui ignore normalement les gestionnaires d'événements en double).

Plus de recherche a remonté la méthode .live(), mais cette méthode est obsolète. La méthode .on() a remplacé .live(). Donc, ma solution est la suivante:

$(document).on('click', '.like', function(){ 
var $this = $(this); 
likeclick($this,this.id); 
}); 

Maintenant, je n'ai pas d'ajouter des fonctions à la page chargée (données) de la méthode .post() ou utiliser d'autres méthodes pour essayer d'empêcher la fonction de mise à feu deux fois. Que s'est-il passé lorsque vous avez essayé la technique dans la question liée?

Questions connexes