我们的web应用程序已经在大多数浏览器上正常工作了一年多。最近,我们发现它在Safari上运行不太好。
许多操作最终都会出现以下错误:Failed to load resource: Request timed out
。有趣的是,动作在那之后(大部分时间)实际上是正确执行的。
在查看错误时,当出现ajax请求时,似乎会发生这种情况。
首先,我尝试通过以下操作更改ajax超时设置:
$.ajax({
"type" : methode,
"dataType" : "json",
"url" : url,
"async" : async,
"data" : donneesEnvoyees,
"timeout" : 60000
})
这并没有改变任何事情,错误实际上在大约10秒后出现,这比定义的超时时间还短。
在互联网上读了一点之后,我看到了一些关于不指定缓存的答案,这样safari就不会将post参数保存在缓存中。我不能说我完全理解这一点,但我仍然尝试了以下方式:
$.ajax({
"type" : methode,
"headers" : { "cache-control": "no-cache" }, <-- added this line
"dataType" : "json",
"url" : url,
"async" : async,
"data" : donneesEnvoyees,
"timeout" : 60000
})
正如你所猜测的,我仍然会犯同样的错误。
你知道发生了什么吗?为什么这个错误只发生在Safari上,而不发生在其他浏览器上?如何修复?
在ajax设置上设置async: true
。它将使浏览器保持连接,并在收到回复后立即关闭。
我遇到了同样的问题。通过将CORS标头和响应状态代码添加为200修复
res.header('Access-Control-Allow-Origin', '*');
res.status(200);
如何&为什么
在通过阅读jQuery的源代码深入研究错误后,我意识到真正的问题是jQuery+Safari中的XMLHttpRequest正在调用onError,其http状态代码为0
。所以我添加了CORS头,并给它一个200状态代码来解决这个问题。
如果ajax页面的返回不是正确的JSON
字符串,我认为如果从代码中删除dataType : "json"
,问题就会得到解决。我注意到,如果提供了dataType : "json"
并且返回的数据不是JSON
类型,那么$.ajax()
就不会进入成功函数。
PS
有些东西,比如AJAX设置关键字type, dataType, url
等,不应该在双引号中。尽管代码即使使用当前的方式也能工作,但我提到的是正确的方式。
$.ajax({
type : methode,
dataType : "json",
url : url,
async : async,
data : donneesEnvoyees,
timeout : 60000,
success : function(data){
alert('success');
}
});
我想您已经在这个ajax调用中添加了一个success
函数,您可以使用它根据结果使用不同的操作。