【问题标题】:Loading animation disappear before second ajax call加载动画在第二个 ajax 调用之前消失
【发布时间】:2016-02-02 22:09:07
【问题描述】:

每当 ajax 调用开始时,我都会显示加载动画,而在 ajax 调用完成后会停止。当我在函数中只使用一个 ajax 调用时,它工作正常。但是,如果我在同一个函数中有两个 ajax 调用,似乎加载动画在第一个 ajax 调用完成后消失了。 我怎样才能让它一直保持到所有 ajax 调用完成?

谢谢。

main.js 文件中的Javascript:

//Show loading image on Ajax Start
    $(document).ajaxStart(function() {
      showPleaseWait();
    });

    //Hide loading image on Ajax complete
    $(document).ajaxComplete(function() {
      hidePleaseWait();
    });

员工页面中的Javascript:

<script type="text/javascript">
        $(document).ready(function () {
            $("#ddlEmployeeNumber").change(function () {
                $("#log").ajaxError(function (event, jqxhr, settings, exception) {
                    alert(exception);
                });

                var employeeNumberSelected = $("select option:selected").first().text();

                $.get('@Url.Action("EmployeeSelfServiceInfo")',
                    { chosenEmployeeNumber: employeeNumberSelected }, function (data) {
                        $("#EmployeeSelfServiceInfo").html(data);
                    });

                $.get('@Url.Action("GetEmployeeName")',
                    { chosenEmployeeNumber: employeeNumberSelected }, function (data) {
                        $("#employeeName").text(data);
                    });
            });
        });
</script>




function showPleaseWait() {
    var modalLoading = '<div class="modal" id="pleaseWaitDialog" data-backdrop="static" data-keyboard="false role="dialog">\
        <div class="modal-dialog">\
            <div class="modal-content">\
                <div class="modal-header">\
                    <b>Processing...</b>\
                </div>\
                <div class="modal-body center-block">\
                    <div class="progress">\
                      <div class="progress-bar progress-bar-striped active" role="progressbar"\
                      aria-valuenow="100" aria-valuemin="100" aria-valuemax="100" style="width:100%;">\
                          Please Wait...\
                      </div>\
                    </div>\
                </div>\
            </div>\
        </div>\
    </div>';
    $(document.body).append(modalLoading);
    $("#pleaseWaitDialog").modal("show");
}

 function hidePleaseWait() {
    $("#pleaseWaitDialog").modal("hide");
}

更新:所以我通过用 .ajaxStop 调用替换现有的 .ajaxComplete 调用来修复它。

【问题讨论】:

  • showPleaseWait(); 分享此代码以及隐藏和 html 代码。

标签: javascript jquery ajax asp.net-mvc


【解决方案1】:

您可以使用计数器。

  • 在开始增加它,
  • 完成后,将其递减。
  • 检查它是否为零。如果是,请将其隐藏。

基本思路:

(function(){

    var openCount = 0;
    $(document).ajaxStart(function() {
      openCount++;
      showPleaseWait();
    });

    $(document).ajaxComplete(function() {
      openCount--;
      if(!openCount) hidePleaseWait();
    });

}());

【讨论】:

  • 试过了,但我还是看不出有什么不同。 :(
  • 显示和隐藏代码在做什么?也许问题现在就在那里。或者将其更改为 if(openCount===1) showPleaseWait(); 代码应该可以工作,因为我做了这样的事情。
  • 我已经更新了原始帖子以包含 showPleaseWait 和 hidePleaseWait 函数。
  • 你为什么要在隐藏中增加?而且由于您正在创建多个模式,因此您可能应该只在它不在要开始的页面上时附加它。如果打开,你不应该调用 showPleaseWait。
  • epascarello 实际上我看到了您的答案并修改了错误的函数并使用 hidePleaseWait 的代码编辑了原始问题。我为 hidePleaseWait 修复了没有 openCount++ 的原始问题。顺便说一句,我现在通过使用 .ajaxStop 而不是 .ajaxComplete 让它工作。不过感谢您的帮助。
【解决方案2】:

您可以保留一个变量来跟踪多个 ajax 调用。

var ajaxCallCounter=0;
//Show loading image on Ajax Start
$(document).ajaxStart(function() {
  showPleaseWait();
});

//Hide loading image on Ajax complete
$(document).ajaxComplete(function() {
  if(ajaxCallCounter===0)
  {
    hidePleaseWait();
  }
});

每次进行 ajax 调用时,增加这个变量。当您的 ajax 调用从服务器获得响应时,请减少它。

ajaxCallCounter++;
$.get('@Url.Action("EmployeeSelfServiceInfo")',function(res){
   ajaxCallCounter--;
   //do something with the  res
});

在上面的例子中,我们使用了一个简单的全局变量(这不是很好)!您可以使用 javascript 命名空间来声明变量以防止可能覆盖此变量的值或将您的代码包装在 IIFE 中。

【讨论】:

    【解决方案3】:

    不要使用 ajaxStart 和 ajaxComplete,您可以将这些调用绑定到每个 $.get

                $.get('@Url.Action("EmployeeSelfServiceInfo")',
                    { chosenEmployeeNumber: employeeNumberSelected }, 
                    beforeSend: showPleaseWait,
                    complete:  hidePleaseWait,
                    function (data) {
                        $("#EmployeeSelfServiceInfo").html(data);
                    });
    
    
                $.get('@Url.Action("GetEmployeeName")',
                    { chosenEmployeeNumber: employeeNumberSelected },  
                    beforeSend: showPleaseWait,
                    complete:  hidePleaseWait,
                    function (data) {
                        $("#employeeName").text(data);
                    });
    

    问题在于,由于这些是异步调用,因此这些元素上的隐藏/显示可能看起来很奇怪。

    【讨论】:

    • 为什么不使用它们?不好的建议。代码没有回答 OP 关于如何不隐藏的问题。
    • 如果最后一个比其他花费更长的时间...... OP 回到第一方。这与 OP 目前的行为完全相同......涉及更多代码
    • 还要注意你的语法对于传递函数引用是不正确的
    • 我并没有说他不能随心所欲地进行 ajax 调用,问题是他试图用相同的 dom 元素显示它们的状态......就是这样跨度>
    • “我怎样才能让它一直停留到所有 ajax 调用完成?” 你的不这样做......你的代码与 OP 100% 相同。
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2016-06-22
    • 1970-01-01
    • 2016-12-13
    • 2019-01-27
    • 2011-12-04
    • 2014-11-16
    • 1970-01-01
    相关资源
    最近更新 更多