7

我正在为Firefox,Safari,Chrome浏览器插件工作,它将截取页面上的数据,对正则表达式运行它,然后匹配 - 重新格式化它。我有这个工作页面加载使用:检索和修改XMLHttpRequest的内容

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调用完成后对其进行扫描。

UPDATE:

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

回答

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)。

+0

你是对的,很脏 - 但如果最糟糕的事情你可以说它是有效的......我会测试一下,看看我能发生什么。 – 2011-06-03 16:46:20

+0

谢谢,它的成果相当不错 - 我欣赏创意的方法! – 2011-06-06 02:28:58

+0

@galambalazs不错!我使用你的代码为请求的url添加自定义参数。我也做了一些小改动来提供IE兼容性:'var XHR = typeof XMLHttpRequest!='undefined'? XMLHttpRequest:ActiveXObject; XHR.prototype.open = ...'。如果我错了,请告诉我。 – leaf 2013-07-08 13:27:10

0

我不认为你能够以一般方式做到这一点。请记住,Ajax调用可以是任何格式(html,xml,json等),然后在将数据插入到文档之前,启动它们的JavaScript可以对数据执行任何操作。你不能真正监控这一点,除非你正在做一个特定的情况下,你知道该找什么。或者通过纯粹的暴力,在那里你跟踪页面的内容,并检查是否有任何规则的时间间隔发生了变化。

1

我不认为你可以做到这一点,即使你可以,还有其它方法加载aysnc内容,如JSON-P

另一种选择是设置一个监控身体功能元素添加到DOM的任何新增内容。我不认为这是本地浏览器事件,所以你将不得不使用setTimeout()进行轮询。还要注意遍历所有的DOM元素可能会很耗时。以下页面有一些可能有所帮助的事件:http://www.quirksmode.org/dom/events/index.html

+0

对于资源+1,我明白你的观点 - 但要拒绝接受,直到我确定它无法完成为止。 – 2011-06-02 03:36:09