2009-05-28 112 views
27

有什麼辦法從xhr對象中提取請求url? 我可以通過頻道屬性看到螢火蟲的網址,但你不能使用javascript查詢這個。從xhr對象獲取請求url

+0

這是一個Firefox擴展或網頁上的腳本?如果它在頁面上,爲什麼你還沒有這個信息? – 2009-05-28 14:53:42

+0

我有多個請求各種數據的間隔,我有一些常見的ajaxStart&ajaxComplete事件來處理一般事件(顯示/隱藏進度指示器)我只需要訪問ajaxComplete事件中的邊緣案例的URL。 – redsquare 2009-05-28 15:36:59

回答

6

我希望我能正確理解你的問題。

使用自己的對象包裝XHR對象應該相當簡單,以實現這種功能。

下面是一個過於簡化的例子:

// Assumption: GetXHR() returns a new XHR object, cross browser. 

function HTTPGet(url, onStartCb, onCompleteCb) 
{ 
    var xhr = GetXHR(); 
    // Construct your own xhr object that contains the url and the xhr object itself. 
    var myXhr = { xhr: xhr, url: url }; 

    xhr.onreadystatechange = function() 
    { 
    if (xhr.readyState == 4 && xhr.status == 200) 
    { 
     onCompleteCb(myXhr); 
    } 
    }; 

    xhr.open("GET", url); 
    onStartCb(myXhr); 
    xhr.send(null); 
} 

我還沒有廣泛測試此,但它應該工作,並與一些修改(錯誤處理,傳遞的參數等),你應該能夠把這個例子變成一個功能完整的解決方案

+0

是的,這是最好的方法,但是我希望快速獲勝而沒有需要重構我目前正在使用的所有js。歡迎回復 – redsquare 2009-06-01 13:04:36

5

https://developer.mozilla.org/en/XmlHttpRequest,你確實可以得到channel如果您擁有更高權限;然而,channel是非標準的(可能無法在其他瀏覽器中運行),並且實際上http://www.w3.org/TR/XMLHttpRequest/的W3C規範沒有提及channel,也沒有提供任何其他「提取請求URL」的方式。因此,我懷疑在瀏覽器中沒有合理的方法。

+0

獲取這些信息對擴展來說不是問題(因爲它具有特權訪問),但是就我所知在正常的xmlhttprequest用法中是不可用的 – 2009-05-28 15:16:41

27

如果您使用的是jQuery,那麼您可以使用AJAX請求中的「beforeSend」函數來修改jqXHR對象。即,

$.ajax({ 
... 
url: "http://some/url", 
beforeSend: function(jqxhr, settings) { jqxhr.requestURL = "http://some/url"; }, 
... 
}); 

傳遞到各種回調的jqXHR對象隨後將有一個變量,jqXHR.requestURL,您可以訪問。

15

具有以下劈沒有包裝要求:

var xhrProto = XMLHttpRequest.prototype, 
    origOpen = xhrProto.open; 

xhrProto.open = function (method, url) { 
    this._url = url; 
    return origOpen.apply(this, arguments); 
}; 

用法:

var r = new XMLHttpRequest(); 
r.open('GET', '...', true); 
alert(r._url); // opens an alert dialog with '...'