function addXMLRequestCallback(callback){
var oldSend, i;
if( XMLHttpRequest.callbacks ) {
// we've already overridden send() so just add the callback
XMLHttpRequest.callbacks.push( callback );
} else {
// create a callback queue
XMLHttpRequest.callbacks = [callback];
// store the native send()
oldSend = XMLHttpRequest.prototype.send;
// override the native send()
XMLHttpRequest.prototype.send = function(){
// process the callback queue
// the xhr instance is passed into each callback but seems pretty useless
// you can't tell what its destination is or call abort() without an error
// so only really good for logging that a request has happened
// I could be wrong, I hope so...
// EDIT: I suppose you could override the onreadystatechange handler though
for( i = 0; i < XMLHttpRequest.callbacks.length; i++ ) {
XMLHttpRequest.callbacks[i]( this );
}
// call the native send()
oldSend.apply(this, arguments);
}
}
}
// e.g.
addXMLRequestCallback( function( xhr ) {
console.log( xhr.responseText ); // (an empty string)
});
addXMLRequestCallback( function( xhr ) {
console.dir( xhr ); // have a look if there is anything useful here
});
9条答案
按热度按时间2ledvvac1#
**注意:接受的答案不会产生实际的响应,因为它被过早调用。
你可以这样做,这将一般拦截任何 AJAX 全局,而不是搞砸任何回调等。可能已经由任何第三方 AJAX 库分配。
更多关于你可以在这里使用addEventListener API做什么的文档:
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress
(Note这不起作用<= IE8)
guicsvcw2#
受到aviv的回答的启发,我做了一点调查,这就是我的结论。
我不确定它是否有用根据脚本中的注解,当然只适用于使用本地XMLHttpRequest对象的浏览器。
我认为如果使用JavaScript库,它将工作,因为如果可能的话,它们将使用本机对象。
xdyibdwo3#
既然你提到了jquery,我知道jquery提供了一个
.ajaxSetup()
方法,它设置了全局 AJAX 选项,包括像success
,error
和beforeSend
这样的事件触发器--这听起来像是你正在寻找的。当然,你需要在你试图使用这个解决方案的任何页面上验证jQuery的可用性。
sirbozc54#
我在Github上找到了一个很好的库,它可以很好地完成这项工作,你必须在任何其他js文件之前包含它
https://github.com/jpillora/xhook
下面是一个向任何传入响应添加HTTP标头的示例
mrwjdhj35#
使用“meouw”的答案,我建议使用以下解决方案,如果你想看到的结果的请求
nwsw7zdq6#
做这件事有一个窍门。
在所有脚本运行之前,获取原始的XHMHttpReuqest对象并将其保存在不同的var中。然后覆盖原始XMLHttpRequest并通过您自己的对象将所有调用定向到它。
伪代码:
esyap4oy7#
除了meouw的答案之外,我还必须将代码注入到一个拦截XHR调用的iframe中,并使用上面的答案。然而,我不得不改变
收件人:
我不得不改变
收件人:
这是必要的,让它在IE9与 *IE8文档模式 * 工作。如果不进行此修改,则组件框架(Visual WebGUI)生成的一些回调将无法工作。更多信息在这些链接:
如果没有这些修改 AJAX 回发就不会终止。
cvxl0en28#
jquery...
ykejflvf9#
查看jquery ajax events。你可以这样做: