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