2009-09-25 121 views
1

我有一个相当长的运行JavaScript代码添加一个新的“div”元素到文档。它看起来像在IE中,只有在脚本完成后才会呈现此更改,而FF中则不是这种情况。IE浏览器不会呈现更改,而JavaScript脚本运行

任何想法如何使它工作?这个脚本实际上应该是永远运行的,一种“主循环”。

回答

2

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

http://mootools.net/

+0

不过,有一个“主循环”或它根本不应该工作是不好的做法? P.S.我有一个非常简单和非常具体的案例,使用循环而不是基于任何事件的框架实现起来要简单得多。这就像循环中的5行代码,至少有几十个事件... – Demiurg 2009-09-25 18:14:38

+0

据我所知,它不会工作。脚本引擎还不是多线程的......它们与页面同时运行。目前正在做一些工作来支持网络线程,但速度很慢,并且可能要经过足够多的时间才能实现。这也是一种不好的做法。浏览器是主循环,你不应该试图创建自己的。您应该对由页面内容触发的事件做出响应。 – jrista 2009-09-25 18:17:35

+0

@Demiurg - 正如你发现的那样,它在一些JS引擎中不起作用。切换到超时很容易,但是...只要改变'while(true){/ * code * /;例如,''to'(function loop(){/ * code * /; window.setTimeout(loop,100);})();' – 2009-09-25 18:21:19

1

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

1

这个脚本实际上应该是永远运行,一种“主循环”。

你不能在JavaScript中这样做。在控制执行线程的同时,浏览器无法执行任何操作,例如检查点击。在这种状态下,浏览器无响应,并且可能看起来已经崩溃。最终大多数浏览器都会弹出一个警告,提示该脚本播放不好,并给用户一个按钮,以便不经意间将其关闭。

取而代之,您必须像平常一样将控制权返回给浏览器,并要求它在稍后使用window.setTimeout(function, delay)作为一次性回调或window.setInterval(function, period)以便每隔一段时间保持回拨。您希望通过调用维护的任何状态都必须存储在全局变量或实例变量中。

1

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

除非我弄错了,否则IE会排队重排任务,并在脚本线程执行完毕后对其执行操作。如果您编写的代码永不停止线程,则永远不会发生重排,并且您永远不会看到DOM中的更改。

其他人建议的替代方法 - 使用window.setTimeout()和window.setInterval()是可行的,并且将有助于解决由于浏览器可用于执行重排任务的短暂暂停而导致的问题。


你会发现这个related SO question on when reflow occurs是有用的。

相关问题