2012-01-31 10 views
22

"Loading .." animasyonu sadece ajax çağrısının bir saniyeden fazla sürmesi durumunda gösterilebilir mi? Ajax çağrılarımın bazıları oldukça hızlıdır, ancak yükleme simgesinin kaybolmadan önce bir saniyeliğine kesildiğini görüyorum. Sadece ben olabilirim ama dikkatimi dağıtır. Tamamen kaldırmak istemiyorum. Baska öneri?jQuery - yalnızca ajax araması bir saniyeden daha uzun sürüyorsa yükleme görüntüsünü gösterilsin mi?

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

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

cevap

32

- İşte benim kod.

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

Çok teşekkür ederim! Bir çekicilik gibi çalıştı. – tempid

+0

@Joseph Aynı çözümü bu çözümü gönderdiğiniz için teşekkürler. Sözdizimini açıklığa kavuşturabilir miyim - var $ loader = $ ("# loading"), timer; zamanlayıcı ve seçici id = jquery içeren jquery nesnesi oluşturuyor. zamanlayıcı && clearTimeout (zamanlayıcı); Bu neden böyle yazılır ve sadece clearTimeout (zamanlayıcı) değil? Benzer çalışmayı denedim, ancak gösteriyi sadece x millisec'ten sonra göstermenin tersine ertelemeyi başardı. Yine de, küresel olayları kapsülleyen şeyin neyi başardığına nasıl ulaştığı oldukça net değil. Genişleyebilir misin? – codepuppy

+2

@ codepuppy - 'clearTimeout' parametresi olarak bir zamanlayıcı kimliği bekler. 'AjaxStart' ilk kez çalıştırıldığında, 'timer' tanımsız olacaktır. Undefined 'clearTimeout''a geçilirken herhangi bir hata ortaya çıkmıyor gibi görünmekteyim, yeterince test etmedim, bu yüzden' timer 'aslında bir kimlik varsa ilk önce kontrol etmeyi tercih ettim. Nore ki zamanlayıcı && clearTimeout (zamanlayıcı); 'eşdeğer ise (zamanlayıcı) {clearTimeout (zamanlayıcı); } '. –

9

Bir setTimeout() kullanabilirsiniz: Bir zamanlayıcı kodunuzu koymalıyız

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

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

Bu da çalıştı. Teşekkürler bayım. – tempid

+0

1) 'Elementi bir argüman olarak ele geçirmelisiniz. 2) undefined olduğu için 'eleman'ı geçme - 'bu' geç. 3) bu, bu modada argümanları geçmenize izin vermediğinden IE'de çalışmaz. –

+0

@JosephSilber Kötü bir gün geçiriyorum kodları düzelteceğim. – alex

İlgili konular