jQuery的阿贾克斯()不会在Safari工作时,它需要几秒钟得到返回的数据(jQuery .aj

2019-07-31 06:20发布

我使用jQuery的阿贾克斯()方法来传递(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;
            }
        }
    },
};

谢谢,刘松涛

Answer 1:

这是一个老问题,我不知道你是否已经找到了答案,但我们最近遇到了同样的问题。 大量的研究和测试之后,我们发现了Safari浏览器会忽略超时设置为同步AJAX调用,限制为10秒。 我想这被认为是一个用户体验的事情,因为同步调用会使页面似乎挂起,他们可能认为这样做对的很长一段时间或者是不是用户友好的或无响应的页面。

所以你基本上有两种选择,您可以修改代码以使用输出缓冲定期发回数据。 这应该触发Safari浏览器能够识别该请求是至少是积极的和响应,并且通常不会迫使它超时。 我们从来没有试过,所以我不能保证,但我看到这里有不同的成功的一些故事。 另一种选择是只改变AJAX调用是异步的。 这可能是更容易的方法,但是你可能需要实现一些承诺,如果你的应用程序依赖于具有同步调用,以“模拟”同步响应。

作为参考,这里就是我们开始了下来的问题跟踪: http://propercode.com/wordpress/?p=32 。



Answer 2:

尝试设置timeout在你的设置对象。

设置请求超时(以毫秒为单位)。 这将覆盖任何全局超时设置与$ .ajaxSetup() 。 超时时间开始于$就调用提出的观点; 如果其他几个请求正在进行中,浏览器有没有连接可用,有可能请求超时可以被发送之前。 jQuery中1.4.x的和下文中,XMLHttpRequest对象将处于无效状态,如果请求超时; 访问任何对象构件可以抛出异常。 在Firefox 3.0+只,脚本和JSONP请求不能被超时取消; 如果超时时间到达后脚本也会继续运行。



文章来源: jQuery .ajax() does not work in Safari when it takes seconds to get returned data