33 votes

Arrêtez le navigateur "throbber of doom" lors du chargement de la comète / serveur push iframe

Lorsque vous utilisez les techniques Comet ou Ajax Long Pull - un iframe est généralement utilisé. Et pendant que cet iframe attend la fermeture de la longue connexion, le navigateur fait tourner son lanceur (l'indicateur de progression / chargement).

Certains sites Web, par exemple etherpad.com, ont réussi à y mettre fin.

Comment font-ils?

17voto

Evgeny Points 1387

Après avoir creusé pendant un jour et une nuit dans les entrailles de l'internet, voici ce que j'ai trouvé:

  1. server-sent events - Très cool, ne fonctionne actuellement qu'à l'Opéra, mais peut-être partie de HTML5 et d'autres navigateurs peuvent soutenir de temps en temps. Ajoute un nouvel élément de la balise avec le content-type "application/x-dom-événement-stream" qui permet au Serveur pour déclencher des événements dans le Client DOM. Et il ne doit pas afficher un indicateur de progrès, comme je le comprends. C'est aussi un avant-projet de norme, et non pas un hack comme l'ensemble de l'iframe de la comète chose.

  2. XMLHttpRequest - dans Firefox et Safari mais pas sous IE, il peut être utilisé pendant de longues-pull de chargement d'une page qui permet de gérer les fragments tels qu'ils apparaissent sur chaque readyStateChange événement. Ne sera pas montrer indicateur de progrès*. - voir le commentaire ci-dessous

  3. ActiveXObject("htmlfile") - peut être utilisé dans IE pour créer une page/fenêtre qui est à l'extérieur de la fenêtre actuelle portée. Cela rend l'indicateur de progression s'en aller! Le chargé iframe sera invisible navigateur.

Plus sur server-sent-événements:

Et de plus sur les deux autres techniques (aussi explique mieux le problème): * http://meteorserver.org/browser-techniques/

Encore plus en profondeur sur chaque technique, et de plus en plus techniques:

3voto

Ron Reiter Points 1436

Pour moi, l'exécution d'un setTimeout sur la demande ajax a tout résolu. Lorsque j'ai exécuté la demande à partir de document.ready, j'ai eu le "throbber of doom". Mais avec setTimeout, cela ne se produit pas. (Ce correctif fonctionne également pour Chrome).

1voto

jame Points 1

Juste au cas où vous auriez besoin d'exemples, ce type a donné une solution pour résoudre le problème de Firefox. http://www.shanison.com/?p=237

0voto

J'ai eu le même problème, et la solution était d'utiliser Ajax au lieu d'iframe caché. Ainsi, au lieu de générer un iframe quelque part dans la page:

 $("#chat .msg_list").prepend('<iframe id="hidden" src="chatFrame?id=$userId" frameborder="0" height="0" width="100%"></iframe>');
 

J'ai utilisé l'appel jquery ajax pour charger le contenu iframe dans une div:

 $('#chat #chat_comet').load('chatFrame?id=$userId');
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X