Hiển thị hình ảnh tải trong khi $ .ajax được thực hiện


116

Tôi chỉ đang tự hỏi làm thế nào để hiển thị một hình ảnh cho biết rằng yêu cầu không đồng bộ đang chạy. Tôi sử dụng mã sau để thực hiện yêu cầu không đồng bộ:

$.ajax({
  url: uri,
  cache: false,
  success: function(html){
    $('.info').append(html);
  }
});

Có ý kiến ​​gì không?

Câu trả lời:


254

Tất nhiên, bạn có thể hiển thị nó trước khi đưa ra yêu cầu và ẩn nó sau khi hoàn thành:

$('#loading-image').show();
$.ajax({
      url: uri,
      cache: false,
      success: function(html){
        $('.info').append(html);
      },
      complete: function(){
        $('#loading-image').hide();
      }
    });

Tôi thường thích giải pháp chung hơn là liên kết nó với các sự kiện ajaxStart và ajaxStop toàn cục, theo cách đó nó hiển thị cho tất cả các sự kiện ajax:

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

30
Bắt đầu jQuery 1.9, các sự kiện AJAX chỉ nên được đính kèm document. Xem stackoverflow.com/questions/2275342/…
Simone

62

Sử dụng các hàm beforeSend và hoàn thành của đối tượng ajax. Tốt hơn là hiển thị gif từ bên trong beforeSend để tất cả các hành vi được gói gọn trong một đối tượng duy nhất. Hãy cẩn thận về việc ẩn gif bằng cách sử dụng hàm thành công. Nếu yêu cầu không thành công, bạn có thể vẫn muốn ẩn gif. Để làm điều này, hãy sử dụng chức năng Hoàn thành. Nó sẽ trông như thế này:

$.ajax({
    url: uri,
    cache: false,
    beforeSend: function(){
        $('#image').show();
    },
    complete: function(){
        $('#image').hide();
    },
    success: function(html){
       $('.info').append(html);
    }
});

Cảm ơn bạn vì đoạn mã đơn giản. Tiết kiệm thời gian @jEremyB
Anahit DEV

Đây là giải pháp hữu ích và phổ biến sau đó được chấp thuận. Cảm ơn bạn.
Eryk Wróbel

20

Mã HTML :

<div class="ajax-loader">
  <img src="{{ url('guest/images/ajax-loader.gif') }}" class="img-responsive" />
</div>

Mã CSS:

.ajax-loader {
  visibility: hidden;
  background-color: rgba(255,255,255,0.7);
  position: absolute;
  z-index: +100 !important;
  width: 100%;
  height:100%;
}

.ajax-loader img {
  position: relative;
  top:50%;
  left:50%;
}

Mã JQUERY:

$.ajax({
  type:'POST',
  beforeSend: function(){
    $('.ajax-loader').css("visibility", "visible");
  },
  url:'/quantityPlus',
  data: {
   'productId':p1,
   'quantity':p2,
   'productPrice':p3},
   success:function(data){
     $('#'+p1+'value').text(data.newProductQuantity);
     $('#'+p1+'amount').text("₹ "+data.productAmount);
     $('#totalUnits').text(data.newNoOfUnits);
     $('#totalAmount').text("₹ "+data.newTotalAmount);
  },
  complete: function(){
    $('.ajax-loader').css("visibility", "hidden");
  }
});

}

8

"Hình ảnh" mà mọi người thường hiển thị trong khi gọi ajax là ảnh gif động. Vì không có cách nào để xác định phần trăm hoàn thành của yêu cầu ajax, các gif hoạt hình được sử dụng là các trình quay không xác định. Đây chỉ là một hình ảnh lặp đi lặp lại như một quả bóng tròn với nhiều kích cỡ khác nhau. Một trang web tốt để tạo spinner không xác định tùy chỉnh của riêng bạn là http://ajaxload.info/


5

Tôi nghĩ điều này có thể tốt hơn nếu bạn có hàng tấn cuộc gọi $ .ajax

$(document).ajaxSend(function(){
    $(AnyElementYouWantToShowOnAjaxSend).fadeIn(250);
});
$(document).ajaxComplete(function(){
    $(AnyElementYouWantToShowOnAjaxSend).fadeOut(250);
});

GHI CHÚ:

Nếu bạn sử dụng CSS. Phần tử bạn muốn hiển thị trong khi ajax đang tìm nạp dữ liệu từ mã back-end của bạn phải như thế này.

AnyElementYouWantToShowOnAjaxSend {
    position: fixed;
    top: 0;
    left: 0;
    height: 100vh; /* to make it responsive */
    width: 100vw; /* to make it responsive */
    overflow: hidden; /*to remove scrollbars */
    z-index: 99999; /*to make it appear on topmost part of the page */
    display: none; /*to make it visible only on fadeIn() function */
}

1
đây phải là câu trả lời được chấp nhận vì nó là chung chung!
Rotimi

3

Tôi luôn thích BlockUIplugin: http://jquery.malsup.com/block/

Nó cho phép bạn chặn các phần tử nhất định của một trang hoặc toàn bộ trang trong khi yêu cầu ajax đang chạy.


1

Trước cuộc gọi của bạn, hãy chèn hình ảnh đang tải vào một div / span ở đâu đó và sau đó trên hàm thành công, hãy xóa hình ảnh đó. Ngoài ra, bạn có thể thiết lập một lớp css như tải có thể trông như thế này

.loading
{
    width: 16px;
    height: 16px;
    background:transparent url('loading.gif') no-repeat 0 0;
    font-size: 0px;
    display: inline-block;
}

Và sau đó gán lớp này cho một span / div và xóa nó trong hàm thành công


0

một cái gì đó như thế này:

$('#image').show();
$.ajax({
    url: uri,
    cache: false,
    success: function(html){
       $('.info').append(html);
       $('#image').hide();
    }
});

0

Bạn có thể thêm sự kiện bắt đầu và hoàn thành ajax, điều này hoạt động khi bạn nhấp vào sự kiện nút

 $(document).bind("ajaxSend", function () {
            $(":button").html('<i class="fa fa-spinner fa-spin"></i> Loading');
            $(":button").attr('disabled', 'disabled');
        }).bind("ajaxComplete", function () {
            $(":button").html('<i class="fa fa-check"></i> Show');
            $(":button").removeAttr('disabled', 'disabled');
        });

0
  1. Tạo một phần tử tải ví dụ một phần tử có id = example_load.
  2. Ẩn nó theo mặc định bằng cách thêm style = "display: none;".
  3. Bây giờ hãy hiển thị nó bằng cách sử dụng hàm phần tử hiển thị jquery ngay trên ajax của bạn.

    $('#example_load').show(); $.ajax({ type: "POST", data: {}, url: '/url', success: function(){ // Now hide the load element $('#example_load').hide(); } });


-1

**strong text**Set the Time out to the ajax calls
function testing(){
    
    $("#load").css("display", "block");
    setTimeout(function(){
    $.ajax({
             type: "GET",

          
             url:testing.com,
            
             async: false,
             
             success : function(response){
           
             alert("connection established");

              
            },
            complete: function(){
            alert("sended");
            $("#load").css("display", "none");
         
           },
            error: function(jqXHR, exception) {
                       alert("Write error Message Here");
                  },


       });
     },5000);


  }
  .loader {
    border: 16px solid #f3f3f3;
    border-radius: 50%;
    border-top: 16px solid #3498db;
    width: 120px;
    height: 120px;
    -webkit-animation: spin 2s linear infinite; /* Safari */
    animation: spin 2s linear infinite;
  }
  
  /* Safari */
  @-webkit-keyframes spin {
    0% { -webkit-transform: rotate(0deg); }
    100% { -webkit-transform: rotate(360deg); }
  }
  
  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
<div id="load" style="display: none" class="loader"></div>
<input type="button"  onclick="testing()"  value="SUBMIT" >

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.