Je voudrais placer une animation de cercle de rotation "veuillez patienter, chargement" sur mon site. Comment dois-je accomplir cela en utilisant jQuery?
Vous pouvez le faire de différentes manières. Cela peut être subtil comme un petit statut sur la page disant "Chargement ...", ou aussi fort qu'un élément entier grisant la page pendant le chargement des nouvelles données. L'approche que je prends ci-dessous vous montrera comment accomplir les deux méthodes.
Commençons par nous faire une belle animation de "chargement" de http://ajaxload.info que j'utiliserai
Créons un élément que nous pouvons afficher / masquer chaque fois que nous faisons une demande ajax:
<div class="modal"><!-- Place at bottom of page --></div>
Donnons-lui ensuite un peu de flair:
/* 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
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 .modal {
overflow: hidden;
}
/* Anytime the body has the loading class, our
modal element will be visible */
body.loading .modal {
display: block;
}
D'accord, sur la jQuery. Cette partie suivante est en fait très simple:
$body = $("body");
$(document).on({
ajaxStart: function() { $body.addClass("loading"); },
ajaxStop: function() { $body.removeClass("loading"); }
});
C'est ça! Nous attachons certains événements à l'élément body chaque fois que les événements ajaxStart
or ajaxStop
sont déclenchés. Lorsqu'un événement ajax démarre, nous ajoutons la classe "loading" au corps. et lorsque les événements sont terminés, nous supprimons la classe "loading" du corps.
Voyez-le en action: http://jsfiddle.net/VpDUG/4952/
.ajaxStop()
et.ajaxStart()
ne doit être attachée qu'au document. docsEn ce qui concerne l'image de chargement réelle, consultez ce site pour un tas d'options.
En ce qui concerne l'affichage d'un DIV avec cette image lorsqu'une demande commence, vous avez plusieurs choix:
A) Affichez et masquez manuellement l'image:
B) Utilisez ajaxStart et ajaxComplete :
En utilisant cela, l'élément sera affiché / masqué pour toute demande. Peut être bon ou mauvais, selon le besoin.
C) Utilisez des rappels individuels pour une demande particulière:
la source
Parallèlement à ce que Jonathan et Samir ont suggéré (les deux excellentes réponses btw!), JQuery a des événements intégrés qu'il déclenchera pour vous lors d'une demande ajax.
Il y a l'
ajaxStart
événement... et c'est frère, l'
ajaxStop
événementEnsemble, ils constituent un excellent moyen d'afficher un message de progression lorsqu'une activité ajax se produit n'importe où sur la page.
HTML:
Scénario:
la source
.ajaxStart
ne peut être attaché qu'au document, c'est-à-dire.$(document).ajaxStart(function(){}).
Vous pouvez saisir un GIF animé d'un cercle tournant à partir d' Ajaxload - collez-le quelque part dans la hiérarchie des fichiers de votre site Web. Il vous suffit ensuite d'ajouter un élément HTML avec le code correct et de le supprimer lorsque vous avez terminé. C'est assez simple:
Il vous suffit alors d'utiliser ces méthodes dans votre appel AJAX:
Cela a quelques mises en garde: tout d'abord, si vous avez deux ou plusieurs endroits où l'image de chargement peut être affichée, vous devrez garder une trace du nombre d'appels en cours à la fois d'une manière ou d'une autre, et ne masquer que lorsqu'ils sont terminé. Cela peut être fait à l'aide d'un simple compteur, qui devrait fonctionner dans presque tous les cas.
Deuxièmement, cela ne masquera l'image de chargement que lors d'un appel AJAX réussi. Pour gérer les états d'erreur, vous devrez examiner
$.ajax
ce qui est plus complexe que$.load
,$.get
etc., mais beaucoup plus flexible également.la source
showLoadingImage
avant de commencer ethideLoadingImage
après avoir terminé. Devrait être assez simple. Vous devrez peut-être coller une sorte d'setTimeout
appel pour vous assurer que le navigateur restitue bien la nouvelle<img>
balise - j'ai vu quelques cas où cela ne dérange pas jusqu'à ce que JavaScript soit terminé.L'excellente solution de Jonathon se casse dans IE8 (l'animation ne s'affiche pas du tout). Pour résoudre ce problème, changez le CSS en:
la source
jQuery fournit des hooks d'événements pour le début et la fin des requêtes AJAX. Vous pouvez vous y connecter pour montrer votre chargeur.
Par exemple, créez le div suivant:
Réglez-le
display: none
dans vos feuilles de style. Vous pouvez le coiffer comme vous le souhaitez. Vous pouvez générer une belle image de chargement sur Ajaxload.info , si vous le souhaitez.Ensuite, vous pouvez utiliser quelque chose comme le suivant pour le faire s'afficher automatiquement lors de l'envoi de demandes Ajax:
Ajoutez simplement ce bloc Javascript à la fin de votre page avant de fermer votre balise body ou où bon vous semble.
Maintenant, chaque fois que vous envoyez des demandes Ajax, le
#spinner
div sera affiché. Une fois la demande terminée, elle sera à nouveau masquée.la source
Si vous utilisez Turbolinks With Rails, voici ma solution:
C'est le CoffeeScript
Ceci est le CSS SASS basé sur la première excellente réponse de Jonathan Sampson
la source
Comme l'a dit Mark H, le blockUI est le chemin.
Ex.:
Obs .: J'ai reçu le ajax-loader.gif sur http://www.ajaxload.info/
la source
Avec tout le respect que je dois aux autres articles, vous avez ici une solution très simple, utilisant CSS3 et jQuery, sans utiliser d'autres ressources ni fichiers externes.
la source
Cela ferait disparaître les boutons, puis une animation de "chargement" apparaîtrait à leur place et afficherait finalement juste un message de réussite.
la source
La plupart des solutions que j'ai vues attendent de nous que nous concevions une superposition de chargement, la gardions cachée et ensuite la révélions si nécessaire, ou, montrons un gif ou une image etc.
Je voulais développer un plugin robuste, où avec un simple appel jQuery, je peux afficher l'écran de chargement et le démonter lorsque la tâche est terminée.
Voici le code. Cela dépend de Font awesome et jQuery:
Il suffit de mettre ce qui précède dans un fichier js et de l'inclure tout au long du projet.
Ajout CSS:
Invocation:
la source
Notez que lorsque vous utilisez ASP.Net MVC, avec
using (Ajax.BeginForm(...
, la définition deajaxStart
ne fonctionnera pas.Utilisez le
AjaxOptions
pour surmonter ce problème:la source
Par https://www.w3schools.com/howto/howto_css_loader.asp , il s'agit d'un processus en 2 étapes sans JS:
1.Ajoutez ce HTML où vous voulez que le spinner:
<div class="loader"></div>
2.Ajoutez ce CSS pour créer le véritable spinner:
la source
$("#loader").toggle();
avant d'effectuer la demande de longue durée pour démarrer l'animation et effectuer un autre appel dans la fonction de rappel de la demande pour la masquer.J'utilise CSS3 pour l'animation
la source