2010-05-19 6 views
1

J'utilise le code suivant pour capturer tous les appels AJAX en cours à partir de mon application, afin de montrer un compteur occupé jusqu'à ce que l'appel soit terminé. Cela fonctionne bien lorsque les demandes sont bien espacées. Cependant, lorsque la requête est faite en succession rapide, certains appels AJAX ne sont pas enregistrés, ou les actions onCreate et onComplete sont éjectées en même temps, et plus souvent qu'autrement, le spinner occupé continue d'apparaître à l'écran , après tous les appels ont terminé avec succès. Y at-il un contrôle que je peux effectuer à la fin de l'appel, pour vérifier si l'élément est visible, je peux le cacher.Effect.toggle et appels AJAX

document.observe("dom:loaded", function() { 
$('loading').hide(); 
Ajax.Responders.register({ 
//When an Ajax call is made. 
onCreate: function() { 
new Effect.toggle('loading', 'appear'); 
new Effect.Opacity('display-area', { from: 1.0, to: 0.3, duration: 0.7 }); 
}, 

onComplete: function() { 
new Effect.toggle('loading', 'appear'); 
new Effect.Opacity('display-area', { from: 0.3, to: 1, duration: 0.7 }); 
} 
}); 
}); 

Merci!

Répondre

1

Vous devez tenir compte du nombre de demandes AJAX traitées et ne masquer l'indicateur de chargement que si aucune autre demande n'est en cours de traitement.

code Essayez similaire à ce qui suit:

document.observe("dom:loaded", function() { 

    var ajaxRequestsInProgress = 0; 

    $('loading').hide(); 

    Ajax.Responders.register({ 
    //When an Ajax call is made. 
    onCreate: function() { 
     if(!ajaxRequestsInProgress) 
     { 
     new Effect.toggle('loading', 'appear'); 
     new Effect.Opacity('display-area', { from: 1.0, to: 0.3, duration: 0.7 }); 
     } 
     ajaxRequestsInProgress++; 
    }, 

    onComplete: function() { 
     ajaxRequestsInProgress--; 
     if(!ajaxRequestsInProgress) 
     { 
     new Effect.toggle('loading', 'appear'); 
     new Effect.Opacity('display-area', { from: 0.3, to: 1, duration: 0.7 }); 
     } 
    } 
    }); 
}); 
+0

Merci! Fonctionne comme un charme. Les deux réponses suggérées par bmoeskau et Josh véhiculent la même idée! – Gunner4Life

+0

C'est parce que les grands esprits se ressemblent ;-) – Josh

2

Une approche simple serait de créer une variable de compteur qui a une portée en dehors de vos deux fonctions et l'incrémenter dans onCreate et décrémenter dans onComplete. Masquez ensuite le compteur lorsque le compteur atteint 0.