停止加载comet/server push iframe时的浏览器“死亡旋转图标”

33

在使用Comet或Ajax长轮询技术时,通常会使用一个iframe。而当该iframe等待长连接关闭时,浏览器会旋转其“throbber”(进度/加载指示器)。

例如etherpad.com等一些网站设法让它停止旋转。

他们是如何做到的?


有很多加载进度条,你指的是哪一个?它是特定于浏览器还是操作系统的一部分? - Ape-inago
我想禁用加载栏,就是在浏览器中看到的那个(通常位于右上角或地址栏中)。 - Evgeny
4个回答

17

在互联网的深处挖掘了一天一夜之后,我得出了以下结论:

  1. 服务器推送事件 - 目前只在 Opera 中使用,但可能成为 HTML5 的一部分,并且其他浏览器也可能在未来支持它。它添加了一个新的元素标签,内容类型为 "application/x-dom-event-stream",允许服务器客户端 DOM中触发事件。据我所知,它不应显示进度指示器。它还是标准的工作草案,而不像整个 iframe comet 一样是黑客行为。

  2. XMLHttpRequest - 在 Firefox 和 Safari 中可用,但在 IE 中不可用,它可以用于长轮询页面加载,从而可以处理每个 readyStateChange 事件上出现的片段。不会显示进度指示器*。--请参阅下面的评论

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

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

还有关于其他两种技术的更多信息(也更好地解释了问题):

更深入地了解每种技术以及更多技术:


12
使用方法二(XHR)时,需要在页面加载完成后调用它。例如,可以使用setTimeout()。如果在页面旋转的指示器停止旋转之前启动它,则在加载XHR时会继续旋转指示器,这样就很糟糕了,因为“ESC”可能会中止它。 - Evgeny
1
谢谢你的评论,Evgeny。我已经为我的页面苦苦思索了几周。在轮询之前添加几秒钟的超时时间解决了我的页面加载问题。 - Mnebuerquo
@Evgeny 不幸的是,超时解决方案在Chrome中不起作用,它仍然会显示加载指示器(尽管在Firefox中可以)。有什么提示吗? - Jules

3

对我来说,在ajax请求上运行setTimeout解决了所有问题。当我从document.ready运行请求时,我得到了“末日之锤”。但是使用setTimeout就不会发生这种情况。(这个修复方法在Chrome中也适用)。


1

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');

是的,但一开始对我来说并不那么明显,所以我写了一个更简单的答案。 - Maciej Łoziński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接