加载Comet /服务器推送iframe时,停止浏览器“厄运的悸动”

使用Comet或Ajax Long Pull技术时,通常使用iframe。 当iframe等待长时间连接closures时,浏览器正在旋转其跳动(进度/加载指示器)。

一些网站,例如etherpad.com,设法停止。

他们是如何做到的呢?

在互联网的胆量里挖了一天一夜之后,我想到了:

  1. 服务器发送的事件 – 非常酷,目前只适用于Opera,但可能是HTML5的一部分,其他浏览器可能会支持它。 添加一个新的元素标签,内容types为“application / x-dom-event-stream”,它允许服务器客户端DOM中触发事件。 据我所知,它不应该显示进度指标。 这也是一个标准的工作草案,而不是整个iframe彗星的事情。

  2. XMLHttpRequest – 在Firefox和Safari中,但不在IE中,它可以用于长时间拉页加载,以便处理每个readyStateChange事件中出现的片段。 不会显示进度指示器*。 – 见下面的评论

  3. ActiveXObject(“htmlfile”) – 可以在IE中用来创build一个在当前窗口范围之外的页面/窗口。 这使得进度指示器消失! 加载的iframe将在一个不可见的浏览器中。

关于服务器发送事件的更多信息:

更多的关于其他两种技术(也解释了这个问题更好):* http://meteorserver.org/browser-techniques/

更深入的关于每种技术和更多的技术:

对我来说,在ajax请求上运行setTimeout解决了一切。 当我运行document.ready的请求时,我得到了“厄运的痛苦”。 但是setTimeout不会发生。 (此修补程序也适用于Chrome)。

以防万一,你可能需要一些例子,这家伙确实给解决scheme,以解决Firefox的问题。 http://www.shanison.com/?p=237

我有同样的问题,解决scheme是使用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');