2011-02-16 74 views
21

有沒有什麼辦法可以在發出請求時捕獲由Access-Control-Allow-Origin引起的錯誤?我正在使用jQuery,並且.ajaxError()中設置的處理程序永遠不會被調用,因爲請求永遠不會開始。捕獲XMLHttpRequest跨域錯誤

有什麼解決方法嗎?

+0

可能有用的信息:[使用XMLHttpRequest檢測錯誤(http://ajaxpatterns.org/XMLHttpRequest_Call #Detecting_Errors) – drudge 2011-02-16 18:30:49

回答

18

對於CORS請求,應激發XmlHttpRequest的onError處理程序。如果您有訪問原始的XMLHttpRequest對象,嘗試設置一個事件處理程序,如:

function createCORSRequest(method, url){ 
    var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr){ 
    xhr.open(method, url, true); 
    } else if (typeof XDomainRequest != "undefined"){ 
    xhr = new XDomainRequest(); 
    xhr.open(method, url); 
    } else { 
    xhr = null; 
    } 
    return xhr; 
} 

var url = 'YOUR URL HERE'; 
var xhr = createCORSRequest('GET', url); 
xhr.onerror = function() { alert('error'); }; 
xhr.onload = function() { alert('success'); }; 
xhr.send(); 

注意的幾件事情:

  • 在CORS請求,瀏覽器的console.log將顯示一條錯誤消息。但是,該錯誤消息不適用於您的JavaScript代碼(我認爲這是出於安全原因,我之前問過這個問題:Is it possible to trap CORS errors?)。

  • xhr.status和xhr.statusText沒有在onError處理程序中設置,因此您沒有任何有用的信息說明CORS請求失敗的原因。你只知道它失敗了。

+2

啊,但是如何區分由CORS限制引起的錯誤與其他未指定的AJAX錯誤?在由於CORS而失敗的XMLHttpRequest對象的`readyState`,`status`和`statusText`屬性中似乎沒有任何可辨別的東西。 – kpozin 2011-08-05 02:31:59

+0

我不認爲這是可能的,看到這個問題:http://stackoverflow.com/questions/4844643/is-it-possible-to-trap-cors-errors – monsur 2011-08-10 21:48:07

+0

XDomainRequest已棄用 – mate64 2015-04-12 18:32:09

2

設置一個處理程序的onerror,你就能夠趕上跨域例外。我不知道爲什麼事件是因異常而被觸發的,而不是錯誤事件,但我只是測試了它並且它工作正常。

req = $.get('http://www.example.com'); 
req.onerror = function() { alert('An exception occurred.') };