如何让javascript“呼吸”

时间:2013-03-05 21:01:37

标签: javascript jquery freeze

我有一些javascript / jquery代码(对于内部网站),它在大型表上进行了大量的客户端处理。它运行得有点慢,但没关系。

问题是它在运行它需要做的循环时会冻结浏览器。这有两个不受欢迎的影响:

  1. 处理微调器(动画gif,但我也尝试过spin.js并且有相同的问题)冻结。
  2. 如果表格中有足够的行,则循环需要很长时间,浏览器会报告无响应的脚本
  3. 有没有办法可以在代码中使用某种“呼吸”语句,这样每次(比如说)100次迭代,它会暂停让旋转器旋转,浏览器知道脚本仍在使用它?像(伪代码):

    for (i=0;i<20000;i++)
    {
        fnProcessRow();
        if (i % 100 == 0) breath();
    }
    

3 个答案:

答案 0 :(得分:1)

分解你的javascript的一种方法是将你的处理分成块并使用setTimeout()来执行下一个&#34; chunk&#34;

如果您需要一些代码来告诉我我的意思,请告诉我。

答案 1 :(得分:1)

没有设置方法,因为它非常依赖于您的代码。像这样的东西会起作用:

fnProcessRows(0, 10000);

function fnProcessRows(start, end) {
    /* do row processing */

    if (end < totalRows) {
        setTimeout(function () {
            fnProcessRows(start + 10000, end + 10000);
        }, 1000);
    }
});

这将处理10000行,中间间隔一秒。这可能具有潜在的奇怪副作用,例如用“未处理”行显示“已处理”行,这可能是不合需要的。如果不是,那么这应该是一个非常简单的解决方案来帮助。

如果仍然没有响应,你当然可以将10000减少到其他东西;它应该在很短的时间内没有响应,用户很难注意到。

答案 2 :(得分:0)

请参阅this question

如果您不想使用setTimeout / setInterval路由,请尝试添加:

if (i % 100) { $("selector for your animated image").width(); }

在一些(大多数?)浏览器上强制它重新布局和渲染。