11

</body>の直前に実行されるtest.jsに次のコードがあります。

alert('stovetop');
alert(greasy);

test.user.jsに次のコードがあります。

(function () {

    'use strict';
    var greasy = 'greasy variable';
    document.title = 'greasy title';

}());

'stovetop'はアラートを受け取り、ページjavascriptが機能document.titleすることを認識し、変更を取得してスクリプトjavascriptが機能することを認識します。ただし、Webページで次のエラーが発生します。

エラー:ReferenceError:脂っこいものが定義されていませんソースファイル:/test.js

ウェブページからGreasemonkeyによって設定された変数にアクセスするにはどうすればよいですか?またその逆はどうですか?

4

3 に答える 3

31
  • Greasemonkeyスクリプトは別のスコープで動作し、@grant設定によってはサンドボックスでも動作する場合があります。

  • さらに、質問コードgreasyは関数スコープで分離されます(gladosccが言ったように)。

  • 最後に、デフォルトでは、test.jsはGreasemonkeyスクリプトが起動する前に起動するため、とにかく、設定された変数は表示されません。それに対処するために使用@run-at document-startします。


したがって、このtest.jsを指定して、直前に実行します</body>

window.targetPages_GlobalVar = 'stovetop';

console.log ("On target page, local global: ", targetPages_GlobalVar);
console.log ("On target page, script global: ", gmScripts_GlobalVar);

次に、以下が機能します。

サンドボックスなし:

// ==UserScript==
// @name        _Greasemonkey and target page, variable interaction
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @include     http://output.jsbin.com/esikut/*
// @run-at      document-start
// @grant       none
// ==/UserScript==

//--- For @grant none, could also use window. instead of unsafeWindow.
unsafeWindow.gmScripts_GlobalVar = 'greasy';

console.log ("In GM script, local global: ", unsafeWindow.targetPages_GlobalVar);
console.log ("In GM script, script global: ", gmScripts_GlobalVar);

window.addEventListener ("DOMContentLoaded", function() {
    console.log ("In GM script, local global, after ready: ", unsafeWindow.targetPages_GlobalVar);
}, false);


サンドボックスあり、関数スコープなし、unsafeWindow
==>重要な更新: Greasemonkeyはバージョン2.0でunsafeWindow処理を変更しました。次のサンプルスクリプトは、GM2.0以降では機能しません。他の2つのソリューションは引き続き機能します。

// ==UserScript==
// @name        _Greasemonkey and target page, variable interaction
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @include     http://output.jsbin.com/esikut/*
// @run-at      document-start
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

unsafeWindow.gmScripts_GlobalVar = 'greasy';

console.log ("In GM script, local global: ", unsafeWindow.targetPages_GlobalVar);
console.log ("In GM script, script global: ", unsafeWindow.gmScripts_GlobalVar);

window.addEventListener ("DOMContentLoaded", function() {
    console.log ("In GM script, local global, after ready: ", unsafeWindow.targetPages_GlobalVar);
}, false);


サンドボックスあり、関数スコープなし、スクリプトインジェクション

// ==UserScript==
// @name        _Greasemonkey and target page, variable interaction
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @include     http://output.jsbin.com/esikut/*
// @run-at      document-start
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

function GM_main () {
    window.gmScripts_GlobalVar = 'greasy';

    console.log ("In GM script, local global: ", window.targetPages_GlobalVar);
    console.log ("In GM script, script global: ", window.gmScripts_GlobalVar);

    window.addEventListener ("DOMContentLoaded", function() {
        console.log ("In GM script, local global, after ready: ", window.targetPages_GlobalVar);
    }, false);
}

addJS_Node (null, null, GM_main);

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);
}

ノート:

  1. このページ(output.jsbin.com/esikut/1)に対してこれらのスクリプトをテストできます。
  2. サンドボックスなしでunsafeWindowwindow同じです。
  3. これらのスクリプトはすべて、コンソールで同じ出力を生成します。

    In GM script, local global: undefined
    In GM script, script global: greasy
    On target page, local global: stovetop
    On target page, script global: greasy
    In GM script, local global, after ready: stovetop
    
  4. スクリプトインジェクションコードは、Firefox以外のさまざまなブラウザで機能します。unsafeWindow現在、Firefox + Greasemonkey(またはScriptish)またはChrome+Tampermonkeyでのみ機能します。

于 2012-11-21T02:55:16.613 に答える
2

変数greasyは無名関数のスコープで定義されます。greasy関数の一部でない限り、ユーザースクリプトでもアクセスできません。例:

(function(){
    var foo = 5;
    alert(foo);
}();
alert(foo); //ERROR, because foo is undefined outside of the function.

このようにしてください:

var foo = 5;
(function(){
     alert(foo);
}();
alert(foo);

また、なぜすべてのコードを無名関数に入れて実行するのですか?

于 2012-11-21T01:46:35.780 に答える
2

localStorageを使用することもできます:

localStorage.setItem("numberOfThings", "42");

localStorage.getItem("numberOfThings");
于 2018-10-09T21:12:01.600 に答える