2009-05-28 23 views
27

xhrオブジェクトからリクエストURLを抽出する方法はありますか? 私はfirebugのURLをchannelプロパティで見ることができますが、javascriptを使用してこれを問い合わせることはできません。xhrオブジェクトからリクエストURLを取得

+0

は、Firefoxの拡張機能のためか、ページのスクリプトは、このですか?それがページ上にある場合は、なぜその情報を持っていないのですか? –

+0

私はさまざまなデータを要求する複数の間隔を持っています。一般的なイベントを処理する共通のajaxStart&ajaxCompleteイベントがあります(進行状況の表示/非表示)ajaxCompleteイベントの中で、 – redsquare

答えて

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

+0

現在使用しているコードの一部を提供できる場合は、コードを大幅に変更することなくこの機能を追加するエレガントな方法を見つけることができます。コールバックに戻ってくるXHRオブジェクト(これはテストしていません)を猿パッチすることは可能です(あなたですか?)。 –

5

https://developer.mozilla.org/en/XmlHttpRequestによれば、昇格した特権を持っている場合は、実際にchannelを得ることができます。ただし、channelは標準ではありません(他のブラウザでは動作しない可能性があります)。実際にhttp://www.w3.org/TR/XMLHttpRequest/のW3C仕様にはchannelや「リクエストURLを抽出する」その他の方法はありません。したがって、ブラウザ間で合理的に行う方法はないと私は思っています。

+0

この情報を取得することは拡張機能にとって問題ではありません(特権アクセスがあるため)が、通常のxmlhttprequestの使用法で私が知っている限り利用できません –

27

jQueryを使用している場合は、AJAXリクエストの "beforeSend"関数を使用してjqXHRオブジェクトを変更できます。すなわち、様々なコールバックに渡さ

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

jqXHRオブジェクトは、あなたがアクセスできる変数、jqXHR.requestURLを、持っています。次は何のラッパーをハックしないで

+4

'jqxhr.requestURL = settings.url'を実行すると、' $ .ajaxSetup'呼び出しでグローバルに設定できます。 –

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 '...' 
関連する問題