2009-12-05 11 views
10

¿Cuál es la mejor manera de retrasar la presentación de un gif ajax-loader? Cuando hago clic en un botón, el gif del cargador muestra y oculta, incluso si el tiempo empleado es de algunos cientos de milisegundos, esto le da al navegador una especie de parpadeo. Lo que quiero es decir solo mostrar el gif si se necesitan más de 1000 milisegundos para completar la solicitud de Ajax.demora la muestra de un archivo ajax que carga gif usando jQuery

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#loader').hide(); 
     $('#btnGetPeople').click(function() { 
      $('#loader').show(); 
      $.getJSON("/User/GetName/10", 
       null, 
       function(data) { showPerson(data); }); 
     }); 
    }); 

    function showPerson(data) { 
     alert(data); 
     $('#loader').hide(); 
    } 
</script> 

Mi div cargador contiene ....

<div id="loader"><img alt="" src="/content/ajax-loader.gif" /></div> 

¿Cuál es la mejor técnica para lograr esto?

Respuesta

22

Como se puede ver he añadido un tiempo de espera que retrasen muestra de 300 ms. Si ajax es más rápido, el tiempo de espera se cancela antes de que realmente se muestre el cargador.

<script type="text/javascript"> 
    var showLoader; 
    $(document).ready(function() { 
     $('#loader').hide(); 
     $('#btnGetPeople').click(function() { 
      // only show loader if ajax request lasts longer then 300 ms 
      showLoader = setTimeout("$('#loader').show()", 300); 
      $.getJSON("/User/GetName/10", 
       null, 
       function(data) { showPerson(data); }); 
     }); 
    }); 

    function showPerson(data) { 
     clearTimeout(showLoader); 
     alert(data); 
     $('#loader').hide(); 
    } 
</script> 
+0

Spot On, muchas gracias .... – Rippo

+0

LOL ... eso es lo que recibo por ser poco convencional. Buena respuesta @jitter –

+0

@jitter, jQuery es genial! – Rippo

5

Aquí hay una manera divertida de hacerlo. Reemplazar $loader.show() con esto:

$("#loader").data('timeout', window.setTimeout(function(){ $("#loader").show()}, 1000)); 

Y su comando ocultar con esto:

window.clearTimeout($("#loader").hide().data('timeout')); 
+0

@dcneiner, rápido q - ¿qué es 'timeout'? – Rippo

+0

Solo un atributo 'datos' personalizado para mantener el' int' devuelto por 'setTimeout' asociado a nuestro objeto DOM. Es esto o declarar otra variable como @jitter. Solo quería mostrar una forma contenida de hacerlo con jQuery. –

+0

@RageZ 'clearTimeout' solo funciona cuando pasa el mismo' entero 'que se devolvió de la función 'setTimeout'. Como estoy almacenando el 'entero 'en un atributo' datos' personalizado, funcionaría bien. –

0

Pensé en compartir algo que hice para esto. Tenía una situación en la que necesitaba hacer más que solo mostrar u ocultar el elemento. Así que utilicé el enlace para crear eventos personalizados para el cargador:

$("#loader").bind("delayshow", function (event, timeout) { 
    var $self = $(this); 
    $self.data('timeout', setTimeout(function() { 
     // show the loader 
     $self.show(); 
     /* 
      implement additional code here as needed 
     */ 
    }, timeout)); 
}).bind("delayhide", function (event) { 
    // close and clear timeout 
    var $self = $(this); 
    clearTimeout($self.hide().data('timeout')); 
    /* 
     implement additional code here as needed 
    */ 
}); 

// show it with a 500 millisecond delay 
$("#loader").trigger('delayshow', 500); 

// hide it 
$("#loader").trigger('delayhide'); 
1

También podría hacerlo así.

var loadingTimer; 

$(document).ready(function() { 

    $("#loader").ajaxStart(function() { 
     loadingTimer = setTimeout(function() { 
      $("#loader").show(); 
     }, 200); 
    }); 

    $("#loader").ajaxStop(function() { 
     clearTimeout(loadingTimer); 
     $(this).hide(); 
    }); 

} 
Cuestiones relacionadas