ajax comet loading progress throbber

ajax - Detenga el navegador "throbber of doom" mientras carga el cometa/servidor push iframe



loading progress (4)

Después de excavar durante un día y una noche en las entrañas de los internets, esto es lo que se me ocurrió:

  1. eventos enviados por el servidor: muy bueno, actualmente solo funciona en Opera, pero puede ser parte de HTML5 y otros navegadores pueden admitirlo en algún momento. Agrega una nueva etiqueta de elemento con el tipo de contenido de "application / x-dom-event-stream" que permite al servidor disparar eventos en el DOM del cliente . Y no debería mostrar un indicador de progreso, por lo que yo entiendo. También es un borrador de un estándar, y no un truco como todo el cometa iframe.

  2. XMLHttpRequest: en Firefox y Safari, pero no en IE, se puede utilizar para la carga de páginas de extracción prolongada que permite gestionar los fragmentos tal como aparecen en cada evento readyStateChange. No mostrará el indicador de progreso *. - ver comentario a continuación

  3. ActiveXObject ("htmlfile"): se puede usar en IE para crear una página / ventana que esté fuera del alcance de la ventana actual. ¡Esto hace que el indicador de progreso desaparezca! El iframe cargado estará en un navegador invisible.

Más acerca de los eventos enviados por el servidor:

Y más sobre las otras dos técnicas (también explica mejor el problema): * http://meteorserver.org/browser-techniques/

Aún más en profundidad sobre cada técnica y más técnicas:

Cuando se utilizan las técnicas Comet o Ajax Long Pull, generalmente se utiliza un iframe. Y mientras ese iframe está esperando a que se cierre la conexión larga, el navegador está dando vueltas (el indicador de progreso / carga).

Algunos sitios web, por ejemplo etherpad.com, lograron detenerlo.

¿Cómo lo hicieron?



Para mí, ejecutar un setTimeout en la solicitud de AJAX resolvió todo. Cuando ejecuté la solicitud de document.ready, obtuve el "throbber of doom". Pero con setTimeout no sucede. (Esta corrección también funciona para Chrome).


Tuve el mismo problema, y ​​la solución fue usar Ajax en lugar de iframe oculto. Entonces, en lugar de generar iframe en algún lugar de la página:

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

Usé la llamada jquery ajax para cargar los contenidos iframe en algún div:

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