【问题标题】:How to render DOM changes inside intensive task?如何在密集任务中渲染 DOM 更改?
【发布时间】:2014-01-02 12:12:23
【问题描述】:

我正在运行O(N^4) 任务。不谈论细节 - 我想在第一个循环中更新 DOM。 伪代码是这样的:

for (var a = 0; a < lim; a++) {
  updateDOM();

  for (var a = 0; a < lim; a++) {
    for (var a = 0; a < lim; a++) {
      for (var a = 0; a < lim; a++) {
        ...
      }
    }
  }
}

现在的问题是 updateDOM() 被调用但从未呈现适当的 DOM 更改。所有计算都需要几秒钟。

我的解决方案:

  • 使用网络工作者
  • 设置超时

我没有测试过它们中的任何一个,但怀疑它们是否能解决问题。在这种情况下,我将不胜感激。

【问题讨论】:

  • 嗯。为什么对所有循环使用相同的变量?这不会导致不良行为或无限循环吗?
  • 这只是一个演示伪代码。这就是为什么

标签: javascript css google-chrome dom


【解决方案1】:

两者都应该解决问题。问题是只要脚本正在运行,浏览器中就不会发生任何其他事情。在您的函数结束之前,浏览器不会显示任何更新。

使用setTimeout,您只需退出您的功能,让浏览器显示更新,然后让超时重新启动您的功能,以便您可以从中断处继续。

例子:

function loop(a) {
    for (var b = 0; b < 10000000; b++) {}
    $('div').text(a);
    a++;
    if (a < 1000) {
        window.setTimeout(function(){ loop(a); }, 0);
    }
}

loop(0);

演示:http://jsfiddle.net/Guffa/47FMM/

【讨论】:

  • 谢谢。可能会实现这个方法
  • 您能否再详细说明一下?浏览器会在循环中暂停 DOM 渲染还是什么?还是对cpu有阈值之类的?
  • @lukas.pukenis:Javascript 是严格的单线程(后台工作人员除外)。只要脚本正在运行,浏览器界面就不会发生任何事情。没有处理任何事件,页面没有更新,甚至动画 gif 也没有动画。
  • 谢谢!完全忘了js的事件模型!
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多