Javascript Ajax在处理请求时是否会阻止窗口?
我正在发出一个ajax请求,处理服务器端可能需要很多时间。因此,我希望在请求处理时显示加载映像。但在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
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);