起因: 需求是日历中选择不同日期,请求一次ajax,返回大量数据的时候会有页面卡顿的错觉,错觉来自页面效果一直不出现,直到数据即将完成渲染前出现一瞬间;
假死原因: 浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程)都会停止下来。即使我的DOM操作语句是在发起请求的前一句,这个同步请求也会“迅速”将UI线程阻塞,不给它执行的时间。这就是代码失效的原因;
解决办法: 使用1.5版以后的jQuery,1.5版以后的jQuery引入了Deferred对象,用Deferred对象替代async:false;
代码如下:
var defer = $.Deferred(); $.ajax({url : 'xxx', //async : false,//原来设置的同步要注释掉success: function(backData){defer.resolve(backData)} }); return defer.promise();