Остановите браузер "Throbber of Doom" при загрузке кометы / сервера push iframe

При использовании техник Comet или Ajax Long Pull - обычно используется iframe. И пока этот iframe ожидает закрытия длинного соединения, браузер вращает свой пульсатор (индикатор прогресса / загрузки).

Некоторым веб-сайтам, например etherpad.com, удалось остановить его.

Как они это делают?

4 ответа

Решение

Покопавшись в кишечнике интернета день и ночь, я пришел к следующему:

  1. События, отправленные сервером - Очень круто, в настоящее время работает только в Opera, но может быть частью HTML5, и другие браузеры могут когда-нибудь его поддерживать. Добавляет новый тег элемента с типом содержимого "application/x-dom-event-stream", который позволяет серверу запускать события в DOM клиента. И он не должен показывать индикатор прогресса, насколько я понимаю. Это также рабочий проект стандарта, а не хак, как вся комета iframe.

  2. XMLHttpRequest - в Firefox и Safari, но не в IE, его можно использовать для загрузки страниц с длительным нажатием, что позволяет обрабатывать фрагменты по мере их появления в каждом событии readyStateChange. Не будет показывать индикатор прогресса *. - см. комментарий ниже

  3. 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');
Другие вопросы по тегам