关于Jquery ajax访问的一个很奇怪的问题,网上找了很久都没找到解决办法。

通过点击一个按钮ajax访问一个jsp页面
原本想是点击按钮的时候加载一个div 防止用户再点击
但现在是ajax访问的页面返回东西的时候那个div才出来。
但是奇怪的是加个alert语句的时候div能立即出来。
好了 废话不说了 看代码:
[code="java"]core.ajax = {
receivePacket:function(packet)
{
},
sendPacket:function(packet , process , aysncflag){

 var sendUrl = packet.url;
     var sendData = packet.data.data;

   if(process ==null) process = doProcess;
     if(aysncflag==null) aysncflag = false;

     if(aysncflag == false){
           loading();   
        }

     $.ajax({
           url: sendUrl,
           data: sendData,
           type:"POST",
           async:aysncflag,  
           dataType:"html",
           success: function(data){
              eval(data);
              process(response);
              response = null;
           },
           error:function(data){
                if(data.status=="404")
                {
                  alert( "文件不存在!");
                }
                else if (data.status=="500")
                {
                  alert("文件编译错误!");
                }
                else{
                  alert("系统错误!");                   
                }
           }
        });
        if(aysncflag == false){
            unLoading();            
        }

},[/code]

[code="java"]function loading(){
var divHtml = "

"
+ "正在提交信息,请等待......";
+ "
";
$("body:first").append(divHtml);
$.blockUI($("#lodingDiv"));
}[/code]

在loading方法调用后加个alert能立即加载信息。

ps: [quote]在loading方法调用后加个alert能立即加载信息。[/quote]
alert是阻塞式,你在 loading后面执行alert就相当于阻止ajax执行而全力执行blockUI动画(记住是动画,是需要线程时间片段的,而javascript是单线程模式)。

[code="java"] if(aysncflag == false){

unLoading();

} [/code]

ajax是异步提交数据上面这句话应该要放在回调函数里写。

alert会阻塞所以你能看到加载信息。

在 $.ajax 的 beforeSend 事件里面判断并调用 loading()

你是用$.blockUI($("#lodingDiv")); 来显示等待框, blockUI不是阻塞执行而是队列。所以实际执行步骤可能如下: blockUI执行->ajax提交信息并等待->blockUI效果出现 .最后效果出现的时机取决于第二步ajax返回的速度,如果服务端立刻返回了,那么看起来效果就是ajax整个流程完了才出现 blockUI的效果。如果等待时间长(你可以在服务端弄个大循环模拟),那么blockUI应该就会出现早些。

alert()是阻塞javascript线程,而同步ajax不但阻塞js线程(不确定)也锁住浏览器。估计这个结果导致不但你无法和浏览器交互,浏览器也停止渲染动画什么的。

ajax异步,也就和其他代码同时执行啦