3

我有一个 jQuery $.ajax 调用,它在所有主流浏览器中都能正常工作。

此外,我使用 .ajaxStart 和 .ajaxStop 函数在我的页面上制作一个不可见的 div,上面写着“正在加载...”,可见。

问题是,虽然 ,ajaxStart 和 .ajaxStop 事件触发没有任何问题(我从 console.log() 检查它),但 ajaxStart 中 jQuery 的 .show 事件在 Google Chrome 中完全被忽略。

这是代码:

$("#loadMsg").ajaxStart(function(){
   console.log('ajaxstart');
   // the next command is ignored ONLY in Google Chrome
   $(this).show(0);
}); 

$.ajax({
  url:"xxx.php",
  type:"POST",
  data:"id="+id,
  async:false,
  success:function(data)
  {
     console.log(data); 
  }
});  

$("#loadMsg").ajaxStop(function(){
  console.log('ajaxfinish');
  $(this).hide(0);
});

我已经尝试过:

$("#loadMsg").show(0);  
$("#loadMsg").fadeIn();  
$("#loadMsg").css("display","block");  
$("#loadMsg").css("display","inline");  

等等

任何建议将不胜感激。

4

2 回答 2

0

经过2天的努力,我终于找到了解决方案。我上面发布的整个代码都在一个函数中,它通过成功属性将 xxx.php 的结果返回给主代码。

问题是当我使用async:true选项时,该函数立即返回返回值,而无需等待 ajax 完成请求。所以返回的值总是一个“未定义”的值,而不是 xxx.php 的正确结果。

仅当 ajax 请求完成时,异步运行 ajax 并继续执行其余代码的解决方案是将整个代码放在成功参数中。

我将尝试通过以下示例说明清楚:

无效的代码:

function foo()
{

 if call_ajax_request()=="true"
  {
    //execute code A
    // never had the chance to be executed because call_ajax_request() 
    // was always undefined
  }

}



function call_ajax_request()
{

  var return_value;

  $.ajax({
  url:"xxx.php",
  type:"POST",
  data:"z="+y,
  success:function(data)
    {
           return_value = data;
        }
    }); 

    //return_value was always "undefined" because the flow didn't wait
   // for ajax to complete (async mode)
   return return_value;
}

最终完成工作的代码:

function foo()
{

  $.ajax({
   url:"xxx.php",
   type:"POST",
   data:"z="+y,
   success:function(data)
     {
            return_value = data;

            //here, the following code won't be executed 
            //as long as ajax hasn't been completed.

            if (return_value=="true")
            {
               //execute code A
            }
         }
   }); 

}
于 2012-06-01T21:34:17.260 回答
0

您不能使用 async:false 执行此操作,这将导致浏览器挂起,直到请求完成。与其尝试使用 async:false,我敦促您考虑重新设计您的项目,使其异步工作。

于 2012-05-30T14:37:25.400 回答