1

XMLHttpRequest.prototype.openページ上の Ajax 呼び出しをハイジャックする関数をオーバーロードする Greasemonkey スクリプトを作成しています。

私は次のコードを使用しています:

// ==UserScript==
// @name        name
// @namespace   namespace
// @description desc
// @include     https://url*
// @version     1.0
// ==/UserScript==

if (XMLHttpRequest.prototype) {
    //New Firefox Versions
    XMLHttpRequest.prototype.realOpen = XMLHttpRequest.prototype.open;
    var myOpen = function(method, url, async, user, password) {

        //call original
        this.realOpen (method, url, async, user, password);
        myCode();

    }  
    //ensure all XMLHttpRequests use our custom open method
    XMLHttpRequest.prototype.open = myOpen ;
}


これは、GM API を使い始めるまでうまく機能します。次の行をメタ セクションに追加すると、コードが壊れてmyOpen呼び出されなくなります。

// @grant       GM_getValue

これは実際には任意の GM API である可能性があり、私のコードは壊れています。私のスクリプトの他のすべては、GM API を使用しても問題なく動作しますXMLHttpRequest.prototype.open。壊れるのは関数のオーバーロードだけです。

を使用して回避できますがwaitForKeyElements、使用する間隔が原因でブラウザーの速度が低下するため、好きではありません。

GM API がXMLHttpRequest.prototype.open呼び出しの過負荷を解消する理由はありますか?

どうもありがとう、

ピーター

4

1 に答える 1

0

この@grantディレクティブは、Greasemonkey のサンドボックスをオンに切り替えます。これは、関数のいずれかを使用する必要がありGM_ます。

そのprototypeオーバーライドはスクリプト スコープにのみ影響するため、ページ スコープに影響を与える必要があります。これを回避するには、オーバーライドを挿入する必要があります。そのようです:

function overrideXhrFunctions () {
    if (XMLHttpRequest.prototype) {
        //New Firefox Versions
        XMLHttpRequest.prototype.realOpen = XMLHttpRequest.prototype.open;
        var myOpen = function(method, url, async, user, password) {

            //call original
            this.realOpen (method, url, async, user, password);
            myCode();
        }
        //ensure all XMLHttpRequests use our custom open method
        XMLHttpRequest.prototype.open = myOpen ;
    }
}

addJS_Node (null, null, overrideXhrFunctions) {

//-- addJS_Node is a standard(ish) function
function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    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);
}


GM_関数と挿入されたコードを混在させると、扱いが難しくなる可能性があることに注意してください。「注入されたコードで GM_xmlhttpRequest を使用する方法は?」を参照してください。それを行うための1つの方法。

于 2013-05-23T03:14:07.897 に答える