1

Chrome と Firefox で使用しようとしている Greasemonkey スクリプトを作成しています。Firefox のように Chrome で使用できないことはわかっているので、Greasemonkey、Chrome、および unsafeWindow.foo()unsafewindowの回答のように jS-uris を使用しようとしました。

次のことを試すと:

location.assign("javascript:var tutu = 'oscar';");
location.assign("alert('1:' + tutu);");
alert('2:' + tutu);

「tutu」が未定義であることを示すエラーが表示されます。明らかに、私が理解していないのは、これらの変数の範囲です。作業中のグローバル関数と変数を作成する必要があります。私は正しくやっていないのですか?

編集: 実際、問題は私がしようとしているものではないと思います (そうでない場合は教えてください)。相対 URI。

4

1 に答える 1

2

Chrome では、location.assign呼び出し後に遅延が発生するため (別のスレッドで実行される場合があります) 、呼び出しtutu時に var が定義されずalert()、コード全体が例外をスローします。(また、トリニティが言ったように、alertニーズの前に を付ける必要がありますjavascript:。)

次のようにタイマーを使用できます。

location.assign("javascript:var tutu = 'oscar';");
setTimeout (
    function () {location.assign("javascript:console.log('1:' + tutu);"); }
    , 666
);

しかし、それが厄介な点であることに同意していただけると思います。

でページ スコープの JavaScript を実行しようとするとlocation.assign、最も短い/最も単純なコードを除いて、すべてが面倒になります。

スクリプト インジェクションを使用して、多くのページ スコープの JavaScript を設定、リセット、および/または実行します。

function setPageScopeGlobals () {
    window.tutu     = 'Oscar';
    window.globVar2 = 'Wilde';
    window.globVar3 = 'Boyo';

    alert ('1:' + tutu);

    window.useGlobalVar = function () {
        console.log ("globVar2: ", globVar2);   
    };
}

//-- Set globals
addJS_Node (null, null, setPageScopeGlobals);

//-- Call a global function
addJS_Node ("useGlobalVar();");

//-- Standard-ish utility 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);
}
于 2012-11-29T03:20:24.893 に答える