2012-08-29 83 views
4

我正在使用jQuery ajax()方法将(GET)数据传递到另一个ExportData页面,并获取返回的数据(“成功/失败“)。 ExportData页面在返回“成功/失败”之前大约需要10秒。jQuery .ajax()在Safari中无法使用时,它需要几秒钟才能获取返回的数据

我使用的代码在其他浏览器(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; 
      } 
     } 
    }, 
}; 

感谢,刘松涛

+0

使用Fiddler或Charles代理等工具查看服务器上的实际状态码。我认为Safari浏览器在更大的状态代码时遇到了一些问题,并将其转化为负数。 – epascarello

+0

非常感谢您的建议,我现在得到了实际状态码,这令我惊讶。所以现在的问题是,请求已发送,但Safari不接收数据.. – seanl

回答

1

一个在你的settings对象timeout尝试设置。

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

+1

谢谢贾斯珀你的答案,我认为这是关于超时的东西,我试图设置超时15000毫秒,但仍然不行。一个新的发现是,如果PHP文件在10秒内发回数据,ajax()可以获取数据,一旦超过10秒,Safari中会出现ajax()错误,您知道为什么吗? – seanl

+0

你的Javascript控制台中是否有任何错误?你能看到网络活动(是实际调用的URL)吗? –

3

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

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

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

+0

仅供参考参考链接已经死亡 – PandaWood

+0

@PandaWood我用存档版本取代了链接。 – shmeeps

相关问题