如何防止慢速脚本警告并强制浏览器继续运行脚本直到完成?

Tyl*_*coe 8 javascript


更新(2013年7月5日):

自从我最初提出这个问题以来,我学到了很多东西.在下面的一条评论中,有人建议我重新处理任务并找到解决问题的方法,而不会有阻止UI的风险.我说这是不可能的,函数必须按原样运行.我实际上并不记得我试图通过该功能完成的任务,但我确信评论者是对的,我错了.如果您偶然发现这个问题并且处于与我相似的情况,那么请认真考虑您的方法存在缺陷的可能性.

您可能还想查看Web工作者.

这是您可以期待它们工作的地方.


原始问题:

我不会过于具体地解决我的问题,而是保持这种通用性,以便其他偶然发现它的人可以发现它很有用.

我有一个函数接受一个参数,一个字符串.如果字符串很短,则函数运行正常并及时完成.但是,如果传入的字符串太长,脚本会运行一段时间,那么最终会超时并返回浏览器的慢脚本对话框,允许用户终止脚本.

我想防止这种情况发生,所以脚本可以继续到它的终点.

如何才能做到这一点?

旁注:如果我能够正常工作,我还想创建一个状态栏,类似于加载gmail时看到的状态栏,这样用户就知道事情正在发生.

谢谢!

Fel*_*ino 6

您可以尝试不完全阻止UI并使其在"另一个线程"中运行setTimeout.

window.setTimeout(function() { ... code ... }, 0);
Run Code Online (Sandbox Code Playgroud)

我说"在另一个线程中"因为JS中没有真正的多线程,这里有一篇很好的文章


编辑:(使这个答案更新与Web技术最新)

您还可以使用HTML 5 Web Workers,具体取决于您要定位浏览器


jAn*_*ndy 5

你无法通过脚本在任何浏览器中禁用该行为.想象一下影响,禁用该功能并调用while(1).很糟糕.

您可以创建不会阻止浏览器"太久"的代码.如果最佳实践模式有一吨.我总是建议尝试将你的algorythm分解成更小的块.将它与失控计时器和循环结合起来,确保任何操作的运行时间不超过100毫秒(例如).

var sequence = ['foo', 'bar', 'baz', 'base', 'ball', 'hello', 'world', '100k more'],
    start = Date.now();

setTimeout(function _worker() {
    do {
       var element = sequence.shift();
       // do something with element
    } while( sequence.length && (Date.now() - start < 100) );

    if( sequence.length )
        setTimeout(_worker, 25);
}, 25);
Run Code Online (Sandbox Code Playgroud)