3

我正在尝试通过 Chrome 扩展内容脚本将函数注入网页:

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 +');';
    ...

但这不起作用,并导致“Uncaught SyntaxError: Unexpected identifier”错误。

相关:使用内容脚本将代码插入页面上下文

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

尝试:

var actualCode = new Function( code )();
于 2012-12-11T22:20:39.473 回答
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 回答