当获取返回的数据需要几秒钟时,jQuery .ajax()在Safari中不起作用

我正在使用jQuery ajax()方法将(GET)数据传递到另一个ExportData页面,并在该页面处理后获取返回的数据(“成功/失败”)。 ExportData页面在返回“succeeded / failed”之前大约需要10秒。

我正在使用的代码在其他浏览器(FF / IE / Chrome)中运行良好,但在Safari中则不行。 在Safari的代码检查器中,状态代码显示为-1001且未收到任何数据。 虽然还有其他ajax()请求(只要这个页面不需要返回数据)并且它们确实有效(状态为200)。

我猜测发送和接收数据之间的长间隔会导致Safari出错。 但是我也发现-1001错误显示得非常快,这可能意味着ExportData.php没有被执行。

有没有人对这个问题有所了解? 对你的帮助表示感谢!

代码是:

ExportData: function (date,view) { ajaxcall.data = {}; ajaxcall.url = 'ExportData.php?Date='+date+'&View='+view; ajaxcall.callbackfunction = UserEvents.ExportSuccess; ajaxcall.Call(); }, 

“ajaxcall”在另一个文件中:

 var ajaxcall = { SitePath: '', data: '', url: '', callbackfunction: '', fileElementClass: '', AjaxRequest: false, callback: true, Call: function () { if (ajaxcall.AjaxRequest == true) { alert(ajaxcall.AjaxRequest); return; } else { try { ajaxcall.AjaxRequest == true; $.ajax({ type: "GET", url: ajaxcall.url, data: ajaxcall.data, dataType: "json", async: false, success: function (data) { if (ajaxcall.callback == true) { ajaxcall.callbackfunction(data); } }, error: function (request, status, error) {}, complete: function () { ajaxcall.AjaxRequest = false; } }); } catch (e) { ajaxcall.AjaxRequest == false; } } }, }; 

谢谢,肖恩刘

这是一个老问题,我不确定你是否找到了答案,但我们最近遇到了同样的问题。 经过大量的研究和测试,我们发现Safari忽略了同步AJAX调用的超时设置,限制为10秒。 我想这被认为是用户体验的事情,因为同步调用会使页面看起来挂起,并且他们可能会认为这样做很长一段时间不是用户友好的或者没有响应的页面。

因此,您基本上有两个选项,您可以修改代码以使用输出缓冲区定期发送数据。 这应该会触发Safari识别请求至少处于活动状态并响应,并且通常不会强制它超时。 我们从来没有尝试过这个,所以我不能保证,但我已经看到了一些在这里和那里取得不同成功的故事。 另一种选择是将AJAX调用更改为异步。 这可能是更简单的方法,但如果您的应用程序依赖于同步调用,您可能需要实现一些“模拟”同步响应的承诺。

作为参考,这里是我们开始追踪问题的地方: http : //propercode.com/wordpress/?p = 32 。

尝试在设置对象中设置timeout

设置请求的超时(以毫秒为单位)。 这将覆盖使用$ .ajaxSetup()设置的任何全局超时。 超时时间从$ .ajax调用点开始; 如果其他几个请求正在进行且浏览器没有可用的连接,则可以在请求发送之前超时。 在jQuery 1.4.x及更低版本中,如果请求超时,XMLHttpRequest对象将处于无效状态; 访问任何对象成员可能会抛出exception。 仅在Firefox 3.0+中,超时无法取消脚本和JSONP请求; 即使在超时期限后到达,脚本也会运行。