¿Cómo muestro un indicador de "ocupado" giratorio en un punto específico de una página web?
Quiero iniciar / detener el indicador cuando comienza / completa una solicitud Ajax.
¿Es realmente solo una cuestión de mostrar / ocultar un gif animado, o hay una solución más elegante?
javascript
jquery
Tony el pony
fuente
fuente
ajaxSetup()
. Preferiría queglobal
se dieran más explicaciones sobre la propiedad.La documentación de jQuery recomienda hacer algo como lo siguiente:
$( document ).ajaxStart(function() { $( "#loading" ).show(); }).ajaxStop(function() { $( "#loading" ).hide(); });
¿Dónde
#loading
está el elemento con su indicador de ocupado?Referencias:
http://api.jquery.com/ajaxStop/
Además,
jQuery.ajaxSetup
API recomienda explícitamente evitarjQuery.ajaxSetup
para estos:fuente
Tiendo a mostrar / ocultar una IMG como han dicho otros. Encontré un buen sitio web que genera "cargando gifs"
Enlace Lo acabo de poner dentro de ay lo oculto
div
por defectodisplay: none;
(css) luego, cuando llamas a la función, mostrar la imagen, una vez que esté completa, la oculto nuevamente.fuente
sí, en realidad es solo una cuestión de mostrar / ocultar un gif animado.
fuente
Lo hice en mi proyecto,
hacer un div con URL de fondo como gif, que no es más que gif de animación
<div class="busyindicatorClass"> </div> .busyindicatorClass { background-url///give animation here }
en su llamada ajax, agregue esta clase al div y en ajax exitosamente elimine la clase.
hará el truco que se sienta.
avíseme si necesita algo más, puedo darle más detalles
en el éxito de ajax eliminar la clase
success: function(data) { remove class using jquery }
fuente
Para extender un poco la solución de Rodrigo, para las solicitudes que se ejecutan con frecuencia, es posible que solo desee mostrar la imagen de carga si la solicitud toma más de un intervalo de tiempo mínimo; de lo contrario, la imagen aparecerá continuamente y desaparecerá rápidamente.
var loading = false; $.ajaxSetup({ beforeSend: function () { // Display loading icon if AJAX call takes >1 second loading = true; setTimeout(function () { if (loading) { // show loading image } }, 1000); }, complete: function () { loading = false; // hide loading image } });
fuente
Lo hice en mi proyecto:
Eventos globales en application.js:
$(document).bind("ajaxSend", function(){ $("#loading").show(); }).bind("ajaxComplete", function(){ $("#loading").hide(); });
"loading" es el elemento a mostrar y ocultar!
Referencias: http://api.jquery.com/Ajax_Events/
fuente
Tuve que usar
HTML: <img id="loading" src="~/Images/spinner.gif" alt="Updating ..." style="display: none;" /> In script file: // invoked when sending ajax request $(document).ajaxSend(function () { $("#loading").show(); }); // invoked when sending ajax completed $(document).ajaxComplete(function () { $("#loading").hide(); });
fuente
Hilo antiguo, pero quería actualizar ya que trabajé en este problema hoy, no tenía jquery en mi proyecto, así que lo hice a la manera simple de JavaScript, también necesitaba bloquear el contenido en la pantalla, así que en mi xhtml
<img id="loading" src="#{request.contextPath}/images/spinner.gif" style="display: none;"/>
en mi javascript
document.getElementsByClassName('myclass').style.opacity = '0.7' document.getElementById('loading').style.display = "block";
fuente
XMLHttpRequest
?