2011-11-13 125 views
1

我使用PhantomJS與jQuery,我想知道是否有可能捕獲XMLHttpRequest,因爲它傳遞給瀏覽器,而不發起自己的POST/GET。用jQuery捕捉XHR?

回答

8

有簡單的jQuery的功能,可以讓你修改AJAX請求在發送之前,但他們唯一的目標AJAX請求的jQuery啓動。爲了趕上網頁上的所有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); 

基本上,這個代碼需要在您的頁面上運行的FIRST代碼。隨後的所有XHR請求都將通過重寫的函數,允許您更改任何參數等。

注意:如果您希望定位某些版本的IE,則需要爲ActiveXObject實現類似的代碼,即IE用於AJAX。

+0

非常感謝,效果很好。 – relm

+0

對未來用戶謹慎使用:iframe中的代碼獲取自己的窗口對象副本,您還需要將XHR掛接到它們中。 –

1

ajaxPrefilter聽起來不錯,但從來沒有用過它。這在過濾請求之前去服務器。然後,您可以使用pipe修改,你想要什麼,當請求返回:

$.ajaxPrefilter(function(options, originalOptions, jqXHR){ 
    jqXHR.pipe(function(data){ 
     //modify the data the way you want 
    }) 
}); 
0

Phantom的onResourceReceived回調會針對頁面發出的所有XHR/AJAX請求調用。實際上,兩次,一次是stage =「start」,一次是stage =「end」。它不會給你的內容,但它會捕獲該網址。