gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:48:42 26 4
gpt4 key购买 nike

(这个问题类似于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com