我正在使用原型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);
}在大多数情况下,这可以很好地工作,并且调用success函数的状态码为200。在Safari上,大约有5%的时间,调用成功函数的状态码为0。在这种情况下,当我查看web检查器的Network选项卡时,ajax调用的状态为“已取消”。我可以通过服务器日志确认,请求从未命中服务器。这就好像ajax请求立即被取消了,甚至没有尝试连接到服务器。我还没有找到任何可靠的方法来重现这个,它似乎是随机的。我做了20次,结果只发生了一次。
有人知道是什么原因导致ajax调用被取消或返回状态码0吗?
发布于 2012-01-28 00:59:33
原因可能是您正在使用的http服务器和浏览器的组合。这看起来不像是PrototypeJS库的错误。
多个消息来源指出,HTTP连接的keep-alive参数似乎在Safari中被破坏(参见here、here或here)。在Apache上,他们建议将以下内容添加到配置中:
BrowserMatch "Safari" nokeepalive(请检查服务器文档中的相应语法)。
如果Safari不能很好地处理与服务器的HTTP持久连接,它可以解释您所经历的情况。
如果这对你来说不是太复杂,我会尝试另一个HTTP服务器,每个操作系统上都有很多可用的。
然而,我们缺乏一点信息来完整地回答你的答案。服务器问题是一个主要问题,但也可能存在其他问题。很想知道它在其他浏览器中是否也做同样的事情(带有Firebug的Firefox将显示这类信息,Chrome、Opera和IE都有内置的开发工具箱)。另一个有效的问题是每秒执行此AJAX请求的频率(如果相关)。
发布于 2013-09-05 15:41:26
我知道这是一个古老的话题,但我想分享一个Safari的解决方案,可能会节省其他人的时间。下面这行代码真正解决了所有问题:
BrowserMatch "^(?=.*Safari)(?=.*Macintosh)(?!.*Chrom).*" nokeepalive gzip-only-text/html正则表达式确保只检测Mac上的Safari,而不是Mobile Safari和Chrome(ium)等。Windows的Safari也不匹配,但keepalive问题似乎只是Mac-Safari组合的问题。此外,一些Safari版本不能很好地处理gzipped /js。
我们所有的症状,我们的网站崩溃或CSS没有完全加载到不同的Safari版本,这导致我几乎拉我的头发(Safari真的是新的IE)已经为我们解决了这个Apache的‘配置黑客’。
https://stackoverflow.com/questions/7506376
复制相似问题