Ajax调用被浏览器取消了

时间:2011-09-21 20:42:52

标签: ajax prototypejs http-status-codes

我正在使用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?

2 个答案:

答案 0 :(得分:1)

原因可能是您正在使用的http服务器和浏览器的组合。它似乎不是PrototypeJS库的错误。

多个来源声明HTTP连接的keep-alive参数似乎在Safari中被破坏(请参阅hereherehere)。在Apache上,他们建议将其添加到配置中:

BrowserMatch "Safari" nokeepalive

(请检查服务器文档中的相应语法)。

如果Safari处理与您的服务器严重的HTTP持久连接,它可以解释您的体验。

如果它不是太复杂,我会尝试另一个HTTP服务器,每个操作系统都有很多可用的。

我们缺乏一些信息来完全回答你的答案。服务器问题是主角,但可能还有其他问题。很高兴知道它是否在其他浏览器中做同样的事情(Firefox和Firebug将显示这种信息,Chrome,Opera和IE都有开发内置工具箱)。另一个有效的问题是每秒执行此AJAX请求的频率(如果相关)。

答案 1 :(得分:0)

我知道这是一个古老的主题,但我想分享一个Safari的解决方案,可能会节省其他时间。以下一行真正解决了所有问题:

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

正则表达式确保仅检测到Mac上的Safari,而不是Mobile Safari和Chrome(ium)等。 Safari for Windows也不匹配,但keepalive问题似乎只是Mac-Safari组合。此外,一些Safari版本不能很好地处理gzip压缩的css / js。

我们网站崩溃或CSS的所有症状都不能完全加载到不同版本的Safari中,导致我几乎拔掉头发(Safari真的是新的IE)已经通过这个Apache'配置黑客'解决了。