加载Comet /服务器推送iframe时,停止浏览器“厄运的悸动”
使用Comet或Ajax Long Pull技术时,通常使用iframe。 当iframe等待长时间连接closures时,浏览器正在旋转其跳动(进度/加载指示器)。
一些网站,例如etherpad.com,设法停止。
他们是如何做到的呢?
在互联网的胆量里挖了一天一夜之后,我想到了:
-
服务器发送的事件 – 非常酷,目前只适用于Opera,但可能是HTML5的一部分,其他浏览器可能会支持它。 添加一个新的元素标签,内容types为“application / x-dom-event-stream”,它允许服务器在客户端DOM中触发事件。 据我所知,它不应该显示进度指标。 这也是一个标准的工作草案,而不是整个iframe彗星的事情。
-
XMLHttpRequest – 在Firefox和Safari中,但不在IE中,它可以用于长时间拉页加载,以便处理每个readyStateChange事件中出现的片段。 不会显示进度指示器*。 – 见下面的评论
-
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');