0

我遇到了一个问题,即大量处理导致 IE8 中的无响应脚本错误(不,我不能让用户使用更好的浏览器)。

然后我读到应该可以在验证的不同部分之间拆分任务并将控制权交还给浏览器。所以我决定根据我发现的一些代码做一个简单的例子来找出断点在哪里。真正的代码是做大量的 jquery 验证引擎处理。

我尝试使用 jsFiddle,但无法让 jsFiddle 在 IE8 中运行。真可惜。所以,我将不得不在这里分享内联。

当我第一次加载它时,它似乎工作得很好。我按下按钮,两个功能都没有问题地完成。但是,后续推送会导致无响应的脚本错误。我在我的模拟工作函数中玩弄了循环数。超过 125 万个循环,它会因无响应的脚本而死。

对 onClick 的单独调用不应该重新启动无响应的计数器吗?我在这里想念什么?

<html>
<head>
<script>

var progress = null;
var goButton = null;

window.onload = function() {
    progress = document.getElementById("progress");
    goButton = document.getElementById("goButton");
}

function runLongScript(){
    // clear status
    progress.value = "";
    goButton.disabled=true;

    var tasks = [function1, function2];

    multistep(tasks,null,function() {goButton.disabled=false;});

}

function function1() {

    var result = 0;

    var i = 1250000;
    for (;i>0; i--) {
        result = result + 1;
    }

    progress.value = progress.value + "f1 end ";
}

function function2() {

    var result = 0;

    var i = 1250000;
    for (;i>0; i--) {
        result = result + 1;
    }

    progress.value = progress.value + "f2 end";
}

function multistep(tasks, args, callback){
    var tasksClone = tasks.slice(0); //clone the array

    setTimeout(function(){

        //execute the next task
        var task = tasksClone.shift();

        task.apply(null, args || []);

        //determine if there's more
        if (tasksClone.length > 0){
            setTimeout(function () {
               multistep(tasksClone, args, callback);
            }, 100);
        } else {
            callback();
        }
    }, 100);
}

</script>
</head>

<body>
    <p><input type="button" id="goButton" onClick="runLongScript();" value="Run Long Script" /></p>
    <input type="text" id="progress" />
</body>

</html>
4

1 回答 1

0

clearTimeout()当按钮已被按下时,您永远不会调用删除当前正在运行的那个。在开始另一个之前添加一个 if 语句setTimeout并检查一个是否已经在运行,如果是则清除它,然后继续。如果您有任何问题,这里有一个链接可以帮助您:https ://developer.mozilla.org/en-US/docs/Web/API/window.clearTimeout

于 2013-07-23T20:52:32.443 回答