使用userscript捕获页面xmlhttp请求

时间:2011-11-24 03:36:31

标签: ajax xmlhttprequest userscripts

我有一个用户脚本(用于chrome和FF),它为页面添加了重要功能,但最近因为开发人员向页面添加了一些AJAX而被破坏。我想修改脚本来监听页面xmlhttp请求,这样我就可以根据页面接收的JSON格式responseText动态更新我添加的内容。

搜索已经发现了许多应该工作的功能,并且在控制台中运行时可以正常工作。但是,它们不会从用户脚本的上下文中执行任何操作。

(function(open) {

    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {

        this.addEventListener("readystatechange", function() {
            console.log(this.readyState);
        }, false);

        open.call(this, method, url, async, user, pass);
    };

})(XMLHttpRequest.prototype.open);

来自:How can I intercept XMLHttpRequests from a Greasemonkey script?

这在控制台中完美运行,我可以将this.readyState更改为this.responseText并且效果很好(尽管在脚本中我需要它将JSON数据转换为对象,然后让我在用户脚本中操作它。不只是写入控制台)。但是,如果我将其粘贴到用户脚本中没有任何反应。页面上的xmlhttp请求似乎没有被用户脚本中的事件处理程序检测到。

执行请求的页面正在使用jquery $ .get()函数,如果这可能与它有关。虽然我不这么认为。

我无法想象没有办法,似乎在AJAX页面上运行的任何用户脚本都需要这种能力。

1 个答案:

答案 0 :(得分:10)

由于页面使用$.get(),因此拦截请求更加容易。使用ajaxSuccess()

这将在Greasemonkey(Firefox)脚本中使用:
代码段1:

unsafeWindow.$('body').ajaxSuccess (
    function (event, requestData)
    {
        console.log (requestData.responseText);
    }
);

假设页面以正常方式使用jQuery(定义{{​​1}}等)。


这应该适用于Chrome用户脚本(以及Greasemonkey):
代码段2:

$



回复:

  

“但是如何将这些数据提供给脚本?...(我可以)稍后在脚本中使用这些数据。”

这适用于Greasemonkey(Firefox);它也可能适用于Chrome的Tampermonkey
摘录3:

function interceptAjax () {
    $('body').ajaxSuccess (
        function (event, requestData)
        {
            console.log (requestData.responseText);
        }
    );
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

addJS_Node (null, null, interceptAjax);


但是,如果它不那么你就无法在Chrome用户脚本和目标页面之间轻松共享JS信息 - 无论如何设计。

通常,您所做的就是注入整个用户脚本,以便所有内容都在页面范围内运行。像这样:
代码段4:

function myAjaxHandler (requestData) {
    console.log ('myAjaxHandler: ', requestData.responseText);
}

unsafeWindow.$('body').ajaxSuccess (
    function (event, requestData) {
        myAjaxHandler (requestData);
    }
);