Впровадити індикатор завантаження для виклику jQuery AJAX


88

У мене є модальний Bootstrap, який запускається за посиланням. Приблизно 3 секунди він просто сидить там порожнім, тоді як запит AJAX отримує дані з бази даних. Як я можу реалізувати якийсь індикатор завантаження? Чи забезпечує завантажувач Twitter цю функцію за замовчуванням?

EDIT: код JS для модального

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

Відповіді:


40

Я думаю, ви використовуєте jQuery.get або якусь іншу функцію jQuery ajax для завантаження модальної. Ви можете показати індикатор перед викликом ajax і приховати його, коли ajax завершиться. Щось на зразок

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

164

Я вирішив ту ж проблему, слідуючи цьому прикладу:

У цьому прикладі використовується бібліотека jQuery JavaScript.

Спочатку створіть піктограму Ajax за допомогою сайту AjaxLoad .
Потім додайте у свій HTML наступне:

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

І наступне до вашого файлу CSS:

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

Нарешті, вам потрібно зачепити за події Ajax, які забезпечує jQuery; один обробник подій, коли починається запит Ajax, і один, коли він закінчується:

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

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

Це рішення наведено за наступним посиланням. Як відобразити анімований значок під час обробки запитів Ajax


+1 для механізму підключення "зробити лише один раз". Але фіксований індикатор завантаження не такий чудовий для модалів, які зазвичай мають накладку, яка частково приховує індикатор завантаження ... краще помістити індикатор завантаження всередину модальної, наприклад, у рядок заголовка. А може, додати високий z-індекс до показника, щоб він відображався над накладанням?
П'єр Генрі

3
Гей, усі ... Дивіться демонстрацію, засновану на цій відповіді.
Пол Варгас,

Просто пам’ятайте, що слід розміщувати ці сценарії ПІСЛЯ посилання на сценарій JQuery. Я просто витрачаю годину через зворотний порядок розміщення всередині сторінки.
Грег З.

Це звучить , як ajaxStart()і ajaxStop()було б найкращим рішенням , згідно @ajaristi відповідь , як ці вогонь тільки один раз в AJAX партії: stackoverflow.com/questions/3735877 / ...
SharpC

30

Існує глобальна конфігурація за допомогою jQuery. Цей код працює на кожному глобальному запиті ajax.

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

Ось демонстрація: http://jsfiddle.net/sd01fdcm/


1
Це працює дуже добре, але не забудьте додати z-index css для сайтів, які використовують модальний.
Deise Vicentin

1
Тут має бути більше голосів, ніж відповідь @leansy, оскільки вона правильно використовується, .ajaxStart()і ajaxStop()яка запускається один раз за партію AJAX: stackoverflow.com/questions/3735877/… .
SharpC

14

Індикатор завантаження - це просто анімоване зображення (.gif), яке відображається доти, доки завершена подія не буде викликана на запит AJAX. http://ajaxload.info/ пропонує безліч варіантів для створення завантажувальних зображень, які ви можете накласти на свої модалі. Наскільки мені відомо, Bootstrap не забезпечує вбудовану функціональність.


6

Ось так я працював із завантаженням віддаленого вмісту, який потрібно оновити:

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

По суті, просто замініть модальний вміст під час завантаження повідомленням про завантаження. Потім вміст буде замінено після завантаження.


3

Ось як я зрозумів індикатор завантаження за допомогою Glyphicon:

<!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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.