3

Chrome拡張機能のコンテンツスクリプトを介して、次の方法でWebページに関数を挿入しようとしています。

function inject(code) {
    var actualCode = '(' + code + ')();';
    var script = document.createElement('script');
    script.textContent = actualCode;
    (document.head||document.documentElement).appendChild(script);
    script.parentNode.removeChild(script);
}

var myObj = person;  // myObj/person is passed in from elsewhere
var fn = function() {
    alert(myObj.name);
};
inject(fn); // myObj undefined

私の問題は、fnが関数式であるため、myObj.personNameを渡せないことです。だから私の質問は、変数を含む関数式をどのように構築できますか?代わりに、ある種の文字列連結を行いますか?

また、次のように、オブジェクトを関数に渡そうとしました。

function inject(code, myObj) {
    var actualCode = '(' + code + ')(' + myObj +');';
    ...

しかし、これは機能せず、「UncaughtSyntaxError:Unexpectedidentifier」エラーが発生しました。

関連:コンテンツスクリプトを使用してページコンテキストにコードを挿入する

4

3 に答える 3

3

あなたのアプローチはほぼ正しかった。問題は、次のことです

var code = '(' + func + ')(' + myObj + ');'   // results in
var code = '(function(){})([object Object])'

これを解決するには、次を使用しますJSON.stringify

var code = '(' + func + ')(' + JSON.stringify(myObj) + ');';
于 2012-12-11T22:55:13.233 に答える
1

を使用して、イベントリスナー間でメッセージを投稿したり、イベントリスナー間でメッセージを投稿したりできますwindow.postMessage

このようなコードをページに挿入します

window.addEventListener('message', function messageInvoker(e) {
    if (e.data.extKey !== 'myKey') return; // some kind of check so you only worry about your own extension
    window[e.data.fn].apply(window, e.data.params);
}, false);

そしてあなたの拡張機能から、

window.postMessage({extKey: 'myKey', fn: 'userFunction', params: ['a','b','c']}, '*');
于 2012-12-11T22:50:35.067 に答える
1

試す:

var actualCode = new Function( code )();
于 2012-12-11T22:20:39.473 に答える