为jQuery AJAX调用实现一个加载指示器。

89

我有一个通过链接启动的Bootstrap模态框。大约3秒钟它只是空白,而AJAX查询从数据库获取数据。如何实现某种类型的加载指示器?Twitter Bootstrap是否默认提供此功能?

编辑:模态框的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>
6个回答

166
我用这个例子解决了同样的问题:
这个例子使用了jQuery JavaScript库。
首先,使用AjaxLoad site创建一个Ajax图标。
然后将以下内容添加到你的HTML中:
<img src="/images/loading.gif" id="loading-indicator" style="display:none" />

将以下内容添加到您的CSS文件中:
#loading-indicator {
  position: absolute;
  left: 10px;
  top: 10px;
}

最后,你需要钩入jQuery提供的Ajax事件; 一个用于处理Ajax请求开始时的事件处理程序,另一个用于处理Ajax请求结束时的事件处理程序:
$(document).ajaxSend(function(event, request, settings) {
    $('#loading-indicator').show();
});

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

这个解决方案来自以下链接。 如何在Ajax请求处理期间显示动画图标

“仅执行一次”钩子机制值得加1分。但对于通常有遮罩层部分遮挡加载指示器的模态框来说,固定的加载指示器并不是很好...在这种情况下最好将加载指示器放在模态框内,例如标题栏中。或者可以将指示器的z-index设置得很高,以便它显示在遮罩层之上? - Pierre Henry
3
大家好...看一下这个答案所基于的演示 - Paul Vargas
请记得在引用 JQuery 脚本之后放置这些脚本。由于页面内的顺序颠倒,我刚刚花了一个小时来解决问题。 - Greg Z.
根据@ajaristi的回答,似乎ajaxStart()ajaxStop()会是更好的解决方案,因为它们仅在每个AJAX批处理中触发一次:https://dev59.com/nG865IYBdhLWcg3wl_s3 - SharpC

41

我猜你正在使用jQuery.get或其他jQuery ajax函数来加载模态框。你可以在ajax调用之前显示指示器,并在ajax完成后隐藏它。类似这样:

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

31

有一个使用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批处理中触发一次:https://dev59.com/nG865IYBdhLWcg3wl_s3。 - 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');
    });
});

基本上,只需在模态框加载时用加载消息替换模态框内容。一旦内容加载完成,它将被替换。


4

这是我如何通过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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接