Implementieren Sie einen Ladeindikator für einen jQuery AJAX-Aufruf


88

Ich habe ein Bootstrap-Modal, das über einen Link gestartet wird. Für ca. 3 Sekunden bleibt es nur leer, während die AJAX-Abfrage die Daten aus der Datenbank abruft. Wie kann ich eine Art Ladeanzeige implementieren? Bietet Twitter Bootstrap diese Funktionalität standardmäßig?

EDIT: JS-Code für Modal

<script type="text/javascript">
  $('#myModal').modal('hide');
  $('div.divBox a').click(function(){
    var vendor = $(this).text();
    $('#myModal').off('show');
    $('#myModal').on('show', function(){             
      $.ajax({
        type: "GET",
        url: "ip.php",
        data: "id=" + vendor,
        success: function(html){
          $("#modal-body").html(html);
          $(".modal-header h3").html(vendor);
          $('.countstable1').dataTable({
            "sDom": "T<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",
            "sPaginationType": "bootstrap",
            "oLanguage": {
              "sLengthMenu": "_MENU_ records per page"
            },
            "aaSorting":[[0, "desc"]],
            "iDisplayLength": 10,
            "oTableTools": {
              "sSwfPath": "swf/copy_csv_xls_pdf.swf",
              "aButtons": ["csv", "pdf"]
            }
          });
        }
      });
    });
  });
  $('#myModal').on('hide', function () {
    $("#modal-body").empty();
  });
</script>

Antworten:


40

Ich vermute, Sie verwenden jQuery.get oder eine andere jQuery-Ajax-Funktion, um das Modal zu laden. Sie können den Indikator vor dem Ajax-Aufruf anzeigen und nach Abschluss des Ajax ausblenden. Etwas wie

$('#indicator').show();
$('#someModal').get(anUrl, someData, function() { $('#indicator').hide(); });

164

Ich habe das gleiche Problem anhand dieses Beispiels gelöst:

In diesem Beispiel wird die JavaScript-Bibliothek jQuery verwendet.

Erstellen Sie zunächst ein Ajax-Symbol mithilfe der AjaxLoad-Site .
Fügen Sie dann Folgendes zu Ihrem HTML hinzu:

<img src="/images/loading.gif" id="loading-indicator" style="display:none" />

Und folgendes zu Ihrer CSS-Datei:

#loading-indicator {
  position: absolute;
  left: 10px;
  top: 10px;
}

Zuletzt müssen Sie sich in die von jQuery bereitgestellten Ajax-Ereignisse einbinden. Ein Ereignishandler für den Beginn der Ajax-Anforderung und einer für den Zeitpunkt des Endes:

$(document).ajaxSend(function(event, request, settings) {
    $('#loading-indicator').show();
});

$(document).ajaxComplete(function(event, request, settings) {
    $('#loading-indicator').hide();
});

Diese Lösung stammt aus dem folgenden Link. So zeigen Sie ein animiertes Symbol während der Ajax-Anforderungsverarbeitung an


+1 für den Hakenmechanismus "Nur einmal ausführen". Eine feste Ladeanzeige eignet sich jedoch nicht so gut für Modalitäten, die normalerweise eine Überlagerung haben, die die Ladeanzeige teilweise verdeckt. In diesem Fall ist es besser, die Ladeanzeige in das Modal einzufügen, z. B. in die Titelleiste. Oder fügen Sie dem Indikator einen hohen Z-Index hinzu, damit er über der Überlagerung angezeigt wird?
Pierre Henry

3
Hey, alle ... Sehen Sie sich eine Demo an, die auf dieser Antwort basiert.
Paul Vargas

Denken Sie daran, diese Skripte NACH dem Verweis auf das JQuery-Skript einzufügen. Ich verbringe nur eine Stunde wegen der umgekehrten Reihenfolge der Platzierung innerhalb der Seite.
Greg Z.

Es klingt wie ajaxStart()und ajaxStop()wäre eine bessere Lösung gemäß der Antwort von @ajaristi, da diese nur einmal pro AJAX-Stapel ausgelöst werden
SharpC

30

Es gibt eine globale Konfiguration mit jQuery. Dieser Code wird bei jeder globalen Ajax-Anforderung ausgeführt.

<div id='ajax_loader' style="position: fixed; left: 50%; top: 50%; display: none;">
    <img src="themes/img/ajax-loader.gif"></img>
</div>

<script type="text/javascript">
    jQuery(function ($){
        $(document).ajaxStop(function(){
            $("#ajax_loader").hide();
         });
         $(document).ajaxStart(function(){
             $("#ajax_loader").show();
         });    
    });    
</script>

Hier ist eine Demo: http://jsfiddle.net/sd01fdcm/


1
Dies funktioniert sehr gut, aber vergessen Sie nicht, ein Z-Index-CSS für Websites hinzuzufügen, die modal verwenden.
Deise Vicentin

1
Dies sollte mehr Stimmen haben als die Antwort @leansy, da sie korrekt verwendet wird .ajaxStart()und ajaxStop()einmal pro AJAX-Stapel ausgelöst wird : stackoverflow.com/questions/3735877/… .
SharpC

14

Eine Ladeanzeige ist einfach ein animiertes Bild (.gif), das angezeigt wird, bis das abgeschlossene Ereignis in der AJAX-Anforderung aufgerufen wird. http://ajaxload.info/ bietet viele Optionen zum Generieren von Ladebildern, die Sie Ihren Modalen überlagern können. Meines Wissens bietet Bootstrap nicht die integrierte Funktionalität.


6

So habe ich es mit dem Laden von Remote-Inhalten gemacht, die aktualisiert werden müssen:

$(document).ready(function () {
    var loadingContent = '<div class="modal-header"><h1>Processing...</h1></div><div class="modal-body"><div class="progress progress-striped active"><div class="bar" style="width: 100%;"></div></div></div>';

    // This is need so the content gets replaced correctly.
    $("#myModal").on("show.bs.modal", function (e) {
        $(this).find(".modal-content").html(loadingContent);        
        var link = $(e.relatedTarget);
        $(this).find(".modal-content").load(link.attr("href"));
    });    

    $("#myModal2").on("hide.bs.modal", function (e) {
        $(this).removeData('bs.modal');
    });
});

Ersetzen Sie den modalen Inhalt beim Laden einfach durch eine Lademeldung. Der Inhalt wird dann ersetzt, sobald das Laden abgeschlossen ist.


3

So habe ich den Ladeindikator durch ein Glyphicon realisiert:

<!DOCTYPE html>
<html>

<head>
    <title>Demo</title>

    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css">
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.4.min.js"></script>
    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/bootstrap.min.js"></script>

    <style>
        .gly-ani {
          animation: ani 2s infinite linear;
        }
        @keyframes ani {
          0% {
            transform: rotate(0deg);
          }
          100% {
            transform: rotate(359deg);
          }
        }
    </style>  
</head>

<body>
<div class="container">

    <span class="glyphicon glyphicon-refresh gly-ani" style="font-size:40px;"></span>

</div>
</body>

</html>
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.