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