Как отобразить индикатор «занято» с помощью jQuery?

81

Как отобразить вращающийся индикатор «занято» в определенном месте веб-страницы?

Я хочу запустить / остановить индикатор при запуске / завершении запроса Ajax.

Это действительно просто вопрос отображения / скрытия анимированного gif или есть более элегантное решение?

Тони Пони
источник

Ответы:

94

Вы можете просто показать / скрыть гифку, но вы также можете встроить ее в ajaxSetup, чтобы она вызывалась при каждом запросе ajax.

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

Одно замечание: если вы хотите выполнить определенный запрос ajax без счетчика загрузки, вы можете сделать это следующим образом:

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

Таким образом, предыдущий $ .ajaxSetup не повлияет на запрос global: false.

Более подробная информация доступна по адресу: http://api.jquery.com/jQuery.ajaxSetup.

Родриго
источник
2
+1 за ajaxSetup(). Хотел бы, чтобы globalбыли даны дополнительные объяснения по поводу собственности.
RabidFire
@RabidFire, на самом деле global здесь не нужен, это только для $ .ajax
Родриго
@gov, расположение gif зависит от макета, вы можете просто скрыть / показать div, где он размещен, вместо изменения dom.
Родриго
1
Это выглядело многообещающим, но для меня это не сработало, в итоге я попробовал другое решение, которое сработало. stackoverflow.com/questions/7003707/…
Боб
Если у вас есть 2 XHR, и первый заканчивается сразу после запуска второго, этот код скрывает индикатор загрузки, даже если второй XHR все еще работает.
Марк Э. Хаасе
39

В документации jQuery рекомендуется сделать что-то вроде следующего:

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

Где #loadingнаходится элемент с вашим индикатором занятости?

Рекомендации:

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

  • Кроме того, jQuery.ajaxSetupAPI явно рекомендует избегать jQuery.ajaxSetup:

    Примечание: Глобальные функции обратного вызова должны быть установлены с их соответствующим глобальным Ajax обработчик событий methods- .ajaxStart(), .ajaxStop(), .ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend()-rather чем в optionsобъекте для $.ajaxSetup().

Шон В.
источник
1
Они кажутся более полезными, чем beforeSend и complete, потому что ajaxStart «... Зарегистрирует обработчик, который будет вызываться, когда начнется первый запрос Ajax», а ajaxStop будет «... Зарегистрирует обработчик, который будет вызываться, когда все запросы Ajax будут выполнены» - они обрабатывают одновременные асинхронные сообщения и не скрывают преждевременно индикатор «пожалуйста, подождите».
разрыв
10

Я обычно просто показываю / скрываю IMG, как заявляли другие. Я нашел хороший сайт, который генерирует "загрузочные гифки"

Ссылка Я просто помещаю его внутрь divи скрываю по умолчанию display: none;(css), затем, когда вы вызываете функцию, показываю изображение, как только оно полностью скрывает его снова.

Эллиотт
источник
6

да, это действительно просто вопрос показа / скрытия анимированного gif.

Чейз Флорелл
источник
2
Согласовано. Показать / скрыть изображение легко и понятно для всех браузеров. Есть несколько плагинов jquery rotate для изображений, но они не будут работать во всех браузерах.
Майк Бландфорд,
@mike, мое решение отлично работает для моего проекта во всех браузерах, как вы думаете, это хороший подход
Кобе
4

Я сделал это в своем проекте,

создайте div с задним URL-адресом как gif, который представляет собой не что иное, как анимацию gif

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

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

в вашем вызове ajax добавьте этот класс в div и в успешном ajax удалите класс.

он сделает свое дело.

дайте мне знать, если вам понадобится что-то еще, я могу дать вам более подробную информацию

в успехе ajax удалите класс

success: function(data) {
    remove class using jquery
  }
Кобе
источник
4

Чтобы немного расширить решение Родриго - для запросов, которые выполняются часто, вы можете отображать загрузочное изображение только в том случае, если запрос занимает больше минимального интервала времени, иначе изображение будет постоянно появляться и быстро исчезать.

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

Я сделал это в своем проекте:

Глобальные события в application.js:

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

«загрузка» - это элемент, который нужно показать и скрыть!

Ссылки: http://api.jquery.com/Ajax_Events/

Альберт Ю
источник
3

Мне пришлось использовать

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

Старый поток, но я хотел обновить, так как сегодня я работал над этой проблемой, у меня не было jquery в моем проекте, поэтому я сделал это обычным старым способом javascript, мне также нужно было заблокировать контент на экране, поэтому в моем xhtml

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

в моем javascript

    document.getElementsByClassName('myclass').style.opacity = '0.7'
    document.getElementById('loading').style.display = "block";
Сандипрадж Тандон
источник
Что вы имеете в виду под «старым добрым способом JavaScript»? Не могли бы вы объяснить дальше? Вы имеете в виду, что использовали XMLHttpRequest?
Брайан Петерсон