javascript - 加载 cometd /服务器推送 XMLHttpRequest 时停止浏览器 “throbber of doom”

标签 javascript ajax dom-events comet

(这个问题类似于 this one ,但它是针对使用 XMLHttpRequest 而不是 Comet 的 iframe。)

我正在开始这样的异步长轮询:

var xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.send();

如果我在内部执行此操作 <script>...</script>在头部,它会导致文档永远保持加载状态。 (我正在 Mac OS X 和 iPhone 上的 Safari 中对此进行测试,它是我需要支持的唯一浏览器)。

使用 DOMContentLoadedload事件将不起作用。

使用具有足够大 延迟的 setTimeout 将起作用。 0 不会,1000 会,100 有时会,而其他时候不会。我对此感到不舒服。

我发现唯一可行的方法是将两者结合起来:

document.addEventListener('DOMContentLoaded', function () {
    setTimeout(function () {
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url);
        xhr.send();
    }, 0);
});

我想这暂时解决了问题,但我仍然担心它会在未来崩溃。//编辑:这也不能可靠地工作。

有谁知道更可靠的方法吗?

最佳答案

我不确定,但似乎如果浏览器显示它仍在下载,那是完全正确的 - 这不就是 Comet 编程的本质吗?服务器仍在发送未缓冲的内容,当它在 javascript block 中流式传输时,它会被执行,从而允许服务器将事件推送到客户端浏览器。

在 Ajax 早期(例如在 IE6 上,XMLHttpRequest 是一个单独的 ActiveX 对象)我希望浏览器不知道它仍在等待。

但在 Safari 4、Chrome、FX3.5 和所有现代浏览器中 XMLHttpRequest是内置的 - 它知道它仍在等待服务器仍然流式传输其内容,就像它与 <IFrame> 一样。

简而言之 - 我希望任何 Comet 方法都能显示浏览器仍在下载,因为它是。我希望您发现的任何变通办法都能在未来的构建中得到修复,因为 Comet 本质上是一种让服务器推送模型正常工作的 hack。

但是他们已经开始在 HTML 5 中构建真正的服务器推送支持。

移动Webkit是否支持HTML 5 draft event-source 标记了吗?如果是这样,您可以尝试一下。

然后你会得到这样的东西:

<!-- new HTML 5 tag supporting server-push -->
<event-source src="http://myPushService.com" id="service">

<script type="text/javascript">

    function handleServiceEvent(event) {
        // do stuff
    }

    // tell browser to fire handleServiceEvent in response to server-push
    document.getElementById('service').addEventListener('event name', handleServiceEvent, false);
</script>

关于javascript - 加载 cometd /服务器推送 XMLHttpRequest 时停止浏览器 “throbber of doom”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1735560/

相关文章:

javascript - PDF.js 返回整个文档的文本内容作为每个页面的文本内容

javascript - 如何知道拖动的文件来自特定的文件扩展名?

php - 在提交表单时加载跟踪脚本

json - 获取 AJAX 使用从 Flask 发送的 JSON 数据填充数据表并单独渲染 html

javascript - 模糊 DOM 元素时会发生什么

JavaScript 触摸事件更新力或半径

javascript - 取消复选框的点击事件会阻止检查它吗?

javascript - 在哪里放置全局帮助 js 函数

javascript - 如何在提交表单之前禁用按钮

javascript - 将按钮/下拉文本更改为选定的下拉项目