我正在使用jQuery ajax()方法将(GET)数据传递到另一个ExportData页面,并在该页面处理之后获取返回的数据(“成功/失败”)。 ExportData页面大约需要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

10-04 15:44
查看更多