Làm cách nào để hiển thị chỉ báo "bận" với jQuery?


81

Làm cách nào để hiển thị chỉ báo "bận" đang quay tại một điểm cụ thể trong trang web?

Tôi muốn bắt đầu / dừng chỉ báo khi yêu cầu Ajax bắt đầu / hoàn thành.

Nó thực sự chỉ là một vấn đề hiển thị / ẩn một gif động, hay có một giải pháp thanh lịch hơn?

Câu trả lời:


94

Bạn chỉ có thể hiển thị / ẩn ảnh gif, nhưng bạn cũng có thể nhúng ảnh đó vào ajaxSetup, vì vậy nó được gọi theo mọi yêu cầu ajax.

$.ajaxSetup({
    beforeSend:function(){
        // show gif here, eg:
        $("#loading").show();
    },
    complete:function(){
        // hide gif here, eg:
        $("#loading").hide();
    }
});

Một lưu ý là nếu bạn muốn thực hiện một yêu cầu ajax cụ thể mà không cần có con quay tải, bạn có thể thực hiện như sau:

$.ajax({
   global: false,
   // stuff
});

Bằng cách đó, $ .ajaxSetup trước đó mà chúng tôi đã làm sẽ không ảnh hưởng đến yêu cầu global: false.

Thông tin chi tiết có tại: http://api.jquery.com/jQuery.ajaxSetup


2
+1 cho ajaxSetup(). Sẽ thích hơn nếu giải thích thêm về globaltài sản được đưa ra.
RabidFire

@RabidFire, thực sự không cần toàn cầu ở đây, nó chỉ với $ .ajax
Rodrigo

@gov, việc định vị gif phụ thuộc vào bố cục, bạn chỉ có thể ẩn / hiện div ở nơi nó được đặt, thay vì sửa đổi dom.
Rodrigo

1
Điều này trông có vẻ hứa hẹn nhưng nó không hoạt động với tôi, cuối cùng đã thử một giải pháp khác có hiệu quả. stackoverflow.com/questions/7003707/…
Bob

Nếu bạn có 2 XHR và cái đầu tiên kết thúc ngay sau khi cái thứ hai bắt đầu, mã này sẽ ẩn chỉ báo tải mặc dù XHR thứ hai vẫn đang chạy.
Mark E. Haase

39

Tài liệu jQuery khuyên bạn nên làm điều gì đó như sau:

$( document ).ajaxStart(function() {
  $( "#loading" ).show();
}).ajaxStop(function() {
  $( "#loading" ).hide();
});

Trong trường hợp #loadinglà yếu tố với chỉ bận rộn của bạn trong đó.

Người giới thiệu:

  • http://api.jquery.com/ajaxStart/
  • http://api.jquery.com/ajaxStop/

  • Ngoài ra, jQuery.ajaxSetupAPI khuyến nghị rõ ràng nên tránh jQuery.ajaxSetupnhững điều sau:

    Lưu ý: Chức năng gọi lại toàn cầu nên được thiết lập với methods- Ajax xử lý sự kiện toàn cầu của mình .ajaxStart(), .ajaxStop(), .ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend()-rather hơn trong optionsđối tượng cho $.ajaxSetup().


1
Những điều này có vẻ hữu ích hơn so với beforeSend và complete, bởi vì ajaxStart sẽ "... Đăng ký một trình xử lý được gọi khi yêu cầu Ajax đầu tiên bắt đầu" và ajaxStop sẽ "... Đăng ký một trình xử lý được gọi khi tất cả các yêu cầu Ajax đã hoàn thành" - những thông báo này xử lý các thông báo không đồng bộ đồng thời và sẽ không ẩn chỉ báo "vui lòng đợi" sớm.
khoảng trống

10

Tôi có xu hướng chỉ hiển thị / ẩn một IMG như những người khác đã nêu. Tôi đã tìm thấy một trang web tốt tạo "tải gif"

Link Tôi chỉ đặt nó bên trong a divvà ẩn theo mặc định display: none;(css) sau đó khi bạn gọi hàm hiển thị hình ảnh, khi hoàn thành ẩn nó lại.


6

vâng, nó thực sự chỉ là vấn đề hiển thị / ẩn một gif động.


2
Đã đồng ý. Hiển thị / ẩn một hình ảnh dễ dàng và hiểu được trên tất cả các trình duyệt. Có một vài plugin xoay jquery cho hình ảnh nhưng chúng sẽ không hoạt động trong tất cả các trình duyệt.
Mike Blandford

@ Mike giải pháp của tôi là làm việc tốt cho dự án của tôi trong tất cả các trình duyệt, bạn có nghĩ đó là cách tiếp cận đẹp
kobe

4

Tôi đã làm điều đó trong dự án của mình,

tạo một div với url back ground dưới dạng gif, không có gì khác ngoài ảnh động gif

<div class="busyindicatorClass"> </div>

.busyindicatorClass
{
background-url///give animation here
}

trong lệnh gọi ajax của bạn, hãy thêm lớp này vào div và trong ajax thành công, hãy xóa lớp đó.

nó sẽ thực hiện thủ thuật đó.

cho tôi biết nếu bạn cần thứ gì khác, tôi có thể cung cấp cho bạn thêm chi tiết

trong ajax thành công loại bỏ lớp

success: function(data) {
    remove class using jquery
  }

4

Để mở rộng giải pháp của Rodrigo một chút - đối với các yêu cầu được thực hiện thường xuyên, bạn có thể chỉ muốn hiển thị hình ảnh đang tải nếu yêu cầu mất nhiều hơn một khoảng thời gian tối thiểu, nếu không hình ảnh sẽ liên tục xuất hiện và nhanh chóng biến mất

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
    }
});

3

Tôi đã làm điều đó trong dự án của mình:

Sự kiện toàn cầu trong application.js:

$(document).bind("ajaxSend", function(){
   $("#loading").show();
 }).bind("ajaxComplete", function(){
   $("#loading").hide();
 });

"loading" là phần tử để hiển thị và ẩn!

Tài liệu tham khảo: http://api.jquery.com/Ajax_Events/


3

Tôi đã phải sử dụng

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();
  });

2

Chủ đề cũ, nhưng tôi muốn cập nhật vì tôi đã giải quyết vấn đề này hôm nay, tôi không có jquery trong dự án của mình nên tôi đã làm theo cách javascript cũ đơn giản, tôi cũng cần chặn nội dung trên màn hình để trong xhtml của mình

    <img id="loading" src="#{request.contextPath}/images/spinner.gif" style="display: none;"/>

trong javascript của tôi

    document.getElementsByClassName('myclass').style.opacity = '0.7'
    document.getElementById('loading').style.display = "block";

Bạn hiểu "cách sử dụng javascript cũ" là gì? Bạn có thể giải thích thêm? Bạn có nghĩa là bạn đã sử dụng một XMLHttpRequest?
Brian Peterson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.