2017-07-20 2 views
0

コールバックをXMLHttpRequest.prototype.open()に挿入しようとしていますので、メソッドとURLを知ることができ、パフォーマンスレポートのタイムスタンプを設定するだけです(変更されたXMLHttpRequest.prototype.send()と一緒に)。ここでXMLHttpRequest.prototype.open()を変更することはできますか?

は、私がこれまでに思い付いたものです:

function addXMLRequestCallback(open, callback) { 
    var nativeOpen, nativeSend, i; 
    if (XMLHttpRequest.callbacks) { 
     XMLHttpRequest.callbacks.push(callback); 
    } else { 
     XMLHttpRequest.callbacks = [callback]; 
     nativeOpen = XMLHttpRequest.prototype.open; 
     XMLHttpRequest.prototype.open = function() { 
      open.forEach(function(item) { 
       // not sure what to do here... 
      }); 
     } 
     nativeSend = XMLHttpRequest.prototype.send; 
     XMLHttpRequest.prototype.send = function() { 
      for (i = 0; i < XMLHttpRequest.callbacks.length; i++) { 
       XMLHttpRequest.callbacks[i](this); 
      } 
      nativeSend.apply(this, arguments); 
     } 
    } 
} 
addXMLRequestCallback(function(method,url){ 
    // Maybe instead I should put code here... 
}, function(xhr) { 
    // then do something here? 
}); 
+0

「send」と同じようにしてください。私たちはそこで何をすべきかわからない。何をしたいのか?あなたは何をしたいのか? – Bergi

答えて

0

あなたはsend方法としていたどのような権利アプローチでした。次のスニペットでは、XMLHttpRequestopenメソッドが呼び出されるたびに呼び出されるリスナーのみを実装しました。私はsendのために同じことを実装できると確信しています。

(function() { 
 
    var nativeOpen = XMLHttpRequest.prototype.open; 
 
    var callbacks = XMLHttpRequest.callbacks = []; 
 
    XMLHttpRequest.prototype.open = function() { 
 
    callbacks.forEach(callback => callback.apply(this, arguments)); 
 
    nativeOpen.apply(this, arguments); 
 
    }; 
 
})(); 
 

 
function addXHROpenCallback (cb) { 
 
    XMLHttpRequest.callbacks.push(cb); 
 
} 
 

 
addXHROpenCallback(function (method, url) { 
 
    console.log(`XHR opened. Method: ${method}, URL: ${url}`); 
 
}); 
 

 
var xhr = new XMLHttpRequest(); 
 
xhr.open('GET', 'http://example.com');

あなたが本当に組み込みのプロトタイプを変更する必要がある場合は、自問してみてください。プロトタイプを変更せずに同じことをするラッパークラスを作成することを検討してください。

+0

私はそれに試してみましょう。ありがとう。 –

関連する問題