Jak wyświetlić wskaźnik „zajętości” w jQuery?

81

Jak wyświetlić obracający się wskaźnik „zajętości” w określonym miejscu na stronie internetowej?

Chcę uruchomić / zatrzymać wskaźnik, gdy żądanie Ajax rozpoczyna / kończy się.

Czy to naprawdę kwestia pokazania / ukrycia animowanego gifa, czy jest bardziej eleganckie rozwiązanie?

Tony the Pony
źródło

Odpowiedzi:

94

Możesz po prostu pokazać / ukryć gif, ale możesz również osadzić go w ajaxSetup, więc jest wywoływany przy każdym żądaniu Ajax.

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

Jedna uwaga jest taka, że ​​jeśli chcesz wykonać określone żądanie Ajax bez posiadania pokrętła ładowania, możesz to zrobić w następujący sposób:

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

W ten sposób poprzednia konfiguracja $ .ajaxSetup nie wpłynęła na żądanie z global: false.

Więcej szczegółów na: http://api.jquery.com/jQuery.ajaxSetup

Rodrigo
źródło
2
+1 dla ajaxSetup(). Wolałby, aby globalpodano dalsze wyjaśnienia dotyczące nieruchomości.
RabidFire
@RabidFire, właściwie globalny nie jest tutaj potrzebny, jest tylko za $ .ajax
Rodrigo
@gov, pozycjonowanie gif zależy od układu, możesz po prostu ukryć / pokazać div, w którym jest umieszczony, zamiast modyfikować dom.
Rodrigo
1
Wyglądało to obiecująco, ale nie zadziałało, w końcu wypróbowałem inne rozwiązanie, które działało. stackoverflow.com/questions/7003707/…
Bob,
Jeśli masz 2 XHR, a pierwszy kończy się zaraz po uruchomieniu drugiego, ten kod ukrywa wskaźnik ładowania, mimo że drugi XHR nadal działa.
Mark E. Haase,
39

Dokumentacja jQuery zaleca wykonanie następujących czynności:

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

Gdzie #loadingjest element ze wskaźnikiem zajętości.

Bibliografia:

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

  • Ponadto jQuery.ajaxSetupAPI wyraźnie zaleca unikanie jQuery.ajaxSetupnastępujących sytuacji:

    Uwaga: Globalne funkcje zwrotne powinny być ustawione z ich odpowiednimi obsługi zdarzeń globalnych Ajax METODY .ajaxStart(), .ajaxStop(), .ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend()-rather niż wewnątrz optionsobiektu dla $.ajaxSetup().

Sean W.
źródło
1
Wydają się one bardziej przydatne niż wcześniej. Wyślij i zakończ, ponieważ ajaxStart "... zarejestruje procedurę obsługi, która zostanie wywołana, gdy rozpocznie się pierwsze żądanie Ajax", a ajaxStop "... zarejestruje procedurę obsługi, która zostanie wywołana po zakończeniu wszystkich żądań Ajax" - obsługują one współbieżne komunikaty asynchroniczne i nie ukrywają przedwcześnie wskaźnika „proszę czekać”.
przerwa
10

Mam tendencję do po prostu pokazywania / ukrywania IMG, jak powiedzieli inni. Znalazłem dobrą stronę, która generuje „ładowanie gifów”

Link Po prostu umieściłem go wewnątrz a divi ukryj domyślnie display: none;(css), a następnie gdy wywołasz funkcję pokaż obraz, po jego całkowitym ukryj go ponownie.

Elliott
źródło
6

tak, tak naprawdę chodzi tylko o pokazanie / ukrycie animowanego gifu.

Ścigaj Florell
źródło
2
Zgoda. Pokaż / ukryj obraz jest łatwy i zrozumiały dla wszystkich przeglądarek. Istnieje kilka wtyczek do obracania obrazów jquery, ale nie będą one działać we wszystkich przeglądarkach.
Mike Blandford
@mike, moje rozwiązanie działa dobrze dla mojego projektu we wszystkich przeglądarkach, myślisz, że to fajne podejście
kobe
4

Zrobiłem to w moim projekcie,

utwórz element div z adresem URL w tle jako gif, który jest niczym innym jak animowanym gifem

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

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

w wywołaniu AJAX dodaj tę klasę do elementu DIV, aw przypadku pomyślnego AJAX usuń klasę.

załatwi sprawę.

daj mi znać, jeśli potrzebujesz czegoś innego, mogę podać więcej szczegółów

w sukcesie AJAX usuń klasę

success: function(data) {
    remove class using jquery
  }
kobe
źródło
4

Aby nieco rozszerzyć rozwiązanie Rodrigo - w przypadku żądań, które są wykonywane często, możesz chcieć wyświetlić obraz wczytywania tylko wtedy, gdy żądanie trwa dłużej niż minimalny przedział czasu, w przeciwnym razie obraz będzie stale pojawiał się i szybko znikał

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
    }
});
John M.
źródło
3

Zrobiłem to w swoim projekcie:

Zdarzenia globalne w application.js:

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

„ładowanie” to element do pokazania i ukrycia!

Źródła: http://api.jquery.com/Ajax_Events/

albert yu
źródło
3

Musiałem użyć

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();
  });
Ken Mc
źródło
2

Stary wątek, ale chciałem zaktualizować, ponieważ dzisiaj pracowałem nad tym problemem, nie miałem jquery w moim projekcie, więc zrobiłem to w zwykły stary sposób javascript, musiałem również zablokować zawartość na ekranie, więc w moim xhtml

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

w moim javascript

    document.getElementsByClassName('myclass').style.opacity = '0.7'
    document.getElementById('loading').style.display = "block";
Sandeepraj Tandon
źródło
Co masz na myśli mówiąc „zwykły, stary sposób javascript”? Czy mógłbyś wyjaśnić dalej? Czy masz na myśli, że użyłeś XMLHttpRequest?
Brian Peterson