无法加载资源:请求在Safari上超时
我们有一个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秒后显示的,小于定义的超时。
在互联网上阅读了一下之后,我看到了一些关于指定no-cache的答案,以便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使用http状态代码0
调用onError 。 所以我添加了CORS标头并给它一个200状态代码来解决问题。
我认为如果从ajax页面返回的数据不是正确的JSON
字符串,则从代码中删除dataType : "json"
将解决您的问题。 我注意到,如果提供了dataType : "json"
并且返回数据不是JSON
类型,则$.ajax()
不会转到success函数。
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
函数,您可以使用该函数根据结果使用不同的操作。