根据documentation for chrome.tabs.executeScript(MDN),回调函数接受任何结果的"数组"执行脚本的结果集。你究竟如何使用它来获得结果?我的所有尝试最终都会将undefined
传递给回调。
我尝试在内容脚本的末尾返回一个值,该脚本引发了Uncaught SyntaxError: Illegal return statement
。我尝试使用可选的代码对象参数{code: "return "Hello";}
但没有成功。
我觉得我不理解"脚本在每个注入的框架中的结果",在文档中。
答案 0 :(得分:10)
chrome.tabs.executeScript()
返回Array,其中"脚本的结果"从运行脚本的每个选项卡/框架中。
"脚本的结果"是最后一个计算语句的值,它可以是函数返回的值(即IIFE,使用return
语句)。通常,如果您从Web控制台执行代码/脚本,这将与控制台显示为执行结果(不是console.log()
,但结果)相同( F12 )(例如,对于脚本var foo='my result';foo;
,results
数组将包含字符串" my result
"作为元素)。如果您的代码很短,您可以尝试从控制台执行它。
以下是一些取自another answer of mine的示例代码:
chrome.browserAction.onClicked.addListener(function(tab) {
console.log('Injecting content script(s)');
//On Firefox document.body.textContent is probably more appropriate
chrome.tabs.executeScript(tab.id,{
code: 'document.body.innerText;'
//If you had something somewhat more complex you can use an IIFE:
//code: '(function (){return document.body.innerText;})();'
//If your code was complex, you should store it in a
// separate .js file, which you inject with the file: property.
},receiveText);
});
//tabs.executeScript() returns the results of the executed script
// in an array of results, one entry per frame in which the script
// was injected.
function receiveText(resultsArray){
console.log(resultsArray[0]);
}
这将注入一个内容脚本,以便在单击浏览器操作按钮时获取.innerText
的{{1}}。您需要<body>
权限。
作为这些产生的示例,您可以打开网页控制台( F12 )并输入activeTab
或document.body.innerText;
以查看将返回的内容。