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?

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


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().


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.


6

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


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
  }

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

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/


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

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";

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.