Остановите браузер "Throbber of Doom" при загрузке кометы / сервера push iframe
При использовании техник Comet или Ajax Long Pull - обычно используется iframe. И пока этот iframe ожидает закрытия длинного соединения, браузер вращает свой пульсатор (индикатор прогресса / загрузки).
Некоторым веб-сайтам, например etherpad.com, удалось остановить его.
Как они это делают?
4 ответа
Покопавшись в кишечнике интернета день и ночь, я пришел к следующему:
События, отправленные сервером - Очень круто, в настоящее время работает только в Opera, но может быть частью HTML5, и другие браузеры могут когда-нибудь его поддерживать. Добавляет новый тег элемента с типом содержимого "application/x-dom-event-stream", который позволяет серверу запускать события в DOM клиента. И он не должен показывать индикатор прогресса, насколько я понимаю. Это также рабочий проект стандарта, а не хак, как вся комета iframe.
XMLHttpRequest - в Firefox и Safari, но не в IE, его можно использовать для загрузки страниц с длительным нажатием, что позволяет обрабатывать фрагменты по мере их появления в каждом событии readyStateChange. Не будет показывать индикатор прогресса *. - см. комментарий ниже
ActiveXObject("htmlfile") - может использоваться в IE для создания страницы / окна, находящейся за пределами текущей области окна. Это заставляет индикатор прогресса уйти! Загруженный фрейм будет в невидимом браузере.
Больше о server-sent-events:
И еще о двух других методах (также лучше объясняет проблему): * 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');