2012-01-31 26 views
22

Chỉ có thể hiển thị hoạt ảnh "Đang tải .." nếu cuộc gọi ajax mất nhiều hơn một giây? Một số cuộc gọi ajax của tôi khá nhanh nhưng tôi vẫn thấy biểu tượng tải trong một phần giây trước khi nó biến mất. Có thể chỉ là tôi, nhưng tôi thấy nó mất tập trung. Tôi không muốn loại bỏ nó hoàn toàn mặc dù. Bất kỳ đề xuất? Dưới đây là mã của tôi -jQuery - chỉ hiển thị hình ảnh tải nếu cuộc gọi ajax mất hơn một giây?

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

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

Trả lời

32

Bạn nên đặt mã của bạn trong một giờ:

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

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

Cảm ơn bạn rất nhiều! Nó làm việc như một say mê. – tempid

+0

@Joseph Tôi có cùng một câu hỏi cảm ơn vì đã đăng giải pháp này. Tôi có thể làm rõ cú pháp - var $ loader = $ ("# loading"), timer; đang tạo đối tượng jquery chứa timer và selector id = loading. timer && clearTimeout (timer); tại sao điều này được viết như thế này và không đơn giản là clearTimeout (timer)? Tôi đã thử tương tự nhưng chỉ thành công trong việc trì hoãn chương trình như trái ngược với chỉ hiển thị sau khi x millisecs. Vẫn không hoàn toàn rõ ràng cách đóng gói các sự kiện toàn cầu đạt được những gì nó đạt được. Bạn có thể mở rộng không? – codepuppy

+2

@codepuppy - 'clearTimeout' dự kiến ​​ID bộ định thời làm tham số của nó. Lần đầu tiên 'ajaxStart' chạy,' timer' sẽ không được xác định. Trong khi đi qua undefined để 'clearTimeout' dường như không được nâng cao bất kỳ lỗi nào, tôi đã không thử nghiệm nó đủ, vì vậy tôi quyết định thay vì kiểm tra đầu tiên nếu' timer' thực sự có một id. Nore rằng 'timer && clearTimeout (timer);' tương đương với 'if (timer) {clearTimeout (timer); } '. –

9

Bạn có thể sử dụng một setTimeout().

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

Điều này cũng hoạt động tốt. Cảm ơn ngài. – tempid

+0

1) Bạn phải chụp 'phần tử' làm đối số. 2) Không chuyển 'element' vì nó không được xác định - chuyển' this'. 3) điều này sẽ không hoạt động trong IE, vì nó không cho phép bạn vượt qua các đối số trong thời trang này. –

+0

@JosephSilber Tôi đang gặp khó khăn trong việc viết mã ngày ... sẽ sửa. – alex

Các vấn đề liên quan