Как справиться со сценарием на этой странице, из-за которого Internet Explorer работает медленно?

Из javascript я вызываю веб-метод. В IE, если я передам этому веб-методу огромный параметр, появится предупреждение «Прекратить запуск этого скрипта? Сценарий на этой странице замедляет работу Internet Explorer».

Можно ли обработать нажатие кнопки «Да», чтобы, если пользователь решит отменить выполнение скрипта, я мог запустить какой-то альтернативный скрипт (в этом случае мой «альтернативный» скрипт состоит в закрытии некоторого индикатора выполнения, который я просто всплываю перед запуском долговременного сценария).

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


person pierre    schedule 18.04.2011    source источник
comment
У вас может быть отдельная функция, которая периодически проверяет, действительно ли работа продолжается или нет.   -  person JohnP    schedule 18.04.2011
comment
В стандартном JS вы на самом деле не могли; работа выполняется синхронно в однопоточном режиме, поэтому отдельная функция не будет выполняться до тех пор, пока не будет выполнена первая, что было бы слишком поздно.   -  person Chris Moschini    schedule 19.04.2011


Ответы (1)


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

Суть в том, чтобы разбить работу на относительно предсказуемые части работы (предсказуемые с точки зрения процессорного времени) и запустить их в setInterval, например:

function doWork(begin, end) {
    // Some chunk of what your worker function normally does from begin to end

    if (actualEnd < end) // Nothing left to do
        clearInterval(Interval);
}

var Interval = setInterval(doWork, 15);

Это предотвращает появление приглашения IE (или Chrome от представления диалогового окна «Заморозить»). Следующим шагом является добавление кода, позволяющего пользователю полностью его пропустить; если объем работ известен в начале, спросите их сразу. Если нет, начните обработку и после n фрагментов спросите их, не хотят ли они выполнить более дешевую функцию.

Есть 2 других варианта выполнения такого большого объема работы:

  1. Заранее посмотрите, сколько работы предстоит сделать, и если ее много, передайте ее на сервер (это, к сожалению, означает повторную запись вашего JS на сервере; конечно, вы можете использовать серверный движок, который запускает Javascript, чтобы сохранить самостоятельно кодировать).
  2. Используйте фоновые рабочие процессы из Google Gears/HTML5.

Наконец, если вы выполняете такую ​​большую работу по запросу, вероятно, есть возможности для ускорения выполняемой вами работы — данные могут быть заранее проиндексированы на сервере, чтобы сделать вычисления быстрее/упрощенными, и тому подобное. Но я не знаю, что вы считаете.

person Chris Moschini    schedule 19.04.2011