Остановите «пульсатор судьбы» браузера при загрузке кометы/сервера push iframe
Вопрос
При использовании методов Comet или Ajax Long Pull обычно используется iframe.И пока этот iframe ожидает закрытия длительного соединения, браузер вращает свой пульсатор (индикатор прогресса/загрузки).
Некоторым веб-сайтам, например etherpad.com, удалось остановить это.
Как они это делают?
Решение
Копаясь день и ночь в недрах интернета, вот что я придумал:
события, отправленные сервером. Очень круто, в настоящее время работает только в Opera, но может быть частью HTML5, и другие браузеры могут когда-нибудь его поддерживать.Добавляет новый тег элемента с типом контента «application/x-dom-event-stream», который позволяет Сервер инициировать события в Клиент DOM.И он не должен показывать индикатор прогресса, насколько я понимаю.Это также рабочий проект стандарта, а не хак, как вся эта комета iframe.
XMLHttpRequest — в Firefox и Safari, но не в IE, его можно использовать для загрузки страниц с длительным запросом, что позволяет обрабатывать фрагменты по мере их появления при каждом событии ReadyStateChange.Не будет отображаться индикатор прогресса*.-- см. комментарий ниже
ActiveXObject("htmlfile") — может использоваться в IE для создания страницы/окна, находящегося за пределами текущей области окна.Индикатор прогресса исчезнет!Загруженный iframe будет находиться в невидимом браузере.
Подробнее о событиях, отправленных сервером:
И еще о двух других методах (также лучше объясняет проблему):* http://meteorserver.org/browser-techniques/
Еще более подробно о каждой технике и еще больше техник:
Другие советы
Для меня запуск setTimeout по запросу ajax решил все.Когда я выполнил запрос из document.ready, я получил «пульсатор судьбы».Но с setTimeout этого не происходит.(Это исправление также работает для Chrome).
На тот случай, если вам понадобятся примеры, этот парень дал решение проблемы с Firefox.http://www.shanison.com/?p=237
У меня была та же проблема, и решением было использовать Ajax вместо скрытого iframe.Итак, вместо создания iframe где-то на странице:
$("#chat .msg_list").prepend('<iframe id="hidden" src="chatFrame?id=$userId" frameborder="0" height="0" width="100%"></iframe>');
Я использовал вызов jquery ajax для загрузки содержимого iframe в некоторый div:
$('#chat #chat_comet').load('chatFrame?id=$userId');