检索和修改XMLHttpRequest的内容

时间:2011-05-26 01:22:50

标签: javascript firefox-addon xmlhttprequest google-chrome-extension addeventlistener

我正在开发一个针对Firefox,Safari,Chrome的浏览器插件,它将拦截页面上的数据,针对正则表达式运行它,然后如果它匹配 - 重新格式化它。我使用以下方法处理页面加载:

var meth = {
  replaceInElement : function(element, find, replace) {
        // iterate over child nodes and replace
  },
  run : function(evt){
    // doc is the document that triggered "run" event
    if (!(evt.target.nodeName === "#document")) { return; }
    var doc = evt.target; // document that triggered "onload" event
    if (!(doc instanceof HTMLDocument)) { return; }
    if (!doc.location) { return; }

    // perform substitutions on the loaded document
    var find = /regex/gi

    meth.replaceInElement(doc.body, find, function(match) {
        var new_content;
        //do stuff
        return new_content;
    });

    //content.document.addEventListener('DOMNodeInserted', ezcall.node_inserted, false);
  }
}

window.addEventListener("load", meth.run, false);

这适用于静态页面,但对于使用ajax调用的任何内容,它都会失败。我无法找到合适的监听器或弄清楚如何拦截XMLHttpRequest。

我为XMLHttpRequest尝试过类似的事件监听器而没有运气。

XMLHttpRequest.addEventListener('load', meth.run, false);

我想拦截请求并修改内容。或者找到已更新的目标,并在完成ajax调用后对其进行扫描。

更新:

我会接受一个说不能做的答案,但我需要一些支持数据来说明为什么不能这样做。

3 个答案:

答案 0 :(得分:10)

相当脏,但我认为如果你只需要在FF和WebKit上工作,你就可以覆盖XMLHttpRequest.prototype.open。这是一个 Demo 页面。

(function() {
    // save reference to the native method
    var oldOpen = XMLHttpRequest.prototype.open;
    // overwrite open with our own function
    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
        // intercept readyState changes
        this.addEventListener("readystatechange", function() {
            // your code goes here...
            console.log("Interception :) " + this.readyState);
        }, false);
        // finally call the original open method
        oldOpen.call(this, method, url, async, user, pass);
    };
})();

在此之后你可以做任何我猜的事情。替换instance.readystatechange,替换instance.addEventListener或收听突变事件(尽管它们是deprecated)。

答案 1 :(得分:1)

我认为你不能这样做,即使你可以,还有其他加载aysnc内容的方法,比如JSON-P

另一种选择是设置一个函数来监视body元素以获取对DOM的任何新增内容。我不认为这是本机浏览器事件,因此您必须使用setTimeout()进行轮询。另请注意,迭代所有DOM元素可能非常耗时。以下页面包含一些可能有用的事件:http://www.quirksmode.org/dom/events/index.html

答案 2 :(得分:0)

我认为你不能以一般的方式做到这一点。请记住,ajax调用可以是任何格式(html,xml,json等),然后启动它们的javascript可以在将数据插入文档之前对数据执行任何操作。除非您针对特定情况进行监控,否则您无法对此进行监控。或者通过纯粹的蛮力,您可以跟踪页面内容并检查是否有任何定期更改。