无论如何,我们想要能够在请求发出之前进行样式更改(具体来说,像Google搜索那样覆盖屏幕,半透明白色),然后在结果返回时将其取消。基本上看起来像这样:
load:function(url) {
....
busyMask.className="Shown"; //display=block; absolute positioned full screen semi-transparent
var dta=$.ajax({type:"GET",dataType:"json",url:url,async: false}).responseText;
busyMask.className="Hidden"; //sets display=none;
...
return JSON.parse(dta);
}
众所周知,同步请求会锁定用户界面。因此,不足为奇的是,在Safari和Chrome中白色遮罩从未出现过(有趣的是,在Firefox中出现了)。我尝试减缓响应速度并使用粉色遮罩,以使其非常明显,但它直到请求完成后才更新UI。如果省略'busyMask.className="Hidden"'部分,将显示遮罩-但只有在ajax请求完成后才会显示。
我看到很多强制UI重新绘制的技巧(例如为什么Google Chrome中的同步AJAX请求不起作用?,http://ajaxian.com/archives/forcing-a-ui-redraw-from-javascript),但它们似乎都与试图显示实际的“永久”DOM或样式更新有关,而不是在进行同步请求时暂时显示样式更改。
那么有没有办法做到这一点,或者我正在进行一场失败的战斗?也许我们只需要针对最差表现的请求逐个切换为异步请求,这可能是解决学习曲线问题的不错方式...但我希望能在这里得到一个非传统的答案。