停止浏览器“厄运的悸动” 加载 Comet/服务器推送 iframe 时

发布于 2024-07-26 16:27:17 字数 161 浏览 8 评论 0原文

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

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

他们是如何做到的呢?

When using Comet, or Ajax Long Pull techniques - an iframe is usually used. And while that iframe is waiting for the long connection to close, the browser is spinning its throbber (the progress/loading indicator).

Some websites, for example etherpad.com, managed to make it stop.

How do they do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

染火枫林 2024-08-02 16:27:18

在互联网内部挖掘了一天一夜之后,我得到了以下结果:

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

  2. XMLHttpRequest - 在 Firefox 和 Safari 中,但在 IE 中则不然,它可用于长拉页面加载,从而能够处理出现在每个 readStateChange 事件上的片段。 不会显示进度指示器*。 -- 请参阅下面的注释

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

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

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

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

After digging for a day and a night in the guts of the internets, here is what I came up with:

  1. server-sent events - Very cool, currently works only in Opera, but may be part of HTML5 and other browsers may support it sometime. Adds a new element tag with content-type of "application/x-dom-event-stream" which allows the Server to fire events in the Client DOM. And it should not show a progress indicator, as far as I understand. It's also a working draft of a standard, and not a hack like the whole iframe comet thing.

  2. XMLHttpRequest - in Firefox and Safari, but not in IE, it can be used for long-pull page loading that enables to handle fragments as they appear on each readyStateChange event. Will not show progress indicator*. -- see comment below

  3. ActiveXObject("htmlfile") - can be used in IE to create a page/window that is outside of the current window scope. This makes the progress indicator go away! The loaded iframe will be in an invisible browser.

More about server-sent-events:

And more about the other two techniques (also explains the problem better):
* http://meteorserver.org/browser-techniques/

Even more in-depth about each technique, and more techniques:

泛滥成性 2024-08-02 16:27:18

对我来说,在 ajax 请求上运行 setTimeout 解决了一切。 当我运行 document.ready 的请求时,我得到了“厄运的悸动”。 但使用 setTimeout 就不会发生这种情况。 (此修复也适用于 Chrome)。

For me, running a setTimeout on the ajax request solved everything. When I ran the request from document.ready, I got the "throbber of doom". But with setTimeout it doesn't happen. (This fix also works for Chrome).

メ斷腸人バ 2024-08-02 16:27:18

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

Just in case that you may need some examples, this guy did give a solution to solve firefox problem.
http://www.shanison.com/?p=237

瀞厅☆埖开 2024-08-02 16:27:18

我遇到了同样的问题,解决方案是使用 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');

I had the same problem, and the solution was to use Ajax instead of hidden iframe. So instead of generating iframe somewhere in the page:

$("#chat .msg_list").prepend('<iframe id="hidden" src="chatFrame?id=$userId" frameborder="0" height="0" width="100%"></iframe>');

I used jquery ajax call to load iframe contents into some div:

$('#chat #chat_comet').load('chatFrame?id=$userId');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文