Javascript .show()在ajaxstart()内不起作用

Javascript .show()在ajaxstart()内不起作用,javascript,jquery,ajax,Javascript,Jquery,Ajax,下面是我的java脚本,用于在启动ajax时加载图像 <script type="text/javascript"> jQuery(function (){ $(document).ajaxStop(function() { $("#ajax_loader").hide(); //alert("end"); console.log(new Date(

下面是我的java脚本,用于在启动ajax时加载图像

<script type="text/javascript">
        jQuery(function (){
            $(document).ajaxStop(function() {
                $("#ajax_loader").hide();
                //alert("end");
                console.log(new Date().getTime());
            });
            $(document).ajaxStart(function() {
                $("#ajax_loader").show();
                //alert("start");
                console.log(new Date().getTime());
            });
        });
    </script>

jQuery(函数(){
$(文档).ajaxStop(函数(){
$(“#ajax_加载程序”).hide();
//警报(“结束”);
log(newdate().getTime());
});
$(文档).ajaxStart(函数(){
$(“#ajax_loader”).show();
//警报(“启动”);
log(newdate().getTime());
});
});
下面是我正在隐藏/显示的内容

<div id='ajax_loader'
            style="position: fixed; left: 50%; top: 40%; color: red; font-size: 3em; display : none; zIndex : 1;">
            processing.....
        </div>

处理。。。。。
问题是当调用任何ajax时,ajaxStart()方法正在执行,但它没有显示“#ajax_loader”内容

不过,该请求需要2到3秒才能响应

但是,如果我们取消对AjaStart()方法中的警报的注释,那么它将启用“#ajax_loader”内容


有人能帮我解决这个问题吗?

如果不以异步方式执行ajax,就不可能有加载指示器和同步ajax

这是因为浏览器渲染器被放入回调队列,而回调队列仅在callstack为空时才被处理。同步ajax防止调用堆栈在ajax完成之前清空,因此在完成之前不可能在页面上呈现任何内容

一种解决方法是在setTimeout中包装ajax请求,从而允许在发送ajax请求之前清除调用堆栈并执行渲染器。但是,这对ajaxStart不起作用,因为在。。。你猜对了。。ajax启动了。这可能也会破坏任何需要您将其作为同步请求的内容

唯一真正的解决方案是不使用同步ajax并重构将这种疯狂需求强加给您的代码

async: true

这就像你写的一样。当然,这假定AJAX操作是有效的。您可能希望在浏览器中打开“开发人员”面板并查看流量

    //your part
    jQuery(function() {

        $(document).ajaxStop(function() {
            $("#ajax_loader").hide();
            //alert("end");
            console.log(new Date().getTime());
        });
        $(document).ajaxStart(function() {
            $("#ajax_loader").show();
            //alert("start");
            console.log(new Date().getTime());
        });
    });

    //my part
    jQuery(function() {
        $("#thebutton").click(function() {

            $.ajax({
                crossDomain: true,
                url: "/",
                success: function(e) {
                    var piece = $("<div></div>");
                    piece.html(e);
                    $("#log").append(piece);
                },
                error: function(e) {
                    //alert(e)
                }
            })
        });
    })
//你的角色
jQuery(函数(){
$(文档).ajaxStop(函数(){
$(“#ajax_加载程序”).hide();
//警报(“结束”);
log(newdate().getTime());
});
$(文档).ajaxStart(函数(){
$(“#ajax_loader”).show();
//警报(“启动”);
log(newdate().getTime());
});
});
//我的部分
jQuery(函数(){
$(“#按钮”)。单击(函数(){
$.ajax({
跨域:是的,
网址:“/”,
成功:职能(e){
变量片段=$(“”);
html(e);
$(“#log”)。追加(件);
},
错误:函数(e){
//警报(e)
}
})
});
})

ajax是同步的吗?同步ajax阻止调用堆栈在ajax完成之前清除,这也阻止浏览器呈现任何内容,包括加载指示器。是。它是同步的。放一些宽度;显示和边框颜色以检查它是否显示。很好,这是您的问题。不要使用同步ajax。“永远不会。”凯文布好吧,这是个好电话,凯文。但我有这样的要求,它应该是同步的。有什么帮助吗?