使用Comet或Ajax Long Pull技术时 - 通常使用iframe。虽然iframe正在等待关闭的长连接,但浏览器正在旋转它的悸动(进度/加载指示符)。
有些网站,例如etherpad.com,设法让它停止。
他们是如何做到的?
答案 0 :(得分:17)
在互联网的内部挖掘了一天一夜后,我想出了这个:
服务器发送的事件 - 非常酷,目前仅适用于Opera,但可能是HTML5的一部分,其他浏览器可能会支持它。添加内容类型为“application / x-dom-event-stream”的新元素标记,允许服务器在客户端DOM 中触发事件。据我所知,它不应该显示进度指示器。它也是一个标准的工作草案,而不是像整个iframe彗星那样的黑客。
XMLHttpRequest - 在Firefox和Safari中,但不在IE中,它可用于长拉页面加载,可以处理每个readyStateChange事件中出现的片段。不会显示进度指标*。 - 见下面的评论
ActiveXObject(“htmlfile”) - 可以在IE中用于创建当前窗口范围之外的页面/窗口。这使得进度指示器消失了!加载的iframe将位于不可见的浏览器中。
有关服务器发送事件的更多信息:
更多关于其他两种技术(也更好地解释了问题): * http://meteorserver.org/browser-techniques/
更深入地了解每种技术和更多技术:
答案 1 :(得分:3)
对我来说,在ajax请求上运行setTimeout解决了所有问题。当我从document.ready运行请求时,我得到了“厄运的悸动”。但是使用setTimeout它不会发生。 (此修复程序也适用于Chrome)。
答案 2 :(得分:1)
如果您可能需要一些示例,这家伙确实提供了解决Firefox问题的解决方案。 http://www.shanison.com/?p=237
答案 3 :(得分:0)
我遇到了同样的问题,解决方法是使用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');