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

sea*_*anl 4 safari ajax jquery post get

我正在使用 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();
},
Run Code Online (Sandbox Code Playgroud)

“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;
            }
        }
    },
};
Run Code Online (Sandbox Code Playgroud)

谢谢,肖恩刘

shm*_*eps 5

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

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

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