当javascript脚本运行时,IE不会呈现更改

时间:2009-09-25 18:07:29

标签: javascript loops

我有一个相当长时间运行的javascript代码,它为文档添加了一个新的“div”元素。看起来在IE中,只有在脚本完成后才会呈现此更改,而在FF中则不是这样。

知道如何让它发挥作用吗?这个脚本实际上应该永远运行,有点像“主循环”。

4 个答案:

答案 0 :(得分:2)

我会避免使用持久的,不断运行的脚本。如果您需要定期在定期计划中执行操作,请使用Window.SetTimout / SetInterval。否则,请使用事件。有很多JS框架,比如Mootools,它可以很容易地实现你自己的自定义事件,这将消除对“主循环”的需求。

http://mootools.net/

答案 1 :(得分:1)

不要使用经常运行的脚本,JavaScript不应该像这样使用。使用基于事件的代码或基于调度程序的代码。我很确定如果你有一个不断运行的脚本,你会触发一些浏览器中的“此页面上的某些脚本需要花费相当长的时间来运行”类型的弹出窗口。这不应该是预期的行为。

答案 2 :(得分:1)

  

这个脚本实际上应该永远运行,有点像“主循环”。

你不能用JavaScript做到这一点。在您控制执行线程的同时,浏览器无法执行任何操作,例如检查点击次数。在这种状态下,浏览器没有响应,可能看起来已经崩溃。最终,大多数浏览器会弹出一个警告,提示脚本播放效果不佳,并给用户一个单击按钮以毫不客气地将其删除。

相反,您必须正常将控制权返回给浏览器,并要求它稍后使用window.setTimeout(function, delay)进行一次性回复或window.setInterval(function, period)让其一直回拨经常。您希望通过调用维护的任何状态都必须存储在全局变量或实例变量中。

答案 3 :(得分:1)

此行为的原因是Internet Explorer重新绘制DOM更改窗口的方式;换句话说,这是由于reflow

除非我弄错了,否则IE会将重排任务排队,并在脚本线程完成执行后对其执行操作。如果你编写代码永远不会停止线程,那么reflow永远不会发生,你永远不会想象DOM中的变化。

其他人建议的替代方法 - 使用window.setTimeout()和window.setInterval()是可行的,并且有助于解决问题,因为浏览器可以使用简短的暂停来处理重排任务。


您会发现此related SO question on when reflow occurs非常有用。