views:

1735

answers:

3

When using Comet, or Ajax Long Pull techniques - an iframe is usually used. And while that iframe is waiting for the long connection to close, the browser is spinning its throbber (the progress/loading indicator).

Some websites, for example etherpad.com, managed to make it stop.

How do they do it?

+9  A: 

After digging for a day and a night in the guts of the internets, here is what I came up with:

  1. server-sent events - Very cool, currently works only in Opera, but may be part of HTML5 and other browsers may support it sometime. Adds a new element tag with content-type of "application/x-dom-event-stream" which allows the Server to fire events in the Client DOM. And it should not show a progress indicator, as far as I understand. It's also a working draft of a standard, and not a hack like the whole iframe comet thing.

  2. XMLHttpRequest - in Firefox and Safari, but not in IE, it can be used for long-pull page loading that enables to handle fragments as they appear on each readyStateChange event. Will not show progress indicator*. -- see comment below

  3. ActiveXObject("htmlfile") - can be used in IE to create a page/window that is outside of the current window scope. This makes the progress indicator go away! The loaded iframe will be in an invisible browser.

More about server-sent-events:

And more about the other two techniques (also explains the problem better): * http://meteorserver.org/browser-techniques/

Even more in-depth about each technique, and more techniques:

Evgeny
When using method (2), XHR, it needs to be invoked AFTER the page finished loading. For example using setTimeout(). If it starts before the page finished spinning the throbber, then it will continue spinning it while loading the XHR - and an "ESC" can abort it, so its bad.
Evgeny
Thanks for that comment Evgeny. I have been banging my head against my page for weeks now. Adding a few second timeout before polling fixed my page throbber issue.
Mnebuerquo
+1  A: 

Just in case that you may need some examples, this guy did give a solution to solve firefox problem. http://www.shanison.com/?p=237

jame
A: 

When using method (2), XHR, it needs to be invoked AFTER the page finished loading. For example using setTimeout(). If it starts before the page finished spinning the throbber, then it will continue spinning it while loading the XHR - and an "ESC" can abort it, so its bad. – Evgeny Jul 3 '09 at 21:51

That's great! I spent a lot of time trying to find what is going wrong. And the problem is just to set timeout !after! onload event.

dima