55 votes

Comment appeler .ajaxStart () sur des appels ajax spécifiques

J'ai des appels ajax sur le document d'un site pour afficher ou masquer une barre de progression en fonction de l'ajax d'état

  $(document).ajaxStart(function(){ 
    	$('#ajaxProgress').show(); 
    });
  $(document).ajaxStop(function(){ 
    	$('#ajaxProgress').hide(); 
    });

Je voudrais essentiellement overwirte de ces méthodes sur les autres parties du site où beaucoup de rapide petits appels ajax sont faites et n'ont pas besoin de la barre de progression sautant dans et hors. Je suis en train de les attacher ou de les insérer dans d'autres $.getJSON et $.les appels ajax. J'ai essayé de chaînage, mais apparemment ce n'est pas bon.

$.getJSON().ajaxStart(function(){ 'kill preloader'});

41voto

dalbaeb Points 2262

Vous pouvez lier ajaxStart et ajaxStop à l'aide d'un espace de noms personnalisé:

 $(document).bind("ajaxStart.mine", function() {
    $('#ajaxProgress').show();
});

$(document).bind("ajaxStop.mine", function() {
    $('#ajaxProgress').hide();
});
 

Ensuite, dans d'autres parties du site, vous les dissociez temporairement avant vos appels .json:

 $(document).unbind(".mine");
 

J'ai eu l'idée d' ici en cherchant une réponse.

EDIT: Je n'ai pas eu le temps de le tester, hélas.

15voto

Jason Rikard Points 762

Si vous mettez ceci dans votre fonction qui gère une action ajax, elle ne se liera que si cela est approprié:

 $('#yourDiv')
    .ajaxStart(function(){
        $("ResultsDiv").hide();
        $(this).show();
    })
    .ajaxStop(function(){
        $(this).hide();
        $(this).unbind("ajaxStart");
    });
 

7voto

GxiGloN Points 1

En outre, si vous voulez désactiver les appels à .ajaxStart() et .ajaxStop() , vous pouvez définir global option false dans votre .ajax() demandes;)

Voir plus ici: Comment appeler .ajaxStart () sur des appels ajax spécifiques

5voto

SolutionYogi Points 16697

Malheureusement, l'événement ajaxStart ne contient aucune information supplémentaire que vous pouvez utiliser pour décider d'afficher ou non une animation.

Quoi qu'il en soit, voici une idée. Dans votre méthode ajaxStart, pourquoi ne pas démarrer l'animation après, disons, 200 millisecondes? Si les demandes ajax se terminent en 200 millisecondes, vous n'affichez aucune animation, sinon vous affichez l'animation. Le code peut ressembler à:

 var animationController = function animationController()
{
    var timeout = null;
    var delayBy = 200; //Number of milliseconds to wait before ajax animation starts.

    var pub = {};

    var actualAnimationStart = function actualAnimationStart()
    {
        $('#ajaxProgress').show();
    };

    var actualAnimationStop = function actualAnimationStop()
    {
        $('#ajaxProgress').hide();
    };

    pub.startAnimation = function animationController$startAnimation() 
    { 
        timeout = setTimeout(actualAnimationStart, delayBy);
    };

    pub.stopAnimation = function animationController$stopAnimation()
    {
        //If ajax call finishes before the timeout occurs, we wouldn't have 
        //shown any animation.
        clearTimeout(timeout);
        actualAnimationStop();
    }

    return pub;
}();


$(document).ready(
    function()
    {
        $(document).ajaxStart(animationController.startAnimation);
        $(document).ajaxStop(animationController.stopAnimation);
    }
 );
 

0voto

Emil Stenström Points 3551

Utilisez ajaxSend et ajaxComplete si vous souhaitez croiser la demande avant de décider quoi faire. Voir ma réponse ici: http://stackoverflow.com/a/15763341/117268

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X