Как предотвратить «Сценарий на этой странице вызывает медленную работу Internet Explorer», не изменяя MaxScriptStatements в реестре? - PullRequest
3 голосов
/ 06 августа 2009

Мы используем элементы управления картами JavaScript Bing и / или Google, иногда с большим количеством динамически изменяемых наложений.

Я прочитал http://support.microsoft.com/kb/175500/en-us и знаю, как установить раздел реестра MaxScriptStatments.

Проблема в том, что мы не хотим программно устанавливать этот или любой другой ключ реестра на компьютерах пользователей, а скорее хотим добиться того же эффекта другим способом.

Есть ли другой способ?

Ответы [ 2 ]

5 голосов
/ 06 августа 2009

Едва ли что-нибудь, что вы можете сделать, кроме как сделать ваш сценарий "легче". Попробуйте профилировать его и выяснить, где происходит самое тяжелое сжатие, затем попытайтесь оптимизировать эти части, разбить их на более мелкие компоненты, вызвать следующий компонент с таймаутом после завершения предыдущего и так далее. По сути, время от времени возвращайте управление браузеру, не разбирайте все в одном вызове функции.

1 голос
/ 17 июля 2014

Обычно в коде, который зацикливается, встречается долго работающий скрипт.

Если вам нужно перебрать большой набор данных, и это можно сделать асинхронно - сродни другому потоку, затем перенесите обработку на веб-работника (http://www.w3schools.com/HTML/html5_webworkers.asp).

Если вы не можете или не хотите использовать веб-работника, вы можете найти свой основной цикл, который вызывает долго выполняющийся скрипт, и можете дать ему максимальное количество циклов, а затем заставить его возвращаться клиенту, используя setTimeout .

Плохо: (thingToProcess может быть слишком большим, что приводит к длительному запуску скрипта)

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

Хорошо: (допускается только 100 итераций до возврата)

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);
}

Оба могут быть вызваны одинаково:

Process(myCollectionToProcess);
...