大量の処理により、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>