7

所以我有这个:

$('.something').click(function(){
          $('body').html('');

          $.ajax({
            url: 'someurl',
            dataType: 'json',
            async: false,
            success: function(data){
              //do stuff
              alert('yo');
            }
          });

          return false;   
});

在 Firefox 中,正文会在正确发出“哟”警报之前变为空白……但在 Chrome 中,即使在 $('body').html(' ') 调用是在 ajax 之前执行的......这是由于设置为 false 的异步设置......如果它是真的,它也将在 chrome 中正常工作

有没有办法在 Chrome 中正确调用 ajax 之前调用 $('body').html() 调用,同时保持异步标志设置为 false?

此外,最好不必设置超时

4

2 回答 2

6

您确定您已经看到在使用该代码进行 AJAX 调用之前页面变为空白吗?这不应该在任何浏览器中发生。

脚本运行时浏览器窗口根本不会更新,因此同步调用将阻止所有更新。

要在 AJAX 调用之前更新浏览器,请使用setTimeout,这将在发送请求之前将控件返回给浏览器:

$('.something').click(function(){
  $('body').html('');

  window.setTimeout(function() {

    $.ajax({
      url: 'someurl',
      dataType: 'json',
      async: false,
      success: function(data){
        //do stuff
        alert('yo');
      }
    });

  }, 0);

  return false;   
});

注意:这当然意味着您不能在函数的返回值中使用请求的结果,如果这是同步调用的意图。如果需要事件处理程序同步,则不能在 AJAX 请求之前更新浏览器。

于 2012-09-11T17:57:23.080 回答
1

引用自http://api.jquery.com/jquery.ajax/

async (默认:true) 类型:Boolean 默认情况下,所有请求都是异步发送的(即默认设置为true)。如果您需要同步请求,请将此选项设置为 false。跨域请求和 dataType: "jsonp" 请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用 async: false ;您必须使用成功/错误/完成回调选项而不是 jqXHR 对象的相应方法,例如 jqXHR.done() 或已弃用的 jqXHR.success()。

也许你可以试试这个:用$.ajax beforeSend: function () {}

$('.something').click(function() {  
    $.ajax({
        url: 'someurl',
        dataType: 'json',
        async: false,
        beforeSend: function (){
          $('body').html('');
        },
        success: function(data){
          //do stuff
          alert('yo');
        }
    });

    return false;   
});
于 2014-01-05T20:56:06.003 回答