最近我遇到了IE的问题。我有一个功能
function() {
ShowProgress();
DoSomeWork();
HideProgress();
}
其中ShowProgress和HideProgress只是使用jQuery的css()方法操纵'display'CSS样式。
在FF中一切正常,同时我将显示属性更改为阻止,出现进度条。但不是在IE中。在我离开函数时,在IE中应用了样式。这意味着它从未显示过,因为在函数结束时我只是隐藏它。 (如果我删除了HideProgress行,则在完成执行函数后会立即显示进度条(更准确地说,当调用函数结束时立即显示 - 因此IE中没有其他内容发生))。
有人遇到过这种行为吗?有没有办法让IE立即应用这种风格?
我已经准备好了解决方案但是我需要一些时间来实现它。我的DoSomeWork()方法正在进行一些AJAX调用,现在这些调用是同步的。我认为让它们异步会解决问题,但我必须重新设计一下代码,所以找到一个解决方案只是为了立即应用这个样式会更简单。
谢谢rezna
答案 0 :(得分:1)
同步请求会阻止整个UI,这很糟糕。你的假设是正确的,但是如果你想继续沿着这条道路走向$地狱的内圈,试试这个:
function () {
ShowProgress();
window.setTimeout(function () {
DoSomeWork();
HideProgress();
}, 0);
}
请注意,我没有测试过这个。如果您还没有看到任何内容,请尝试使用超时值(目前为0
)。
答案 1 :(得分:0)
尝试将HideProgress方法抛出到setTimeout中。例如:
function() {
ShowProgress();
DoSomeWork();
setTimeout(HideProgress,0);
}
即使延迟假定是0毫秒,这也会产生将HideProcess方法抛到队列末尾的净效果,并可能为浏览器提供所需的呼吸空间。
[编辑]我应该提到,如果你经常快速地调用这个方法,这个方法确实有一个缺点:竞争条件。当另一个DoSomeWork()正在执行时,您可能最终执行先前的超时。如果DoSomeWork需要很长时间才能完成,将会发生 。如果这是一个风险,您可能希望为进度条实现一个计数器,并且只有在启动它的计数器与计数器的当前值相同时才执行HideProgress。