找出不使用回调函数时,XMLHttpRequest请求何时被执行。

6

我正在尝试在JavaScript中重载XMLHttpRequest.*方法,以便网页可以在不使用任何侵入式回调的情况下确定是否发生了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()或者任何我可以连接到它的方法。我已经尝试了无数种范例(工厂、克隆、包装——大多数导致无限递归),但是没有什么似乎能够起作用。也许这是不可能的。有什么想法吗?
2个回答

2

在覆盖方法之前,您可以将原始方法保存到某个变量中,然后在覆盖的函数内调用该变量:

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

那样可以让你跟踪使用情况,而不会覆盖原始函数提供的功能。

1
传递的参数应该是 this,以保持原始调用的作用域。 - Gabriele Petrioli
最好在函数作用域中创建它,这样temp变量就不会放置在全局作用域中。 - AnthonyWJones
谢谢Gaby,我已经进行了编辑以反映出来。还有Anthony:我始终尝试将全局变量最小化,但由于我只需要两行代码来说明问题,所以我不想让事情变得更加复杂。 - Bob
3
几乎正确。你还需要原型操作:XMLHttpRequest.prototype.open = function() { XMLHttpRequestWrapper.apply(this, arguments); alert('它奏效了!'); }; -- 但感谢您提供的优雅解决方案。 - David Titarenco

0

XmlHttp将成为一个真正的问题,它是一个COM对象,不支持您想要使用的原型操作。更糟糕的是,即使在IE中可用,JQuery也会避免使用XmlHttpRequest,而改用XmlHttp。


关于jQuery在IE中始终使用ActiveX对象,即使XMLHttpRequest可用的说法是不正确的。只有当protocol == "file:"时才会这样做。 - Marcel Korpel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接