IE8中的setTimeOut和非响应脚本问题

时间:2013-07-23 18:44:18

标签: javascript internet-explorer-8 settimeout

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

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

我尝试使用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>

1 个答案:

答案 0 :(得分:0)

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