Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax在处理请求时是否会阻止窗口?_Javascript_Ajax - Fatal编程技术网

Javascript Ajax在处理请求时是否会阻止窗口?

Javascript Ajax在处理请求时是否会阻止窗口?,javascript,ajax,Javascript,Ajax,我正在发出一个ajax请求,处理服务器端可能需要很多时间。因此,我希望在请求处理时显示加载映像。但在ajax请求时,加载映像不会显示。 var ref = createAjaxRequest();//Ajax req is created here... if(ref){ showLoadingImg(); ref.open('POST','x.jsp',false); ref.onreadystatechange = eventStateChan

我正在发出一个ajax请求,处理服务器端可能需要很多时间。因此,我希望在请求处理时显示加载映像。但在ajax请求时,加载映像不会显示。

var ref = createAjaxRequest();//Ajax req is created here...
if(ref){
        showLoadingImg();
        ref.open('POST','x.jsp',false);
        ref.onreadystatechange = eventStateChange;
        ref.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        ref.setRequestHeader("Connection", "keep-alive");
        ref.send();
    }
    else{ alert("Your browser does not support this feature");
}
function eventStateChange(){
 if(ref.readyState==4 ){
    //processing response here......
   hideLoadingImg();
 }
}

function showLoadingImg();{
 /* <div id="ajaxLoading">(with background image is in page)
  It is displayed properly when I set display:inline 
  manually through developer tools of a browser.</div>
*/
  document.getElementById('ajaxLoading').style.display='inline';
}
function hideLoadingImg();{
  document.getElementById('ajaxLoading').style.display='none';
}
var ref=createAjaxRequest()//Ajax请求是在这里创建的。。。
如果(参考){
显示加载img();
ref.open('POST','x.jsp',false);
ref.onreadystatechange=eventStateChange;
参考setRequestHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
参考setRequestHeader(“连接”,“保持活动”);
ref.send();
}
else{alert(“您的浏览器不支持此功能”);
}
函数eventStateChange(){
如果(ref.readyState==4){
//在这里处理响应。。。。。。
hideloading();
}
}
函数showLoadingImg();{
/*(带背景的图像位于第页)
当我设置display:inline时,它会正确显示
通过浏览器的开发人员工具手动执行。
*/
document.getElementById('ajaxLoading').style.display='inline';
}
函数hideLoadingImg();{
document.getElementById('ajaxLoading').style.display='none';
}
有什么问题吗

我尝试调试并发现:

  • 虽然在
    open()
    方法之前调用了
    showLoadingImg()
    ,但加载图像仅在
    ref.readyState==2
    之后显示在浏览器上

  • 但不幸的是,
    readyState==2
    readyState==4
    之间的时间间隔非常小,加载的图像立即被隐藏。
    因此,用户无法看到正在加载的图像


  • 因此,我怀疑的是,如果将
    async
    设置为
    false
    ,ajax是否会运行脚本,除非它转到
    readyState==2
    ref.open('POST','x.jsp',false)async设置为
    false
    ,则代码>

    XMLHttpRequest块,与这里的第三个参数相同:
    ref.open('POST','x.jsp',false)

    我认为你打电话到
    打开
    是错误的。 第三个参数(布尔值)指示请求是否异步

    请考虑完整的文档:

    应该能解决你的问题


    关于

    我认为你打电话到
    打开
    是错误的。 第三个参数(布尔值)指示请求是否异步

    请考虑完整的文档:

    应该能解决你的问题


    关于createAjaxRequest中发生了什么?在创建请求之前不能显示图像,然后在出现错误时(或在完成后)隐藏图像,这有什么原因吗?createAjaxRequest中发生了什么?在创建请求之前不能显示图像,然后在出现错误时(或在完成后)隐藏图像,这是有原因的吗?我是这么想的,但是OP在打开之前调用了showLoadingImg,并且仍然必须等待ref.readyState==2才能看到图像。@grape_-mao-它阻止函数完成,所以浏览器运行DOM绘制需要一些时间。那么在js中,函数可以在前一个完成之前开始执行吗?或者仅仅因为这里有一个DOM操作?如果函数a调用函数B,那么函数B将在将控制返回给函数a之前完成,这样函数a就可以继续并完成。DOM被更改,但浏览器不会立即重新绘制DOM,它会等待线程释放。这是我的想法,但OP在打开之前调用了showLoadingImg,并且仍然必须等待ref.readyState==2才能看到图像。@grape\u mao-它阻止函数完成,所以浏览器运行DOM绘制需要一些时间。那么在js中,函数可以在前一个完成之前开始执行吗?或者仅仅因为这里有一个DOM操作?如果函数a调用函数B,那么函数B将在将控制返回给函数a之前完成,这样函数a就可以继续并完成。DOM会被更改,但浏览器不会立即重新绘制DOM,它会等待线程释放。谢谢..你说得对。但是如果必须显示加载映像,尽管ajax调用是同步的呢?谢谢..你说得对。但是如果必须显示加载映像,尽管ajax调用是同步的呢?
    ref.open('POST','x.jsp',true);