我试图在 Jquery Ajax 调用之前显示加载器,但它不起作用

I am trying to show a Loader before Jquery Ajax call but it does not work

我正在尝试使用以下代码显示 div 在 ajax 调用之前容器装载程序。

$(document).ajaxStart(function() {
  $("#div_loader").css("display", "block")
})

$(document).ajaxComplete(function() {
  $("#div_loader").css("display", "none");
})

但是当我使用 Chrome 开发人员工具调试 JS 时,我只能看到 div。但通常情况下,它永远不会出现。

Div Html

<div class="loader" id='div_loader'>
            <div class="shade"></div>
            <div class="popup">
            </div>
        </div>

Css 对于加载程序

.loader {
    position: absolute;
    /* height: 100%; */
    max-height: 100%;
    width: 100%;
}

.shade {
    position: fixed;
    z-index: 9999999999;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    background: #333;
    opacity: 0.8;
}

.loader .popup {
    position: fixed;
    height: 102px;
    width: 218px;
    background: url(../images/loader.gif) 50% 85% no-repeat;
    background-size: 32px;
    margin: 12% auto;
    border-radius: 6px;
    top: 10%;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 99999999999;
}

这是 ajax 请求...

function AjaxPostCall(ServicePath, Input) {
    var data = $.parseJSON($.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: ServicePath,
        data: JSON.stringify({ 'Input': Input }),
        dataType: "json",
        async: false
    }).responseText); // This will wait until you get a response from the ajax request.
    var DataSet = JSON.parse(data.d);
    return DataSet;    
}

你可以试试这个例子。

$(document).ajaxStart(function() {
  $("#div_loader").css("display", "block")
});

$(document).ajaxComplete(function() {
  $("#div_loader").css("display", "none");
});

$(document).ready(function(){
  $.ajax({url: "demo_test.txt", success: function(result){
            $("#div1").html(result);
  }});
});
#div_loader
{
  background-color: #EEE;
  Color: #000;
  width:100%;
  height:500px;
  text-align:center;
  padding-top:100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="div_loader">Please wait...
</div>

<div id="div1">
</div>

您可以使用 ajax

的这个全局事件
    $(document).bind("ajaxSend", function(){
        $("#div_loader").css("display", "block");
     }).bind("ajaxComplete", function(){
        $("#div_loader").css("display", "none");
     });

不完全确定问题是什么,没有看到所有的代码,但很多次我都使用了与下面类似的方法。

HTML

<div class='js-div-loader div-loader'></div>

CSS

.div-loader{
  width: 200px;
  height:200px;
  padding:10px;
  /*'Hide here, if you don't want to hide on page load' display:none;*/
}

JQuery

$(document).ready(function(){
    $(".js-div-loader").hide();

    $(document).ajaxStart(function() {
      $(".js-div-loader").show();
    })

    $(document).ajaxComplete(function() {
      $(".js-div-loader").hide();
    })
});

我更喜欢使用 class's 而不是 id's - 在多个元素上使用相同的 id 绝不是一个好主意,每个文档的 "they" 应该是唯一的。

我总是在 class 前面加上 "js-" 帮助我确定 selectors/elements 在 js

中使用的内容

我已经解决了。我是 Jquery 的新手,我不知道将 ajax 调用的异步 属性 设置为 false 会冻结页面直到现在。我已经尝试将 async 设置为 true,它现在工作正常。

$(document).ajaxStart(function () {
    blockUI();
})

$(document).ajaxComplete(function () {
    unBlockUI();
})


function blockUI() {
    var loader = '<div class="page-overlay"><div class="page-loader"></div></div>';

    $('#pageLoader').append(loader);
}

function unBlockUI() {
    $('#pageLoader').empty();
}



.page-loader {
    border: 5px solid #eee;
    border-radius: 50%;
    border-top: 5px solid rgba(0,0,0,1);
    width: 50px;
    height: 50px;
    -webkit-animation: spin 1s linear infinite;
    animation: spin 1s linear infinite;
    position: absolute;
    top: 300px;
    z-index: 9999;
    background-color: rgba(255,255,255,0.3);
    left: 700px;
}

.page-overlay {
    position: fixed;
    width: 100%;
    height: 100%;
    top: 0px;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(255,255,255,0.3);
    z-index: 9999;
    cursor: wait;
}


<div id="pageLoader"></div>