Safari和Firefox上的ajax调用失败,但没有任何错误,但在Chrome上工作

问题描述:

我有一个ajax调用,作为一个函数的一部分执行,同时也将用户重定向到另一个页面。由于此代码在其他用户的网站上执行,因此我不想使用preventDefault(),因为这可能会影响用户体验,并且在我尝试过之前一直是导致大量问题的原因。如果通话失败了一小段时间,这并不是什么大不了的事情,但我的经验表明,在所有浏览器中,它的表现都非常稳定。Safari和Firefox上的ajax调用失败,但没有任何错误,但在Chrome上工作

AJAX调用看起来像下面

$.ajax({ 
    type: 'GET', 
    url: 'URL', 
    dataType: 'json', 
    success: function(data) { 
     // stuff 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log("AJAX call failed. Status - " + textStatus); 
     console.log("Reason - " + errorThrown); 
    } 
}); 

但对于一个特定的网站,我看到了一些非常奇怪的行为。它在Chrome中按预期执行。但是我在Safari和Firefox的控制台中看到以下内容。

AJAX call failed. Status - error. 
Reason - 

的jqXHR对象上的readyStatestatus性质均为0

URL不指向另一个域,所以我敢肯定,它不是因为跨来源的政策。

对其他类似的*问题进行一些研究,如this onethis one,似乎浏览器在ajax调用完成之前重定向。

我很好奇以下的事情。

  • 为什么我只能在Safari和Firefox上看到这种行为? Chrome是否更好地记住异步请求并确保它不会丢弃未决的回调?
  • 无需使用preventDefault就可以修复吗?

我发现自己今天也遇到了类似的问题。该调用在IE和Chrome中运行正常,但在Safari和Firefox中不起作用(尽管实际网络请求返回200次成功,数据刚刚消失)。

$(document).ready()函数中包装我的AJAX调用似乎解决了这个问题。

本来我在准备就绪的功能之外,因为我正在使用的网站使用历史API在页面之间导航(并加载新的内容触发准备功能,复制已经加载的功能,而我只想做这个每个站点访问AJAX调用一次)。

所以现在我重新获取相同的数据每页加载,而不是只有一次,但至少它在所有浏览器中工作。希望这可以帮助你,如果你已经像我一样登陆Google的这个问题。

不知道为什么Firefox和Safari无法在DOM准备好之前正确完成AJAX调用...