在使用Comet或Ajax长轮询技术时,通常会使用一个iframe。而当该iframe等待长连接关闭时,浏览器会旋转其“throbber”(进度/加载指示器)。
例如etherpad.com等一些网站设法让它停止旋转。
他们是如何做到的?
在互联网的深处挖掘了一天一夜之后,我得出了以下结论:
服务器推送事件 - 目前只在 Opera 中使用,但可能成为 HTML5 的一部分,并且其他浏览器也可能在未来支持它。它添加了一个新的元素标签,内容类型为 "application/x-dom-event-stream",允许服务器在客户端 DOM中触发事件。据我所知,它不应显示进度指示器。它还是标准的工作草案,而不像整个 iframe comet 一样是黑客行为。
XMLHttpRequest - 在 Firefox 和 Safari 中可用,但在 IE 中不可用,它可以用于长轮询页面加载,从而可以处理每个 readyStateChange 事件上出现的片段。不会显示进度指示器*。--请参阅下面的评论
ActiveXObject("htmlfile") - 可以在 IE 中使用,创建一个在当前窗口范围之外的页面/窗口。这使进度指示器消失!加载的 iframe 将在一个不可见的浏览器中。
更多关于服务器推送事件的信息:
还有关于其他两种技术的更多信息(也更好地解释了问题):
更深入地了解每种技术以及更多技术:
对我来说,在ajax请求上运行setTimeout解决了所有问题。当我从document.ready运行请求时,我得到了“末日之锤”。但是使用setTimeout就不会发生这种情况。(这个修复方法在Chrome中也适用)。
$("#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');