![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Остановить выполнение сценария?
Сценарий на этой веб-странице замедляет работу IE. и т.д. ... Такое сообщение иногда можно видеть для своего скрипта, вопрос в том как избежать подобного, не теряя при этом функциональность самого скрипта? Это не window.onerror = null; это система притормаживает. Отвечая "продолжить" работа скрипта завершается с отличным результатом, да и само такое сообщение не всегда выскакивает, примерно в половине случаев при тестировании, но для сайта ведь эти сообщения просто недопустимы. Это сообщение отредактировал(а) Сisa - 28.8.2014, 09:47 |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Скорее всего поможет простой рефакторинг кода. while (i++ < 1000000000) - допустимый код, но тормозить браузер он будет.
|
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Рефакторинг:
признаки плохого кода - посмотрел перечень как бы не очень подходит в моем скрипте, методы - интересно, но уж больно серьезно, программы - как бы ими воспользоваться... |
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Chrome и FF отлично справляются и не тормозят расчеты, даже если сложность их вычисления изначально увеличить (точность, размерность, количество) более чем в 10 раз. IE8 - виноват, потому что IE! Похоже рефакторинг ему что .. припарка.
|
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Зависит от кода. Без него - только пальцем в небо. Существует масса хаков именно для ИЕ, так что однозначно крест на нем ставить не стоит.
|
|||
|
||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 2 Всего: 4 |
Насколько я понял, речь идет о тяжелых и длительных расчетах, выполняющихся "в один прием". Вообще так делать некрасиво: из-за однопоточности интерпретатора яваскрипта такой расчет блокирует обработку других событий (если они есть). Лучше разбить задачу на небольшие части, хранить текущее состояние расчетов в глобальной переменной и вынести расчеты в отдельную функцию. Если после обработки очередной части расчет еще не завершен, то функция сохраняет промежуточный итог и устанавливает короткий таймаут, который вызывает эту же функцию. Тогда у гипотетических событий будет шанс отработать без лишних задержек, и браузер перестанет ругаться.
|
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Короткий таймаут скорее всего очень полезная будет штука, не в этот раз так в следующий. Хочу уяснить такую деталь:
"Если после обработки очередной части расчет еще не завершен, то функция сохраняет промежуточный итог и устанавливает короткий таймаут..." - этот таймаут происходит автоматически? т.е. перед вызовом очередной js функции, операционная система может перехватывать управление и выполнять какие то свои иные неотложные задачи? Или же надо сеттаймеаут писать самому? Если сеттаймеаут, то время конечно можно писать минимальное 10-12, и тем не менее суммарное время выполнения всего скрипта вырастет, но зато не будет проблем с IE. ("в один прием" - ну да, выполнение задачи начинается одной функцией, она уже сама пользуется еще несколькими, в т.ч. с циклами, и те с свою очередь используют еще..., примерно так сейчас) Это сообщение отредактировал(а) Сisa - 29.8.2014, 15:27 |
|||
|
||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 2 Всего: 4 |
Нужно писать самому. Просто добавить setTimeout() в обработчике. Интерпретатор никак не может прервать обработчик события (тело тега <script> - это, фактически, текст обработчика события "на странице опять встретился яваскрипт"). Только когда обработчик завершился, интерпретатор выбирает из очереди следующее событие и вызывает его обработчик. И только если очередь событий пуста, интерпретатор проверяет, есть ли "просроченные" таймеры, и вызывает их обработчики. |
|||
|
||||
| Сisa |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
AVA12, спасибо!
Это сообщение отредактировал(а) Сisa - 31.8.2014, 21:33 |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |