停止浏览器“厄运的悸动” 加载 Comet/服务器推送 iframe 时
当使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在互联网内部挖掘了一天一夜之后,我得到了以下结果:
服务器发送事件 - 非常酷,目前仅适用于 Opera,但可能是 HTML5 的一部分,其他浏览器也可能有时间支持一下。 添加内容类型为“application/x-dom-event-stream”的新元素标签,允许服务器触发客户端 DOM 中的事件。 据我了解,它不应该显示进度指示器。 它也是一个标准的工作草案,而不是像整个 iframe comet 那样的 hack。
XMLHttpRequest - 在 Firefox 和 Safari 中,但在 IE 中则不然,它可用于长拉页面加载,从而能够处理出现在每个 readStateChange 事件上的片段。 不会显示进度指示器*。 -- 请参阅下面的注释
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:
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.
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
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:
对我来说,在 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).
以防万一您可能需要一些示例,这个人确实给出了解决 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
我遇到了同样的问题,解决方案是使用 Ajax 而不是隐藏的 iframe。 因此,我没有在页面中的某个位置生成 iframe:
我使用 jquery ajax 调用将 iframe 内容加载到某个 div 中:
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:
I used jquery ajax call to load iframe contents into some div: