Wie zeige ich mit jQuery eine Besetztanzeige an?

79

Wie zeige ich an einer bestimmten Stelle auf einer Webseite eine sich drehende "Besetzt" -Anzeige an?

Ich möchte die Anzeige starten / stoppen, wenn eine Ajax-Anfrage beginnt / abgeschlossen wird.

Geht es wirklich nur darum, ein animiertes GIF ein- oder auszublenden, oder gibt es eine elegantere Lösung?

Tony das Pony
quelle

Antworten:

93

Sie können ein GIF einfach ein- / ausblenden, aber Sie können es auch in ajaxSetup einbetten, sodass es bei jeder Ajax-Anfrage aufgerufen wird.

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

Ein Hinweis ist, dass Sie, wenn Sie eine bestimmte Ajax-Anfrage ausführen möchten, ohne den Ladespinner zu haben, dies folgendermaßen tun können:

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

Auf diese Weise hat das vorherige $ .ajaxSetup, das wir durchgeführt haben, keinen Einfluss auf die Anforderung mit global: false.

Weitere Informationen finden Sie unter: http://api.jquery.com/jQuery.ajaxSetup

Rodrigo
quelle
2
+1 für ajaxSetup(). Würde es vorziehen, wenn weitere Erklärungen zur globalImmobilie gegeben würden.
RabidFire
@ RabidFire, eigentlich wird global hier nicht benötigt, es ist nur für $ .ajax
Rodrigo
@gov, die Positionierung des GIF hängt vom Layout ab. Sie können das Div einfach ausblenden / anzeigen, wo es platziert ist, anstatt dom zu ändern.
Rodrigo
1
Das sah vielversprechend aus, aber es funktionierte nicht für mich und versuchte schließlich eine andere Lösung, die funktionierte. stackoverflow.com/questions/7003707/…
Bob
Wenn Sie 2 XHRs haben und die erste direkt nach dem Start der zweiten beendet wird, verbirgt dieser Code die Ladeanzeige, obwohl die zweite XHR noch ausgeführt wird.
Mark E. Haase
38

In der jQuery-Dokumentation wird Folgendes empfohlen:

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

Wo #loadingist das Element mit Ihrer Besetztanzeige?

Verweise:

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

  • Darüber hinaus empfiehlt jQuery.ajaxSetupAPI ausdrücklich, Folgendes zu vermeiden jQuery.ajaxSetup:

    Hinweis: Globale Callback - Funktionen sollten mit ihrem jeweiligen globalen Ajax Event - Handler Methoden- gesetzt werden .ajaxStart(), .ajaxStop(), .ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend()-rather als innerhalb des optionsfür das Objekt $.ajaxSetup().

Sean W.
quelle
1
Diese scheinen nützlicher als zuvor zu sein. Senden und vervollständigen, da ajaxStart "... einen Handler registriert, der aufgerufen wird, wenn die erste Ajax-Anforderung beginnt" und ajaxStop "... einen Handler registriert, der aufgerufen wird, wenn alle Ajax-Anforderungen abgeschlossen sind" - Diese verarbeiten gleichzeitige asynchrone Nachrichten und verbergen die Anzeige "Bitte warten" nicht vorzeitig.
Lücke
10

Ich neige dazu, ein IMG nur ein- oder auszublenden, wie andere angegeben haben. Ich habe eine gute Website gefunden, die "Laden von Gifs" generiert.

Link Ich habe es einfach in ein eingefügt divund standardmäßig display: none;ausgeblendet (CSS). Wenn Sie dann die Funktion aufrufen, wird das Bild angezeigt , sobald es vollständig ausgeblendet ist.

Elliott
quelle
6

Ja, es geht wirklich nur darum, ein animiertes GIF ein- / auszublenden.

Chase Florell
quelle
2
Einverstanden. Das Ein- und Ausblenden eines Bildes ist für alle Browser einfach und verständlich. Es gibt ein paar jquery-Rotations-Plugins für Bilder, die jedoch nicht in allen Browsern funktionieren.
Mike Blandford
@mike meine Lösung funktioniert gut für mein Projekt in allen Browsern, denkst du, das ist ein guter Ansatz
Kobe
4

Ich habe es in meinem Projekt gemacht,

Erstelle ein Div mit einer Hintergrund-URL als GIF, das nichts anderes als ein Animations-GIF ist

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

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

Fügen Sie in Ihrem Ajax-Aufruf diese Klasse dem div hinzu, und entfernen Sie bei Ajax-Erfolg die Klasse.

es wird den Trick machen, der sitzt.

Lassen Sie mich wissen, wenn Sie etwas anderes brauchen, ich kann Ihnen mehr Details geben

Entfernen Sie im Ajax-Erfolg die Klasse

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

Um die Lösung von Rodrigo ein wenig zu erweitern: Bei häufig ausgeführten Anforderungen möchten Sie das Ladebild möglicherweise nur anzeigen, wenn die Anforderung länger als ein Mindestzeitintervall dauert. Andernfalls wird das Bild ständig angezeigt und verschwindet schnell

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.
quelle
3

Ich habe es in meinem Projekt gemacht:

Globale Ereignisse in application.js:

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

"Laden" ist das Element zum Ein- und Ausblenden!

Referenzen: http://api.jquery.com/Ajax_Events/

albert yu
quelle
3

Ich musste benutzen

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
quelle
2

Alter Thread, aber ich wollte aktualisieren, da ich heute an diesem Problem gearbeitet habe. Ich hatte keine Abfrage in meinem Projekt, also habe ich es auf die einfache alte Javascript-Art gemacht. Ich musste auch den Inhalt auf dem Bildschirm blockieren, also in meinem xhtml

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

in meinem Javascript

    document.getElementsByClassName('myclass').style.opacity = '0.7'
    document.getElementById('loading').style.display = "block";
Sandeepraj Tandon
quelle
Was meinst du mit "dem einfachen alten Javascript-Weg"? Könnten Sie das näher erläutern? Meinst du, du hast eine benutzt XMLHttpRequest?
Brian Peterson