浏览器取消了Ajax调用

7

我正在使用Prototype JS框架进行Ajax调用。这是我的代码:

new Ajax.Request( '/myurl.php', {method: 'post', postBody: 'id='+id+'&v='+foo, onSuccess: success, onFailure: failed} );

function success(ret) {
console.log("success",ret.readyState, ret.status);
}
function failed(ret) {
console.log("failed",ret.readyState, ret.status);
}

大多数情况下,这个方法运行良好,成功函数会返回200状态码。但在Safari上,大约有5%的情况下,成功函数会返回0状态码。此时,在Web检查器的网络选项卡中,Ajax调用的状态将显示为“已取消”。通过服务器日志可以确认,请求从未到达服务器。似乎Ajax请求被立即取消,甚至没有尝试连接服务器。目前还没有可靠的复现方法,它似乎是随机发生的。我重复20次,只出现了一次。
有人知道什么原因会导致Ajax调用被取消或返回0状态码吗?

你使用的是哪个版本的prototypejs? - jonycheung
2个回答

1
可能的原因是您使用的HTTP服务器和浏览器的组合。这似乎不是PrototypeJS库的错误。
多个来源指出,在Safari中,HTTP连接的keep-alive参数似乎存在问题(请参见这里这里这里)。在Apache上,他们建议将以下内容添加到配置中:
BrowserMatch "Safari" nokeepalive

(请在服务器文档中检查适当的语法)。

如果Safari与您的服务器处理HTTP持久连接不良,这可能解释了您的经历。

如果对您来说不太复杂,我建议尝试另一个HTTP服务器,在每个操作系统上都有很多可用。

虽然我们缺少一些信息来完全回答您的问题。服务器问题是一个线索,但可能还有其他问题。如果在其他浏览器中也出现同样的情况(Firefox与Firebug将显示此类信息,Chrome、Opera和IE具有内置开发工具箱),那么知道这一点将是很好的。另一个有效的问题是您每秒执行此AJAX请求的频率(如果相关)。


0

我知道这是一个老话题,但我想分享一个适用于Safari的解决方案,可能会为其他人节省一些时间。以下这行代码真正解决了所有问题:

BrowserMatch "^(?=.*Safari)(?=.*Macintosh)(?!.*Chrom).*" nokeepalive gzip-only-text/html

正则表达式确保只检测到 Mac 上的 Safari,而不是 Mobile Safari 和 Chrome(ium)等。 Windows 版 Safari 也不匹配,但保持活动问题似乎只出现在 Mac-Safari 组合中。此外,一些 Safari 版本无法很好地处理 gzipped css/js。
我们网站崩溃或 CSS 在不同版本的 Safari 中无法完全加载的所有症状(这让我几乎要抓狂,Safari 真的是新的 IE)都通过这个 Apache“配置黑科技”得到了解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接