2011-10-15 36 views
10

Làm cách nào để tôi có thể ghi đè phương thức XMLHttpRequest.open() và sau đó bắt và thay đổi đối số của nó?Javascript: Ghi đè XMLHttpRequest.open()

Tôi đã thử các phương pháp proxy nhưng nó đã không làm việc, mặc dù tháo mở quá thoát khỏi khi XMLHttpRequest() được gọi là:

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

Bạn đang cố gắng làm gì? – rwilliams

+0

Tôi muốn thay đổi đối số thứ hai của XMLHttpRequest.open() cho tất cả các yêu cầu định tuyến lại địa chỉ. – Trevor

+0

Bạn không thể sử dụng biến số 'toàn cầu' cho đối số thứ hai. – rwilliams

Trả lời

28

Bạn không sửa đổi phương thức open được kế thừa bởi XMLHttpRequest objects nhưng chỉ thêm phương thức vào XMLHttpRequest constructor mà thực sự không bao giờ được sử dụng.

Tôi đã thử mã này trong facebook và tôi đã có thể nắm bắt được các yêu cầu:

(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] 
*/ 

Vì vậy, yeah phương pháp mở cần được bổ sung vào XMLHttpRequest prototype (window.XMLHttpRequest.prototype) không XMLHttpRequest constructor (window.XMLHttpRequest)

2

tôi sẽ cung cấp cho các xmlhttprequest project tại google mã một cái nhìn. Đó là một ví dụ khá tốt về việc ghi đè đúng đối tượng XMLHttpRequest. Các nguồn có thể được nhìn thấy here.

2

Sử dụng XMLHttpRequest.prototype.open để thay thế.