1

javascript を Web ページに挿入し、作成されたすべての ajax リクエストを取得しようとしています。

function addXMLRequestCallback(send_callback) {
    var oldSend, i;
    if(XMLHttpRequest.send_callbacks) {
        XMLHttpRequest.send_callbacks.push(send_callback);
    } else {
        XMLHttpRequest.send_callbacks = [send_callback];
        oldSend = XMLHttpRequest.prototype.send;
        XMLHttpRequest.prototype.send = function () {
            for (i = 0; i < XMLHttpRequest.send_callbacks.length; i++) {
                XMLHttpRequest.send_callbacks[i](this, arguments);
            }
            oldSend.apply(this, arguments);
        }
    }
}

*SOのどこかにコピー

この関数を使用すると、すべての send() イベントをキャプチャできますが、XMLHttpRequest.onload を必要とする XMLHttpRequest.responseText もキャプチャしたいと考えています。XMLHttpRequest.onload は実際には関数ではないため、上記のメソッドは機能しません。onload イベントに関数を直接割り当てると、最終的にインスタンスを使用する他のスクリプトによってオーバーライドされます。

オーバーライドを取得せずに onload イベントにコールバックを割り当てることができる方法はありますか?

4

2 に答える 2

2

「より標準的な」方法を使用できます。

の直前oldSend.apply(this,arguments)に、次を追加します。

this.addEventListener("load",function() {
    // do something with this.responseText
},false);
于 2013-11-01T15:01:54.310 に答える
-1

または、独自のオブジェクトで XMLHttpRequest を完全に変更することもできます。(しかし、それは汚いハックであり、そのようなことをすべきではありません。また、予測できない可能性があります)。

Niet the Dark Absolの解決策は明らかに優れています

var oldRequest = XMLHttpRequest;
XMLHttpRequest = function(){
    var returnObject = new oldRequest();
    returnObject.addEventListener('load',function(){console.log('load callback fired')})
    return returnObject;
}

var req = new XMLHttpRequest(); //req with callback;
于 2013-11-01T15:27:05.247 に答える