1

この問題に夢中になっているのは1時間です。

javascript関数を含むページがあります:

<script>
  function foofunction(foo){
      dosomething(foo);
    }
</script>

この関数をgreasemonkeyスクリプトに置き換えました。

var scriptCode = new Array();

scriptCode.push('function foofunction(foo){    ');
scriptCode.push('    dosomething(foo);             ');
scriptCode.push('    myinjectedcode;               ');
scriptCode.push('}'                                 );

var script = document.createElement('script');
script.innerHTML = scriptCode.join('\n');
scriptCode.length = 0;

document.getElementsByTagName('head')[0].appendChild(script);
//here I have to access to foo value

これは機能します。

ここで、greasemonkeyスクリプトのfoo値にアクセスする必要がありますが、どうすればよいですか?

4

2 に答える 2

1

なぜJavaScript関数を配列内に作成しているのですか?グローバル関数だと思いますが、foofunction内部で関数を作成してみませんかwindow(またはunsafeWindow、Greasemonkeyの場合はそう思います)。

unsafeWindow.foofunction = function(foo){
    dosomething(foo);
    //myinjectedcode;
}

fooはローカル変数であるため、foofunction関数内にのみ存在します。それ以外でアクセスしたい場合は、グローバル変数にする必要があります。

unsafeWindow.foofunction = function(foo){
    dosomething(foo);
    //myinjectedcode;
    unsafeWindow.myFoo = foo;
}
unsafeWindow.myFoo; // will be set to `foo`, but only after `fooFunction` is ran

それに関する問題は、実行myFooされた後にのみ設定されfooFunction、それまで待つのに良い方法はありません。「コールバック」関数を作成することをお勧めします。

unsafeWindow.foofunction = function(foo){
    dosomething(foo);
    //myinjectedcode;
    unsafeWindow.myFooCallback(foo);
}
unsafeWindow.myFooCallback(foo){
    // this will be called with `foo` after `fooFunction` is ran.
}

fooFunctionしかし、とにかくコードをインジェクションするので、これはちょっと無意味です。

したがって、質問に答えるために、関数の外部でローカル変数の値を取得することはできません。とにかくコードを挿入しているので、foo内部に関連するすべてのコードを入れてみませんfooFunctionか?

于 2012-04-30T19:49:56.437 に答える
0

プロセスで値をトレースしないようにする場合は、Firebugを使用してこのタイプのスクリプトをデバッグすることをお勧めします。スクリプト内の任意の場所にブレークポイントを設定すると、停止時に現在の値が表示されます。使用されているすべての変数をオフにします。

于 2012-04-30T19:46:37.697 に答える