Me gustaría colocar una animación de círculo giratorio "espere, cargando" en mi sitio. ¿Cómo debo lograr esto usando jQuery?
Podrías hacer esto de diferentes maneras. Podría ser un estado sutil como pequeño en la página que dice "Cargando ...", o tan alto como un elemento completo que atenúa la página mientras se cargan los nuevos datos. El enfoque que estoy tomando a continuación le mostrará cómo lograr ambos métodos.
Comencemos por obtener una buena animación de "carga" de http://ajaxload.info que usaré
Creemos un elemento que podamos mostrar / ocultar cada vez que hagamos una solicitud ajax:
<div class="modal"><!-- Place at bottom of page --></div>
A continuación, demos un poco de estilo:
/* 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;
}
Muy bien, a la jQuery. La siguiente parte es realmente muy simple:
$body = $("body");
$(document).on({
ajaxStart: function() { $body.addClass("loading"); },
ajaxStop: function() { $body.removeClass("loading"); }
});
¡Eso es! Adjuntamos algunos eventos al elemento del cuerpo cada vez que se disparan los eventos ajaxStart
o ajaxStop
. Cuando comienza un evento ajax, agregamos la clase "cargando" al cuerpo. y cuando se realizan los eventos, eliminamos la clase "cargando" del cuerpo.
Véalo en acción: http://jsfiddle.net/VpDUG/4952/
.ajaxStop()
y.ajaxStart()
solo debe adjuntarse al documento. docsEn cuanto a la imagen de carga real, consulte este sitio para ver un montón de opciones.
En cuanto a mostrar un DIV con esta imagen cuando comienza una solicitud, tiene algunas opciones:
A) Mostrar y ocultar manualmente la imagen:
B) Use ajaxStart y ajaxComplete :
Con esto, el elemento mostrará / ocultará cualquier solicitud. Puede ser bueno o malo, según la necesidad.
C) Utilice devoluciones de llamada individuales para una solicitud particular:
fuente
Junto con lo que Jonathan y Samir sugirieron (¡ambas respuestas excelentes por cierto!), JQuery tiene algunos eventos incorporados que se dispararán para ti cuando realices una solicitud de ajax.
Ahí está el
ajaxStart
evento... y es hermano, el
ajaxStop
eventoJuntos, hacen una excelente manera de mostrar un mensaje de progreso cuando ocurre cualquier actividad de ajax en cualquier lugar de la página.
HTML:
Guión:
fuente
.ajaxStart
solo se puede adjuntar al documento, es decir.$(document).ajaxStart(function(){}).
Puede tomar un GIF animado de un círculo giratorio de Ajaxload ; pegarlo en algún lugar de la jerarquía de archivos de su sitio web. Luego solo necesita agregar un elemento HTML con el código correcto y eliminarlo cuando haya terminado. Esto es bastante simple:
Entonces solo necesita usar estos métodos en su llamada AJAX:
Esto tiene algunas advertencias: en primer lugar, si tiene dos o más lugares donde se puede mostrar la imagen de carga, tendrá que mantener un registro de cuántas llamadas se están ejecutando a la vez de alguna manera, y solo se ocultará cuando estén todo listo. Esto se puede hacer usando un contador simple, que debería funcionar para casi todos los casos.
En segundo lugar, esto solo ocultará la imagen de carga en una llamada AJAX exitosa. Para manejar los estados de error, tendrá que investigar
$.ajax
, que es más complejo que$.load
,$.get
y similares, pero también mucho más flexible.fuente
showLoadingImage
antes de comenzar yhideLoadingImage
después de terminar. Debería ser bastante simple. Sin embargo, es posible que deba pegar algún tipo desetTimeout
llamada para asegurarse de que el navegador realmente muestre la nueva<img>
etiqueta. He visto un par de casos en los que no molesta hasta que JavaScript ha terminado de ejecutarse.La excelente solución de Jonathon se rompe en IE8 (la animación no se muestra en absoluto). Para solucionar esto, cambie el CSS a:
fuente
jQuery proporciona enlaces de eventos para cuando las solicitudes AJAX comienzan y finalizan. Puede conectarlos para mostrar su cargador.
Por ejemplo, cree el siguiente div:
Configúrelo
display: none
en sus hojas de estilo. Puedes peinarlo como quieras. Puede generar una buena imagen de carga en Ajaxload.info , si lo desea.Luego, puede usar algo como lo siguiente para que se muestre automáticamente al enviar solicitudes de Ajax:
Simplemente agregue este bloque de Javascript al final de su página antes de cerrar su etiqueta de cuerpo o donde mejor le parezca.
Ahora, cada vez que envíe solicitudes Ajax,
#spinner
se mostrará el div. Cuando se complete la solicitud, se ocultará nuevamente.fuente
Si está utilizando Turbolinks With Rails, esta es mi solución:
Este es el CoffeeScript
Este es el CSS de SASS basado en la primera respuesta excelente de Jonathan Sampson
fuente
Como Mark H dijo que el blockUI es el camino.
Ex.:
Obs .: Obtuve el ajax-loader.gif en http://www.ajaxload.info/
fuente
Con el debido respeto a otras publicaciones, tiene aquí una solución muy simple, usando CSS3 y jQuery, sin usar más recursos externos ni archivos.
fuente
Esto haría que los botones desaparecieran, luego una animación de "carga" aparecería en su lugar y finalmente solo mostraría un mensaje de éxito.
fuente
La mayoría de las soluciones que he visto esperan que diseñemos una superposición de carga, la mantengamos oculta y luego la ocultemos cuando sea necesario, o que muestremos un gif o una imagen, etc.
Quería desarrollar un complemento robusto, donde con una simple llamada jQuery puedo mostrar la pantalla de carga y derribarla cuando se complete la tarea.
Debajo está el código. Depende de Font awesome y jQuery:
Simplemente coloque lo anterior en un archivo js e inclúyalo durante todo el proyecto.
Además de CSS:
Invocación:
fuente
Tenga en cuenta que cuando use ASP.Net MVC, con
using (Ajax.BeginForm(...
, la configuración deajaxStart
no funcionará.Use
AjaxOptions
para superar este problema:fuente
Según https://www.w3schools.com/howto/howto_css_loader.asp , este es un proceso de 2 pasos sin JS:
1.Agregue este HTML donde desee el spinner:
<div class="loader"></div>
2. Agregue este CSS para hacer el spinner real:
fuente
$("#loader").toggle();
antes de realizar la solicitud de ejecución prolongada para iniciar la animación y realizar otra llamada en la función de devolución de llamada de la solicitud para ocultarla.Yo uso CSS3 para animación
fuente