2016-09-29 61 views
0

我有一個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不指向另一個域,所以我敢肯定,它不是因爲跨來源的政策。

對其他類似的StackOverflow問題進行一些研究,如this onethis one,似乎瀏覽器在ajax調用完成之前重定向。

我很好奇以下的事情。

  • 爲什麼我只能在Safari和Firefox上看到這種行爲? Chrome是否更好地記住異步請求並確保它不會丟棄未決的回調?
  • 無需使用preventDefault就可以修復嗎?

回答

0

我發現自己今天也遇到了類似的問題。該調用在IE和Chrome中運行正常,但在Safari和Firefox中不起作用(儘管實際網絡請求返回200次成功,數據剛剛消失)。

$(document).ready()函數中包裝我的AJAX調用似乎解決了這個問題。

本來我在準備就緒的功能之外,因爲我正在使用的網站使用歷史API在頁面之間導航(並加載新的內容觸發準備功能,複製已經加載的功能,而我只想做這個每個站點訪問AJAX調用一次)。

所以現在我重新獲取相同的數據每頁加載,而不是隻有一次,但至少它在所有瀏覽器中工作。希望這可以幫助你,如果你已經像我一樣登陸Google的這個問題。

不知道爲什麼Firefox和Safari無法在DOM準備好之前正確完成AJAX調用...

相關問題