无法加载资源:请求在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函数,您可以使用该函数根据结果使用不同的操作。