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

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

schlank
quelle
+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/

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

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

Rhys Stephens
quelle
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>
Mathias
quelle