Выяснение, когда запрос XMLHttpRequest был выполнен без обратных вызовов

Я пытаюсь перегрузить метод XMLHttpRequest. * в JavaScript, поэтому веб-страница может выяснить, выполнялся ли запрос Ajax без каких-либо навязчивых обратных вызовов. Теперь что-то вроде этого работает относительно хорошо при использовании большинства инфраструктур JS:

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

Однако есть два улова:

  • getResponseHeader больше не может использоваться как getResponseHeader.
  • Это не работает в простых примерах AJAX. т.е. xmlhttp.open("GET","simple.html",false);

Есть ли способ, которым JS может зеркалировать XMLHttpRequest.open() или любым способом, которым я могу что-то связать с ним. Я пробовал миллион парадигм (factory, клонирование, обертывание - большинство из них приводит к бесконечной рекурсии), и ничего не работает. Может быть, это просто невозможно. Любые идеи?

Ответ 1

Вы можете сохранить ссылку на оригинал в некоторой переменной, прежде чем переопределить этот метод, а затем вызвать эту переменную внутри функции, которую вы переделали:

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

Это позволит вам отслеживать использование без переопределения функциональности, предоставляемой исходной функцией.

Ответ 2

XmlHttp будет реальной проблемой, ее COM-объектом и не поддерживает тип манипуляции с прототипом, который вы хотите использовать. Хуже того, JQuery избегает XmlHttpRequest в IE, даже когда он доступен, вместо него используется XmlHttp.