【问题标题】:JavaScript Script Taking Too Long to Execute. Getting the Script Taking Too Long PromptJavaScript 脚本执行时间过长。获取脚本提示时间过长
【发布时间】:2012-05-09 20:16:14
【问题描述】:

我有一个 JavaScript 函数 buildTable,它可以构建一个很长的 HTML 表格。

 function buildTable() {

                for (var i = 0; i < rowCount; i++) {

     .. code to create table

}

}

buildToolsetTable 花费了太多时间,几秒钟后 IE 7 显示提示,如果我想继续运行脚本。我读到我可以使用 window.setTimeout 进行另一个调用并刷新执行,但如果有人有实现,那么它将非常有帮助。

【问题讨论】:

  • 这个问题几乎没有问题......你能再发布一些代码吗?
  • @close voters - 根本问题是完全显而易见的 - 只是措辞不好。

标签: javascript


【解决方案1】:

你需要这样的东西,将循环分解成一个单独的函数,每次迭代都会调用它:

(function(n) {
    var i = 0;

    function doWork() {
        // do one row's worth of stuff here
        ...

        if (++i < n) {
            setTimeout(doWork, 0);
        } else {
            // do your tidy up here
            ...
        }
    }

    doWork(); // start the first iteration
})(rowCount);

调用setTimeout() 将允许浏览器在您自己的代码中散布UI 事件处理。

http://jsfiddle.net/alnitak/8wXTT/

为了增加乐趣,制作单次迭代并整理函数回调,这样您就可以使这段代码独立并只需传入所需的参数。

【讨论】:

  • 在 doWork() 内部我有一个循环遍历所有行。我怎么能打破它。我会不会松开循环的索引位置。
  • @Alnitak setInterval - 确定吗?这将创建rowCount“计时器”,它将尽快调用doWork,直到窗口关闭。 setTimeout 应该是更好的选择
  • @azamsharp “做一些事情”是你在其中进行一个循环迭代
  • @Alnitak 非常感谢!该问题已解决,但我遇到了其他一些与索引相关的问题。我会检查他们。感谢您的帮助!
  • @Alnitak,我喜欢这个解决方案,但我不完全理解你所说的整理是什么意思。这会保留对所有计时器的引用(setTimeout 的返回值)并在else 块中“null'ing”它们吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2015-11-19
  • 2017-12-04
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2013-10-25
相关资源
最近更新 更多