IE8 сценарий остановки JavaScript я могу использовать settimeout, чтобы прервать выполнение и избежать ошибок - PullRequest
1 голос
/ 23 марта 2012

У меня есть сложная по своей природе страница, созданная idot, который запускает скрипт под нагрузкой, который занимает слишком много времени и генерирует диалоговое окно Stop Script.

Страница отлично работает во всех протестированных браузерах, кроме IE6 / 7 / 8.

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

Что-то вроде: $ ('. Level'). Each (f () {settimeout (f () {script}, 1)});

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

    $('#thetable').find('tr.listing :checkbox').click(function(event) { ... });

где в #thetable содержится около 5700 узлов dom в одном из самых скромных наборов результатов поиска.

1 Ответ

1 голос
/ 23 марта 2012

Я думаю, что поиск по этому селектору $ ('# thetable'). Find ('tr.listing: checkbox') - это то, что отнимает время в IE.

Есть пара вещей, которые вы могли бы сделать ...

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

Другой подход, который вы могли бы попробовать, - это задать предсказуемые идентификаторы ваших флажков, а затем сделать прямой выбор, например, $ ("# thetable_checkbox_" + checkboxid), а затем с помощью forloop перебрать результаты, изменив выбранный флажок.

Вот пример псевдокода

for (int x = 0; x < numResults; x++) {
    setTimeout(function() {
        $("#thetable_checkbox_" + x).bind(function() {
             clickEventFunction()
        });
     }, 0);
 }

Где ваши идентификаторы флажков были сгенерированы с идентификаторами, такими как thetable_checkbox_1 и т. Д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...