2009-08-05 4 views
3

Wir verwenden Bing und/oder Google Javascript Map Controls, manchmal mit einer großen Anzahl dynamisch veränderbarer Overlays.So verhindern Sie "Ein Skript auf dieser Seite führt dazu, dass Internet Explorer langsam ausgeführt wird", ohne MaxScriptStatements in der Registrierung zu ändern?

Ich habe http://support.microsoft.com/kb/175500/en-us gelesen und weiß, wie man den Registrierungsschlüssel MaxScriptStatments setzt.

Problem ist, dass wir diesen oder einen anderen Registrierungsschlüssel nicht programmgesteuert auf den Computern der Benutzer festlegen möchten, sondern den gleichen Effekt auf andere Weise erzielen möchten.

Gibt es einen anderen Weg?

Antwort

5

Kaum etwas, was Sie tun können, außer Ihr Skript "leichter" zu machen. Versuchen Sie, es zu profilieren und herauszufinden, wo das härteste Knirschen stattfindet, dann versuchen Sie, diese Teile zu optimieren, sie in kleinere Komponenten aufzuteilen, rufen Sie die nächste Komponente mit einer Zeitüberschreitung auf, nachdem die vorherige beendet wurde und so weiter. Im Grunde geben Sie die Kontrolle immer wieder an den Browser zurück, knacken Sie nicht alles in einem Funktionsaufruf.

+0

Das ist in der Tat der einzige Weg, aber manchmal kann dies schwierig sein, wenn der Code recu ist rsive. –

1

Im Allgemeinen wird ein lang laufendes Skript in Code gefunden, der eine Schleife ausführt.

Wenn Sie eine große Datensammlung durchlaufen müssen und sie asynchron - ähnlich wie bei einem anderen Thread - ausgeführt werden kann, verschieben Sie die Verarbeitung an einen Webworker (http://www.w3schools.com/HTML/html5_webworkers.asp).

Wenn Sie keinen Webworker verwenden können oder wollen, können Sie Ihre Hauptschleife finden, die das lange laufende Skript verursacht, und Sie können ihm eine maximale Anzahl von Schleifen geben und sie dann mit dem Client zurückgeben setTimeout.

Bad: (thingToProcess zu groß sein kann, in einem langen laufenden Skript resultierenden)

function Process(thingToProcess){  
    var i; 
    for(i=0; i < thingToProcess.length; i++){ 
     //process here 
    } 
} 

Gut: (erlaubt nur 100 Iterationen, bevor sie wieder nachgebend) kann

function Process(thingToProcess, start){  
    var i; 
    if(!start) start = 0; 
    for(i=start; i < thingToProcess.length && i - start < 100; i++){ 
     //process here 
    } 
    if(i < thingToProcess.length) //still more to process 
     setTimeout(function(){Process(thingToProcess, i);}, 0); 
} 

Sowohl in heißen Derselbe Weg: