Javascript:抑制“停止运行此脚本?”,或者如何使用setTimeout?

时间:2009-12-18 00:59:09

标签: javascript

我正在构建一个读取二进制文件的js库,包括zip文件。

因为对二进制数据数组没有直接的本机支持,所以当zip文件变大时,必须进行大量复制(See my other question以获取详细信息)。

这导致“停止运行此脚本?”警报。现在,我知道如果存在无限循环会发生这种情况,但在我的情况下,它不是无限循环。这不是程序中的错误。它只需要一个loooooong时间。

我该如何压制这个?

5 个答案:

答案 0 :(得分:4)

此消息是出于安全原因启用的,因为否则您只需使用简单的永不停止循环来阻止用户浏览器。我认为无法停用它。

考虑将处理拆分为serval部分,并通过setTimeout安排它们,这应该压制消息,因为脚本现在不是一直在运行。

答案 1 :(得分:3)

您可以将流程划分为增量,然后使用setTimeout添加一个小延迟。

答案 2 :(得分:2)

在IE(也可能是Firefox)中,消息基于执行的语句数量,而不是运行时间。如果你可以将一些处理拆分成一个单独的函数,并用setTimeout推迟它,我相信它不会计入限制。

答案 3 :(得分:2)

...回答我自己的问题,所以我可以发布我用过的代码。

主要问题是,我正在使用readToEnd()方法读取文件的全部内容,该方法实际上一次读取一个字节。在阅读大文件时,花了很长时间。解决方案是异步读取,并分批读取。

这是我使用的代码:

readToEndAsync : function(callback) {
    _state = "";
    var slarge = "";
    var s = "";
    var txtrdr = this;

    var readBatchAsync = function() {
        var c = 0;
        var ch = txtrdr.readChar();
        while(ch != null) 
        {
            s += ch;c++;
            if(c > 1024) 
            {
                slarge += s;
                s = "";
                break;
            }
            ch = txtrdr.readChar();
        }
        if (ch!=null){
            setTimeout(readBatchAsync, 2);
        }
        else {
            callback(slarge+s);
        }
    };

    // kickoff
    readBatchAsync();
    return null;
},

并称之为:

textReader.readToEndAsync(function(out){
     say("The callback is complete");
     // the content is in "out"
});

答案 4 :(得分:0)

我相信此功能特定于Firefox和/或其他浏览器,它与javascript语言本身无关。

据我所知,你(程序员)无法在访问者的浏览器中停止它。