私は jQuery で PhantomJS を使用していますが、自分で POST/GET を開始せずに、ブラウザに渡される XMLHttpRequest をキャプチャできるかどうか疑問に思っています。
3 に答える
AJAX リクエストを送信前に変更できる単純な jQuery 関数がありますが、それらは jQuery によって開始された AJAX リクエストのみを対象としています。ページ上のすべての AJAX リクエストをキャッチするには、次の基本的な JS のみの方法を使用します。
(function(open){
XMLHttpRequest.prototype.open = function(method, url, async, username, password) {
// modify the variables here as needed or use 'this` keyword to change the XHR object or add event listeners to it
open.call(this, method, url, async, username, password);
};
})(XMLHttpRequest.prototype.open);
XHR send() 関数を書き直すこともできます。
(function(send){
XMLHttpRequest.prototype.send = function(body) {
// your code
send.call(this, body);
};
})(XMLHttpRequest.prototype.send);
基本的に、このコードはページで実行される最初のコードである必要があります。後続のすべての XHR リクエストは、書き換えられた関数を通過するため、パラメーターなどを変更できます。
注: IE の一部のバージョンをターゲットにする場合は、IE が AJAX に使用する ActiveXObject に同様のコードを実装する必要があります。
ajaxPrefilterは良さそうに聞こえますが、使用したことはありません。これにより、サーバーに行く前にリクエストがフィルタリングされます。次に、パイプを使用して、リクエストが返されたときに必要なものを変更できます。
$.ajaxPrefilter(function(options, originalOptions, jqXHR){
jqXHR.pipe(function(data){
//modify the data the way you want
})
});
Phantom のonResourceReceived
コールバックは、ページによって作成されたすべての XHR/AJAX リクエストに対して呼び出されます。2 回、実際には、stage="start" で 1 回、stage="end" で 1 回。コンテンツは提供されませんが、URL は取得されます。