如何在IE中立即通过javascript设置样式

时间:2010-06-08 07:37:47

标签: javascript css internet-explorer

最近我遇到了IE的问题。我有一个功能

function() {
    ShowProgress();
    DoSomeWork();
    HideProgress();
}

其中ShowProgress和HideProgress只是使用jQuery的css()方法操纵'display'CSS样式。

在FF中一切正常,同时我将显示属性更改为阻止,出现进度条。但不是在IE中。在我离开函数时,在IE中应用了样式。这意味着它从未显示过,因为在函数结束时我只是隐藏它。 (如果我删除了HideProgress行,则在完成执行函数后会立即显示进度条(更准确地说,当调用函数结束时立即显示 - 因此IE中没有其他内容发生))。

有人遇到过这种行为吗?有没有办法让IE立即应用这种风格?

我已经准备好了解决方案但是我需要一些时间来实现它。我的DoSomeWork()方法正在进行一些AJAX调用,现在这些调用是同步的。我认为让它们异步会解决问题,但我必须重新设计一下代码,所以找到一个解决方案只是为了立即应用这个样式会更简单。

谢谢rezna

2 个答案:

答案 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。