5

假设我有这个 javascript 函数:

   function pauseComp(ms) {
     var date = new Date();
     var curDate = null;
     do { curDate = new Date(); }
     while(curDate-date < ms);
    }

和一个 css3 动画(例如,<i class="icon-spinner icon-spin"></i>来自新的font-awesome 3)。当我运行上面的 javascript 函数时,它会在函数运行时停止微调器。看看我在说什么。基本上,javascript 会停止 css 动画,我想知道为什么,或者是否有其他人注意到这一点/找到了解决方法。我尝试将它放在 setTimeout(fn,0) 中,其中 fn 是长进程,但后来意识到为什么这也不起作用(js 不是多线程的)。有人见过这种情况吗?

更新:有趣的是,这在 Safari 中似乎不是什么大问题,尽管与浏览器界面的交互仍然受到影响。

4

1 回答 1

5

浏览器页面是单线程的。更新 UI 发生在与您的 javascript 程序相同的线程上。这也意味着在执行 Javascript 代码时任何动画都不会绘制新帧。通常,这没什么大不了的,因为大多数 JS 代码执行得非常快,比单个动画帧还快。

所以最好的建议就是:不要那样做。不要长时间锁定 JS 引擎。找出一种更清洁的方法来做到这一点。


但是,如果必须,有办法。您可以通过HTML5 的 Web Workers API获得额外的线程。旧版浏览器不支持此功能,但它允许您从主网页和它自己的线程中运行一些长时间运行的 CPU 吸收代码,然后让它在完成后将一些结果回传到您的页面。

于 2013-01-16T20:34:22.520 回答