616 votes

Animation jQuery "Please Wait, Loading..." ?

Je voudrais placer une animation en forme de cercle tournant "Veuillez patienter, chargement" sur mon site. Où puis-je trouver un plugin d'animation JQuery "Please wait, loading" ?

1282voto

Jonathan Sampson Points 121800

Vous pouvez le faire de différentes manières. Cela peut être aussi subtil qu'un petit statut sur la page disant "Chargement...", ou aussi fort qu'un élément entier qui grise la page pendant le chargement des nouvelles données. L'approche que j'adopte ci-dessous vous montre comment réaliser les deux méthodes.

La mise en place

Commençons par obtenir une belle animation de "chargement" à partir de http://ajaxload.info ( Je vais utiliser http://i.stack.imgur.com/FhHRx.gif ).

Créons un élément que nous pouvons afficher/masquer chaque fois que nous faisons une requête ajax :

<div class="modal"><!-- Place at bottom of page --></div>

Le CSS

Ensuite, nous allons lui donner un peu de style :

/* Start by setting display:none to make this hidden.
   Then we position it in relation to the viewport window
   with position:fixed. Width, height, top and left speak
   speak for themselves. Background we set to 80% white with
   our animation centered, and no-repeating */
.modal {
    display:    none;
    position:   fixed;
    z-index:    1000;
    top:        0;
    left:       0;
    height:     100%;
    width:      100%;
    background: rgba( 255, 255, 255, .8 ) 
                url('http://i.stack.imgur.com/FhHRx.gif') 
                50% 50% 
                no-repeat;
}

/* When the body has the loading class, we turn
   the scrollbar off with overflow:hidden */
body.loading {
    overflow: hidden;   
}

/* Anytime the body has the loading class, our
   modal element will be visible */
body.loading .modal {
    display: block;
}

Et enfin, le jQuery

Très bien, passons à JQuery. La partie suivante est en fait très simple :

$body = $("body");

$(document).on({
    ajaxStart: function() { $body.addClass("loading");    },
     ajaxStop: function() { $body.removeClass("loading"); }    
});

C'est fait ! Nous attachons des événements à l'élément body à n'importe quel moment de la journée. ajaxStart ou ajaxStop sont déclenchés. Quand un événement ajax commence, nous ajoutons la classe "loading" au corps. et quand les événements sont terminés, nous enlevons la classe "loading" du corps.

Voyez-le en action : http://jsfiddle.net/VpDUG/4952/

9 votes

C'est la solution la plus approfondie, mais je vous recommande d'utiliser un plugin de centrage qui centre le préchargeur autour d'un élément de la page ( c'est-à-dire body, #element, ou .element )

2 votes

Ce serait un bel ajout, cballou. J'essayais simplement de minimiser l'information - mais comme vous le soulignez, elle peut certainement être améliorée.

0 votes

Au lieu d'utiliser un div supplémentaire, vous pouvez aussi créer une classe pour l'un des éléments proches de l'endroit où vous souhaitez afficher l'image et utiliser la même technique, sans div supplémentaire.

220voto

Paolo Bergantino Points 199336

En ce qui concerne l'image de chargement, consultez ce site pour un tas d'options.

En ce qui concerne l'affichage d'un DIV avec cette image au début d'une requête, vous avez plusieurs choix :

A) Afficher et masquer manuellement l'image :

$('#form').submit(function() {
    $('#wait').show();
    $.post('/whatever.php', function() {
        $('#wait').hide();
    });
    return false;
});

B) Utiliser ajaxStart et ajaxComplete :

$('#wait').ajaxStart(function() {
    $(this).show();
}).ajaxComplete(function() {
    $(this).hide();
});

En utilisant ceci, l'élément s'affichera/se cachera pour tout demande. Elle peut être bonne ou mauvaise, selon le besoin.

C) Utiliser des callbacks individuels pour une requête particulière :

$('#form').submit(function() {
    $.ajax({
        url: '/whatever.php',
        beforeSend: function() { $('#wait').show(); },
        complete: function() { $('#wait').hide(); }
    });
    return false;
});

4 votes

Remarque : si vous ne pouvez pas modifier le HTML pour ajouter l'élément img de chargement, vous pouvez le faire en tant qu'image d'arrière-plan sur le bouton en utilisant CSS, par exemple input.loading-gif{background:url('images/loading.gif');}, puis appliquer la classe avec jQuery, par exemple $('#mybutton'). addClass('loading-gif') ; Le seul problème est que le fichier gif ne sera demandé que lorsque le bouton d'envoi sera cliqué, ce qui est normalement trop tard. Vous devez donc le mettre en cache, ce qui est facile avec jQuery, par exemple (new Image()).src = "images/loading.gif" ;

4 votes

Ce site propose une plus grande et, à mon avis, une plus belle sélection de chargeurs avec plus d'options de personnalisation. préchargeurs.net

0 votes

FYI : fusionné à partir de stackoverflow.com/questions/750358/

120voto

Dan F Points 7777

En plus de ce que Jonathan et Samir ont suggéré (deux excellentes réponses d'ailleurs !), jQuery a quelques événements intégrés qu'il déclenchera pour vous lors d'une requête ajax.

Il y a le ajaxStart événement

Afficher un message de chargement lorsqu'une demande AJAX est lancée (et qu'aucune n'est déjà active).

...et son frère, le ajaxStop événement

Attachez une fonction qui sera exécutée lorsque toutes les demandes AJAX seront terminées. Il s'agit d'un événement Ajax.

Ensemble, ils constituent un excellent moyen d'afficher un message de progression lorsqu'une activité ajax se produit n'importe où sur la page.

HTML :

<div id="loading">
  <p><img src="loading.gif" /> Please Wait</p>
</div>

script :

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

0 votes

C'est périmé, depuis la version 1.8.0, .ajaxStart ne peuvent être attachés qu'à un document, par exemple. $(document).ajaxStart(function(){}).

2 votes

@Jonno_FTW fixe. Ta. Vieille question et réponse qui a été remplacée par les modifications apportées par Jonathan Sampson à sa question, mais il est bon de la maintenir à jour de toute façon.

3 votes

La réponse de Jonathan était très pointue, mais celle-ci était pour moi la meilleure pour sa simplicité.

20voto

Samir Talwar Points 9307

Vous pouvez récupérer un GIF animé d'un cercle tournant à partir de Ajaxload - Collez ça quelque part dans la hiérarchie des fichiers de votre site web. Il vous suffit ensuite d'ajouter un élément HTML avec le bon code, et de le supprimer lorsque vous avez terminé. C'est assez simple :

function showLoadingImage() {
    $('#yourParentElement').append('<div id="loading-image"><img src="path/to/loading.gif" alt="Loading..." /></div>');
}

function hideLoadingImage() {
    $('#loading-image').remove();
}

Il vous suffit ensuite d'utiliser ces méthodes dans votre appel AJAX :

$.load(
     'http://example.com/myurl',
     { 'random': 'data': 1: 2, 'dwarfs': 7},
     function (responseText, textStatus, XMLHttpRequest) {
         hideLoadingImage();
     }
);

// this will be run immediately after the AJAX call has been made,
// not when it completes.
showLoadingImage();

Cette méthode présente quelques inconvénients : tout d'abord, si l'image de chargement peut être affichée à deux endroits ou plus, vous devrez garder la trace du nombre d'appels en cours d'exécution et ne la masquer que lorsqu'ils sont tous terminés. Cela peut être fait en utilisant un simple compteur, qui devrait fonctionner dans presque tous les cas.

Deuxièmement, cela ne masquera l'image de chargement que si l'appel AJAX est réussi. Pour gérer les états d'erreur, vous devrez vous pencher sur les éléments suivants $.ajax qui est plus complexe que $.load , $.get et autres, mais aussi beaucoup plus flexible.

2 votes

Merci pour la réponse. Mais dites-moi, pourquoi ai-je besoin d'utiliser AJAX ? Ne puis-je pas simplement suivre tout cela dans la page elle-même ?

0 votes

Que voulez-vous suivre exactement ? À moins que vous ne demandiez des informations après le chargement de la page (et AJAX est à peu près le seul moyen de le faire sans utiliser un plugin), pourquoi auriez-vous besoin d'une image de "chargement" ?

0 votes

Samir Talwar : Une application JavaScript lourde en fait. Merci, je comprends l'idée.

17voto

Daniel Lew Points 39063

Vous devriez peut-être vous pencher sur le Plugin Throbber pour jQuery .

(Pour l'anecdote, je n'arrive toujours pas à croire que les animations de chargement sont appelées "palpitantes").

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