2011-10-15 14 views
10

Jak mógłbym zastąpić metodę XMLHttpRequest.open(), a następnie przechwycić i zmienić jej argumenty?JavaScript: Zastępowanie XMLHttpRequest.open()

Ja już próbowałem metodę proxy, ale to nie działa, chociaż usunięcie otwarte nadmiernie pozbyć gdy XMLHttpRequest() nazwano:

(function() { 
    var proxied = window.XMLHttpRequest.open; 
    window.XMLHttpRequest.open = function() { 
     $('.log').html(arguments[0]); 
     return proxied.apply(this, arguments); 
    }; 
})(); 
+0

Co próbujesz osiągnąć? – rwilliams

+0

Chcę zmienić drugi argument obiektu XMLHttpRequest.open() dla wszystkich żądań przekierowania adresu. – Trevor

+0

Nie można po prostu użyć jakiejś "globalnej" zmiennej dla drugiego argumentu. – rwilliams

Odpowiedz

28

Nie modyfikujesz metody open odziedziczonej przez XMLHttpRequest objects, ale właśnie dodajesz metodę do XMLHttpRequest constructor, która nigdy nie jest używana.

Próbowałem ten kod na Facebooku i udało mi się złapać wnioski:

(function() { 
    var proxied = window.XMLHttpRequest.prototype.open; 
    window.XMLHttpRequest.prototype.open = function() { 
     console.log(arguments); 
     return proxied.apply(this, [].slice.call(arguments)); 
    }; 
})(); 

/* 
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true] 
    ["POST", "/ajax/apps/usage_update.php?__a=1", true] 
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true] 
    ["POST", "/ajax/canvas_ticker.php?__a=1", true] 
    ["POST", "/ajax/canvas_ticker.php?__a=1", true] 
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true] 
*/ 

Więc tak potrzebuje otwarta metoda należy doliczyć do XMLHttpRequest prototype (window.XMLHttpRequest.prototype) nie XMLHttpRequest constructor (window.XMLHttpRequest)

2

Zamiast tego należy użyć XMLHttpRequest.prototype.open.