Le script ne répond pas de la boîte de dialogue s'affiche lorsque javascript thread prend trop de temps, trop complet. La modification du registre pourrait fonctionner, mais vous auriez à le faire sur tous les ordinateurs client. Vous pouvez utiliser un "récursive fermeture" comme suit pour résoudre le problème. C'est juste une structure de codage dans lequel vous permet de prendre une longue course pour la boucle et la transformer en quelque chose qui ne peu de travail, et de garder une trace là où il a laissé, ce qui donne à l'explorateur, puis continuer là où il l'avait laissé jusqu'à ce que nous avons fini.
La Figure 1, Ajouter cette Classe Utilitaire RepeatingOperation à votre fichier javascript. Vous n'aurez pas besoin de modifier ce code:
RepeatingOperation = function(op, yieldEveryIteration) {
//keeps count of how many times we have run heavytask()
//before we need to temporally check back with the browser.
var count = 0;
this.step = function() {
//Each time we run heavytask(), increment the count. When count
//is bigger than the yieldEveryIteration limit, pass control back
//to browser and instruct the browser to immediately call op() so
//we can pick up where we left off. Repeat until we are done.
if (++count >= yieldEveryIteration) {
count = 0;
//pass control back to the browser, and in 1 millisecond,
//have the browser call the op() function.
setTimeout(function() { op(); }, 1, [])
//The following return statement halts this thread, it gives
//the browser a sigh of relief, your long-running javascript
//loop has ended (even though technically we havn't yet).
//The browser decides there is no need to alarm the user of
//an unresponsive javascript process.
return;
}
op();
};
};
La Figure 2, Le code suivant représente votre code qui est à l'origine de la "arrêter l'exécution de ce script de dialogue", parce que ça prend autant de temps pour terminer:
process10000HeavyTasks = function() {
var len = 10000;
for (var i = len - 1; i >= 0; i--) {
heavytask(); //heavytask() can be run about 20 times before
//an 'unresponsive script' dialog appears.
//If heavytask() is run more than 20 times in one
//javascript thread, the browser informs the user that
//an unresponsive script needs to be dealt with.
//This is where we need to terminate this long running
//thread, instruct the browser not to panic on an unresponsive
//script, and tell it to call us right back to pick up
//where we left off.
}
}
Figure 3. Le code suivant est le correctif de la problématique de code dans la Figure 2. Avis de la boucle for est remplacé par un appel récursif à la fermeture qui repasse le contrôle du navigateur toutes les 10 itérations de heavytask()
process10000HeavyTasks = function() {
var global_i = 10000; //initialize your 'for loop stepper' (i) here.
var repeater = new this.RepeatingOperation(function() {
heavytask();
if (--global_i >= 0){ //Your for loop conditional goes here.
repeater.step(); //while we still have items to process,
//run the next iteration of the loop.
}
else {
alert("we are done"); //when this line runs, the for loop is complete.
}
}, 10); //10 means process 10 heavytask(), then
//yield back to the browser, and have the
//browser call us right back.
repeater.step(); //this command kicks off the recursive closure.
};
Adapté à partir de cette source:
http://www.picnet.com.au/blogs/Guido/post/2010/03/04/How-to-prevent-Stop-running-this-script-message-in-browsers