Выполнение JavaScript, блокирующее рендеринг / прокрутку в IE 8 - PullRequest
1 голос
/ 04 марта 2011

У меня небольшая проблема с IE 8 (и, вероятно, со всеми предыдущими версиями).Firefox и Chrome / Webkit кажутся нормальными.

Что-то вызывает рендеринг страниц, прокрутку и, в основном, все взаимодействие страниц, которые блокируются .Насколько я могу судить, выполнение Javascript вызывает это.

В частности, я думаю, что в моей конкретной ситуации есть две основные ответственные стороны - Google Maps API (v3) и Facebook Connect .

В обоих случаях я использую асинхронные методы загрузки, предоставляемые как Google, так и Facebook.

Я пробовал парупока что безрезультатно:

  1. Задержка выполнения с помощью jQuery's $ (document) .ready () .Это просто предотвращает блокировку до тех пор, пока не загрузится чуть позжеНа самом деле, поскольку я использую сжатие gzip, я не совсем уверен, что он что-то делает - мне не ясно, как это работает.
  2. Задержка выполнения с window.onload .Та же ситуация - загружается вся страница, затем она блокируется, когда захватывает и выполняет код Facebook Connect.
  3. Использование setTimeout (function () {}, 0) .Я не на 100% уверен в том, как это на самом деле должно работать - насколько я понимаю, это, по сути, должно заставить выполнение кода функции ждать, пока стек не очистится.К сожалению, это, похоже, ничего не делает для меня.

Я думаю, что проблема особенно преувеличена для меня, потому что у меня медленное соединение .

Я не могу думать о каких-то специфических странностях с моим сайтом, которые могли бы быть фактором, но я не исключаю этого.

Итак, мой вопрос :

Существуют ли лучшие практики или существующих решений для этой проблемы?

Есть ли что-то, что я явно делаю неправильно ?

Сайт-нарушитель находится по адресу: http://myscubadives.com/,, если кто-то захочет взглянуть на конкретную реализацию.

Заранее благодарим вас за ваше время и помощь.

Sam

1 Ответ

0 голосов
/ 04 марта 2011

Да, браузер (по крайней мере, IE) приостанавливает себя во время выполнения Javascript.Это делает вещи немного быстрее, потому что не нужно перерисовывать и пересчитывать макет каждый раз, когда вы вносите изменения.Однако, если выполнение вашего Javascript занимает много времени, это будет похоже на зависание.Синхронные XMLHttpRequests также учитываются.

К сожалению, нет никакого обходного пути.Типичный совет - использовать функцию window.setTimeout() с тайм-аутом, установленным на 0 (или что-то очень маленькое), для разделения рабочей нагрузки на несколько частей.В промежутке между браузерами можно перерисовать себя и отреагировать на какое-то взаимодействие с пользователем, поэтому оно не кажется замороженным.Хотя код становится уродливым.

В случае длинных запросов XMLHttp, у вас нет выбора, кроме как использовать асинхронную версию.

Добавлено: Ах, я вижу, что вы уже знаетеэтот.Следует читать более внимательно.: P Знаете ли вы, что в IE8 встроены инструменты разработчика (нажмите F12, чтобы активировать) и что на вкладке Javascript есть профилировщик?Я проверил это, и 2 секунды были потрачены исключительно в методе jQyery get().Что вызывает у меня сильное подозрение, что что-то все еще использует синхронные запросы XMLHttp.

Функция: get
Количество: 10
Время включения: 2 039,14
Эксклюзивное время: 2 020,59
URL: http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js
Линия: 127

...