2012-01-31 10 views
22

¿Es posible mostrar la animación "Cargando ..." solo si la llamada ajax requiere más de un segundo? Algunas de mis llamadas ajax son bastante rápidas, pero sigo viendo el icono de carga durante una fracción de segundo antes de que desaparezca. Tal vez sea solo yo, pero me parece una distracción. No obstante, no quiero eliminarlo del todo. ¿Alguna sugerencia? Aquí está mi código -jQuery: ¿muestra la imagen de carga solo si la llamada ajax tarda más de un segundo?

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

<div id="loading"> 
    <img alt="Loading, please wait.." src="/content/images/spinner.gif" /> 
</div> 

Respuesta

32

Usted debe poner su código en un contador:

var $loader = $('#loading'), timer; 

$loader.hide() 
    .ajaxStart(function() 
    { 
     timer && clearTimeout(timer); 
     timer = setTimeout(function() 
     { 
      $loader.show(); 
     }, 
     1000); 
    }) 
    .ajaxStop(function() 
    { 
     clearTimeout(timer); 
     $loader.hide(); 
    }); 
+0

¡Muchas gracias! Funcionó a las mil maravillas. – tempid

+0

@Joseph Tenía la misma pregunta gracias por publicar esta solución. ¿Puedo aclarar la sintaxis? Var $ loader = $ ("# loading"), timer; está creando el objeto jquery que contiene el temporizador y el selector id = cargando. temporizador && clearTimeout (temporizador); ¿Por qué se escribe así y no simplemente clearTimeout (temporizador)? Lo intenté de manera similar, pero solo logré retrasar el show en lugar de solo mostrarlo después de x milisegundos. Aún no está del todo claro cómo encapsular los eventos globales logra lo que logra. ¿Podrías expandirte? – codepuppy

+2

@codepuppy - 'clearTimeout' espera una ID de temporizador como su parámetro. La primera vez que 'ajaxStart' se ejecute,' timer' no estará definido. Aunque pasar indefinido a 'clearTimeout' no parece generar ningún error, no lo he probado lo suficiente, así que decidí verificar primero si' timer' en realidad tiene una identificación. No es que 'timer && clearTimeout (timer);' sea equivalente a 'if (timer) {clearTimeout (timer); } ' –

9

Se puede usar un setTimeout().

var loadingTimeout; 
$('#loading').hide() 
.ajaxStart(function() { 
    var element = $(this); 
    loadingTimeout = setTimeout(function() { 
     element.show(); 
    }, 1e3); 
}) 
.ajaxStop(function() { 
    clearTimeout(loadingTimeout); 
    $(this).hide(); 
}); 
+0

Esto funcionó también. Gracias Señor. – tempid

+0

1) Debe capturar 'element' como argumento. 2) No pase 'element' ya que no está definido - pase' this'. 3) esto no funcionará en IE, ya que no le permite pasar argumentos de esta manera. –

+0

@JosephSilber Estoy teniendo un mal día de codificación ... lo arreglaré. – alex

Cuestiones relacionadas