427 votes

Comment afficher le spinner de chargement en jQuery ?

Sur Prototype Je peux afficher une image "loading..." avec ce code :

var myAjax = new Ajax.Request( url, {method: 'get', parameters: pars, 
onLoading: showLoad, onComplete: showResponse} );

function showLoad () {
    ...
}

Sur jQuery Je peux charger une page de serveur dans un élément avec ceci :

$('#message').load('index.php?pg=ajaxFlashcard');

mais comment attacher un spinner de chargement à cette commande comme je l'ai fait dans Prototype ?

815voto

nickf Points 185423

Il y a plusieurs façons de procéder. Ma méthode préférée consiste à attacher une fonction aux événements ajaxStart/Stop de l'élément lui-même.

$('#loadingDiv')
    .hide()  // Hide it initially
    .ajaxStart(function() {
        $(this).show();
    })
    .ajaxStop(function() {
        $(this).hide();
    })
;

Les fonctions ajaxStart/Stop se déclencheront à chaque fois que vous ferez des appels Ajax.

Mise à jour : À partir de jQuery 1.8, la documentation indique que .ajaxStart/Stop ne doivent être attachés qu'à document . Cela transformerait l'extrait ci-dessus en :

var $loading = $('#loadingDiv').hide();
$(document)
  .ajaxStart(function () {
    $loading.show();
  })
  .ajaxStop(function () {
    $loading.hide();
  });

51 votes

C'est probablement trop vaste pour un simple chargement dans un DIV.

373 votes

Trop global ? combien de messages différents "veuillez attendre" voulez-vous ?

23 votes

De cette façon, vous ne pouvez malheureusement pas contrôler le positionnement de la div de chargement au cas où vous ne voudriez pas simplement afficher une fenêtre de chargement modale, mais l'afficher près de l'élément qui attend le chargement du contenu ajax...

227voto

kr00lix Points 2056

Pour jQuery, j'utilise

jQuery.ajaxSetup({
  beforeSend: function() {
     $('#loader').show();
  },
  complete: function(){
     $('#loader').hide();
  },
  success: function() {}
});

13 votes

Fonctionne pour moi, le html devrait avoir quelque chose comme : <div id='loader'><img src="spinner.gif"/></div>

7 votes

Celui-ci était le plus propre pour moi. Au lieu de ajaxSetup, j'ai placé beforeSend : et complete : à l'intérieur de l'instruction $ajax({....

5 votes

Je ne sais pas ce que ça vaut, mais jQuery mentionne dans sa documentation que l'utilisation de l'option .ajaxSetup() n'est pas recommandé. lien

55voto

PHPSeeker Points 532

Vous pouvez simplement utiliser la fonction jQuery .ajax et utiliser son option beforeSend et définissez une fonction dans laquelle vous pouvez afficher quelque chose comme une division de chargement et, en cas de succès, vous pouvez cacher cette division de chargement.

jQuery.ajax({
    type: "POST",
    url: 'YOU_URL_TO_WHICH_DATA_SEND',
    data:'YOUR_DATA_TO_SEND',
    beforeSend: function() {
        $("#loaderDiv").show();
    },
    success: function(data) {
        $("#loaderDiv").hide();
    }
});

Vous pouvez avoir n'importe quelle image Gif tournante. Voici un site web qui est un excellent générateur de chargeurs AJAX en fonction de votre schéma de couleurs : http://ajaxload.info/

19 votes

El success ne sera pas appelé s'il y a une erreur, mais "vous recevrez toujours une complete callback, même pour les demandes synchrones", selon Événements Ajax de jQuery .

25voto

Josh Stodola Points 42410

Vous pouvez insérer l'image animée dans le DOM juste avant l'appel AJAX, et faire une fonction en ligne pour la supprimer...

$("#myDiv").html('<img src="images/spinner.gif" alt="Wait" />');
$('#message').load('index.php?pg=ajaxFlashcard', null, function() {
  $("#myDiv").html('');
});

Cela permettra de s'assurer que votre animation démarre à la même image lors des requêtes suivantes (si cela est important). Notez que les anciennes versions d'IE pourrait ont des difficultés avec l'animation.

Bonne chance !

13 votes

Astuce : Préchargez le spinner.gif dans un div avec un affichage défini sur none. Sinon, vous risquez d'obtenir un effet de retard dans le téléchargement du spinner.

0 votes

Bon conseil, beaucoup plus simple que d'utiliser le plugin de quelqu'un d'autre

0 votes

Joli ! mais mon cher, une chose de plus que je veux afficher spinner pendant 2 secondes même la page a déjà chargé.

21voto

UltimateBrent Points 6167
$('#message').load('index.php?pg=ajaxFlashcard', null, showResponse);
showLoad();

function showResponse() {
    hideLoad();
    ...
}

http://docs.jquery.com/Ajax/load#urldatacallback

0 votes

Vous pourriez avoir des problèmes de timing là, n'est-ce pas ?

2 votes

@UltimateBrent Je pense que vous vous trompez. Pourquoi showLoad() n'est pas un callback ? JavaScript chargera le contenu de manière asynchrone. showLoad() fonctionnera avant même que le contenu soit chargé si je ne me trompe pas.

2 votes

@Jaseem J'utilise aussi une méthode similaire et elle repose en fait sur des appels asynchrones. Je placerais showLoad quelque part avant l'appel ajax, mais le but est de montrer un spinner, de laisser JS lancer l'appel et de tuer le spinner dans un callback une fois l'AJAX terminé.

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