33

使用 Comet 或 Ajax Long Pull 技术时 - 通常使用 iframe。当 iframe 等待长连接关闭时,浏览器正在旋转它的 throbber(进度/加载指示器)。

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

他们是怎么做到的呢?

4

4 回答 4

17

在互联网的胆量中挖掘了一天一夜之后,这是我想出的:

  1. server-sent events - 非常酷,目前仅适用于 Opera,但可能是 HTML5 的一部分,其他浏览器可能会支持它。添加内容类型为“application/x-dom-event-stream”的新元素标签,允许服务器在客户端 DOM中触发事件。据我了解,它不应该显示进度指示器。它也是一个标准的工作草案,而不是像整个 iframe comet 那样的 hack。

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

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

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

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

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

于 2009-07-01T00:08:32.513 回答
3

对我来说,在 ajax 请求上运行 setTimeout 可以解决所有问题。当我从 document.ready 运行请求时,我得到了“厄运的颤抖者”。但是使用 setTimeout 它不会发生。(此修复也适用于 Chrome)。

于 2011-08-25T23:07:47.677 回答
1

以防万一您可能需要一些示例,这家伙确实提供了解决 Firefox 问题的解决方案。 http://www.shanison.com/?p=237

于 2010-05-10T15:24:38.497 回答
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');
于 2012-08-18T11:13:33.303 回答