Appel AJAX qui s'effectue trop de fois (event JS)

Appel AJAX qui s'effectue trop de fois (event JS) - HTML/CSS - Programmation

Marsh Posté le 21-08-2009 à 15:51:22    

Bonjour a tous
Je m'arrache les cheveux sur un bug depuis le début de l'aprem, avant de devenir chauve je vais vous demander votre avis.
 
Alors, long story short, j'ai une appli web, et de temps en temps un div "modal" apparait. Voila le div en simplifié.
 

Code :
  1. <div id="dialog" class="window">
  2.   <a href="#" class='valid'>Valid it</a>
  3.   <a href="#" class='close'>Close it</a>
  4. </div>


 
Dans mon JS, j'ai une fonction showModal(latlng,overlay) (les attributs latlng et overlay sont des objet de l'API GoogleMaps), qui, encore une fois simplifiée, ressemble a ça :

Code :
  1. function showModal(overlay, latlng) {
  2.      // Je rend mon div #dialog visible & compagnie
  3.      [...]
  4.      // Maintenant les event liés aux link présents dans #dialog
  5. $('.window .close').click(function (e) {
  6.  e.preventDefault();
  7.  $('#dialog').hide();
  8. });
  9.    
  10. $('.window .valid').click(function(e) {
  11.  $.ajax({
  12.                     [...] Appel AJAX en se servant de l'argument 'latlng' de showModal(..)
  13.  });
  14.  $('#dialog').hide();
  15. });
  16. }


 
Passons maintenant a mon problème : Je click sur ma carte Gmaps, ce qui lance showModal(latlng, overlay) ; je décide de ne pas validé, je fait clic donc sur Close it, mon div disparait. Tout va bien.
 
Mais si maintenant je clic quelque part d'autre sur ma carte, et que je clic sur Valid it, BLAM ! Deux appels AJAX, une fois avec le latlng du premier clic, et une fois avec celui du second (légitime lui).
 
Voila donc mon problème, mon event javascript qui lance l'appel AJAX est toujours la, n'est pas overide, et par conséquent se lance trop de fois. Je ne sais pas comment faire pour empêcher cela.
 
Merci de votre aide
 

Reply

Marsh Posté le 21-08-2009 à 15:51:22   

Reply

Marsh Posté le 21-08-2009 à 16:20:01    

pour moi ton code recrée un event à chaque click, donc normal... pour y remédier, tu sors l'appel à tes click de ta fonction:

 
Code :
  1. // Maintenant les event liés aux link présents dans #dialog
  2. $('.window .close').click(function (e) {
  3. e.preventDefault();
  4. $('#dialog').hide();
  5. });
  6.  
  7. $('.window .valid').click(function(e) {
  8. $.ajax({
  9.                   // [...] Appel AJAX en se servant de l'argument 'latlng' de showModal(..)
  10. });
  11. $('#dialog').hide();
  12. });
  13.  
  14. function showModal(overlay, latlng) {
  15.     // Je rend mon div #dialog visible & compagnie
  16.     [...]
  17.  
  18. }
 

après pour le passage de l'argument latlng, tu bidouille un truc, tu genre tu le mets dans un truc caché, et ca roule:

Code :
  1. <div id="dialog" class="window">
  2.    <input type="hidden" name="latlng" value="" />
  3.    <a href="#" class='valid'>Valid it</a>
  4.    <a href="#" class='close'>Close it</a>
  5.  
  6. </div>
 


Message édité par pataluc le 21-08-2009 à 16:20:33
Reply

Marsh Posté le 21-08-2009 à 16:25:22    

Effectivement ca peux fonctionner, ca m'embete un peu de passer mon latlng en input type hidden (c'est un objet, pas des plus complex mais bon).
 
Cette solution va effectivement marcher, mais est-il possible de suprimmer l'event de la class valid ? Si c'est possible, je peux le faire quand on click sur Close It.
 
Merci en tout cas

Reply

Marsh Posté le 21-08-2009 à 16:34:08    

effectivement supprimer l'event serait plus classe... je sais pas si on peut.
 
c'est quoi, du jquery, prototype, mootools?

Reply

Marsh Posté le 21-08-2009 à 16:35:42    

avec jquery tu as unbind qui le fait: http://docs.jquery.com/Events/unbind#typefn

 


EDIT: par contre si j'étais toi, je laisserai le close à l'extérieur vu qu'il ne prend pas de param...


Message édité par pataluc le 21-08-2009 à 16:38:35
Reply

Marsh Posté le 21-08-2009 à 16:39:51    

Yup,  
Thank you =)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed