Javascript 检测XHR请求

Javascript 检测XHR请求,javascript,jquery,xmlhttprequest,greasemonkey,userscripts,Javascript,Jquery,Xmlhttprequest,Greasemonkey,Userscripts,我想在站点执行XHR请求时启动一个函数。 我花了整整一个晚上试图解决这个问题。 我尝试了许多在stackoverflow上发布的建议,但它似乎对我的用户脚本不起作用。所以我决定自己去问。希望你能帮忙 我想调用的函数使用了GM_setValue和GM_getValue,这也使得调用变得更加困难。 我还尝试了下面的函数和类似的函数,但它只在JavaScript控制台中使用时有效。当我将它与用户脚本一起使用时,它不再工作。。。 我也尝试过Waitfork,但这似乎对我不起作用。 setTimeout和

我想在站点执行XHR请求时启动一个函数。 我花了整整一个晚上试图解决这个问题。 我尝试了许多在stackoverflow上发布的建议,但它似乎对我的用户脚本不起作用。所以我决定自己去问。希望你能帮忙

我想调用的函数使用了GM_setValue和GM_getValue,这也使得调用变得更加困难。 我还尝试了下面的函数和类似的函数,但它只在JavaScript控制台中使用时有效。当我将它与用户脚本一起使用时,它不再工作。。。 我也尝试过Waitfork,但这似乎对我不起作用。 setTimeout和setInterval实际上不是一个选项。 请帮忙。提前谢谢

var oldXHR = window.XMLHttpRequest;
function newXHR() {
    var realXHR = new oldXHR();
    realXHR.addEventListener("readystatechange", function() {
        if(realXHR.readyState==4 && realXHR.status==200){
            afterAjaxComplete() //run your code here
        }
    }, false);
    return realXHR;
}
window.XMLHttpRequest = newXHR;

使用自定义方法覆盖默认的
XMLHttpRequest
方法,并捕获所需的事件:

var open = window.XMLHttpRequest.prototype.open,
  send = window.XMLHttpRequest.prototype.send;

function openReplacement(method, url, async, user, password) {
  this._url = url;
  return open.apply(this, arguments);
}

function sendReplacement(data) {
  if(this.onreadystatechange) {
    this._onreadystatechange = this.onreadystatechange;
  }
  this.onreadystatechange = onReadyStateChangeReplacement;
  return send.apply(this, arguments);
}

function onReadyStateChangeReplacement() {

  //YOUR CODE FOR READYSTATECHANGE

  if(this._onreadystatechange) {
    return this._onreadystatechange.apply(this, arguments);
  }
}

window.XMLHttpRequest.prototype.open = openReplacement;
window.XMLHttpRequest.prototype.send = sendReplacement;

更新:有关方法和示例的更多信息。

谢谢!起初,这似乎是可行的,但遗憾的是,仍然存在一些问题。当有多个XHR请求时,我的函数只在第一个请求之后调用。(这不是什么大问题),而且它似乎没有检测到XHR请求后的页面更改。例如,我在函数中使用了这段代码:
document.documentElement.innerHTML.match(/xxx/g)
,但它没有检测到XHR请求添加的新匹配项。@Royalgamer06它在我的生产应用程序中工作得非常好。什么问题?抱歉,我在写完之前按了回车键。检查第一条评论。嗯,我前面提到的问题只适用于某些站点。您只需要使用以下代码一次,并附加自定义处理程序。