检测XHR请求

时间:2016-01-17 12:40:05

标签: javascript jquery xmlhttprequest greasemonkey userscripts

我想在网站执行XHR请求时触发一个函数。 我花了整整一夜试图解决这个问题。 我已尝试在stackoverflow上发布了许多建议,但它似乎不适用于我的用户脚本。所以我决定自己问一下。希望你能提供帮助。

我要调用的函数使用GM_setValue和GM_getValue,因此这也使得它更加困难。 我也尝试了下面的函数和类似的函数,但只有在JavaScript控制台中使用它时才有效。当我将它与用户脚本一起使用时,它不再起作用了...... 我也试过waitForKeyElements,但这似乎对我不起作用。 并且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;

1 个答案:

答案 0 :(得分:3)

使用自定义方法覆盖默认的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;

更新read this post了解有关该方法和示例的详细信息。