Из javascript я вызываю веб-метод. В IE, если я передам этому веб-методу огромный параметр, появится предупреждение "Прекратить запуск этого скрипта? Сценарий на этой странице замедляет работу Internet Explorer".
Можно ли обработать нажатие кнопки "Да", чтобы, если пользователь решит отменить выполнение скрипта, я мог запустить какой-то альтернативный скрипт (в этом случае мой "альтернативный" скрипт состоит в закрытии некоторого индикатора выполнения, который я просто всплываю перед запуском долговременного сценария).
Я видел много сообщений, объясняющих, как предотвратить отображение этого предупреждения, но я не хочу останавливать отображение предупреждения: я просто хочу иметь возможность обрабатывать случай, когда пользователь решает остановить выполнение скрипта.
Ответ 1 · рейтинг 4 · Chris Moschini
Я имел дело с этим раньше во внутреннем приложении, где им было все равно, сколько времени потребуется браузеру, чтобы обработать числа, они просто не хотели нажимать на приглашение.
Суть в том, чтобы разбить работу на относительно предсказуемые части работы (предсказуемые с точки зрения процессорного времени) и запустить их в 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 других варианта выполнения такого большого объема работы:
- Заранее посмотрите, сколько работы предстоит сделать, и если ее много, передайте ее на сервер (это, к сожалению, означает повторную запись вашего JS на сервере; конечно, вы можете использовать серверный движок, который запускает Javascript, чтобы сохранить самостоятельно кодировать).
- Используйте фоновые рабочие процессы из Google Gears/HTML5.
Наконец, если вы выполняете такую большую работу по запросу, вероятно, есть возможности для ускорения выполняемой вами работы - данные могут быть заранее проиндексированы на сервере, чтобы сделать вычисления быстрее/упрощенными, и тому подобное. Но я не знаю, что вы считаете.