【问题标题】:Detect XHR request检测 XHR 请求
【发布时间】:2016-01-17 12:40:04
【问题描述】:

我想在网站发出 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;

【问题讨论】:

    标签: javascript jquery xmlhttprequest greasemonkey userscripts


    【解决方案1】:

    用自定义方法覆盖默认的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 了解有关方法和示例的更多信息。

    【讨论】:

    • 谢谢!起初它似乎有效,但遗憾的是仍然存在一些问题。当有多个 XHR 请求时,我的函数只在第一个之后调用。 (不是大问题)而且它似乎没有检测到 XHR 请求后的页面更改。例如,我在我的函数中使用了这段代码:document.documentElement.innerHTML.match(/xxx/g) 但它没有检测到 XHR 请求添加的新匹配项。
    • @Royalgamer06 它在我的生产应用程序中完美运行。什么样的问题?
    • 对不起,我在写完之前按了回车键。检查第一条评论。
    • 嗯,我之前提到的问题只是针对某些网站。
    • 您只需使用以下代码一次,并附加您的自定义处理程序。
    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2011-10-24
    • 2012-01-18
    • 2020-10-28
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多