2010-02-12 24 views
6

Tôi đang cố gắng quá tải phương thức XMLHttpRequest. * Trong JavaScript để một trang web có thể tìm ra nếu một yêu cầu Ajax diễn ra mà không sử dụng bất kỳ lời gọi xâm nhập nào. Bây giờ, một cái gì đó như thế này hoạt động tương đối tốt khi sử dụng hầu hết các khuôn khổ JS:Tìm hiểu khi nào yêu cầu XMLHttpRequest được thực hiện mà không gọi lại

XMLHttpRequest.prototype.getResponseHeader = function() { 
alert('O hai, looks like you made an AJAX request.'); 
} 

Tuy nhiên, có hai sản lượng đánh bắt:

  • getResponseHeader không thể được sử dụng như getResponseHeader nữa.
  • Nó không hoạt động trong các ví dụ AJAX đơn giản. ví dụ: xmlhttp.open("GET","simple.html",false);

Có cách nào JS có thể phản ánh XMLHttpRequest.open() hoặc bất kỳ cách nào mà tôi có thể chuỗi một cái gì đó với nó. Tôi đã thử một triệu mô hình (nhà máy, nhân bản, gói - hầu hết dẫn đến đệ quy vô hạn) và dường như không có gì hoạt động. Có lẽ nó chỉ là không thể. Bất kỳ ý tưởng?

Trả lời

2

Bạn có thể giữ một tham chiếu với bản gốc trong một số biến trước khi bạn ghi đè phương thức và sau đó gọi rằng biến bên trong hàm bạn overrode:

var temp = XMLHttpRequest.getResponseHeader; 
XMLHttpRequest.getResponseHeader = function() { temp.apply(this, arguments); }; 

Điều đó sẽ cho phép bạn theo dõi sử dụng mà không cần trọng các chức năng được cung cấp bởi chức năng ban đầu.

+1

temp làm tham số áp dụng phải là 'this' để duy trì phạm vi của cuộc gọi ban đầu –

+0

Tốt hơn nên tạo điều này trong phạm vi hàm để biến' temp' không nằm trong phạm vi toàn cầu – AnthonyWJones

+0

Cảm ơn Gaby, tôi đã chỉnh sửa để phản ánh điều đó. Và Anthony: Tôi luôn cố gắng giảm thiểu các ảnh toàn cầu, nhưng vì tôi chỉ cần 2 dòng mã để minh họa tôi không muốn làm phức tạp mọi thứ – Bob

0

XmlHttp sẽ là một vấn đề thực sự, đối tượng COM của nó và không hỗ trợ loại thao tác nguyên mẫu mà bạn muốn sử dụng. Tồi tệ hơn nhưng JQuery tránh XmlHttpRequest trong IE ngay cả khi có sẵn, nó sử dụng XmlHttp thay vào đó.

+0

Giới thiệu về jQuery luôn sử dụng một đối tượng ActiveX trong IE, ngay cả khi 'XMLHttpRequest' có sẵn: không đúng, nó chỉ làm như vậy nếu' protocol == "file:" '. –

Các vấn đề liên quan