我想将firefox web扩展中的脚本注入tabId思想browser.tabs.executeScript API。
我有一个文件Browser.js
MyFunc.Browser = (function() {
var self;
function Browser() {
self = this;
}
Browser.getExtensionURI = function() {
return "chrome-extension://";
};
return Browser;
})();
执行脚本功能:
var executing = browser.tabs.executeScript(tabId, {
file: "js/contentscripts/Browser.js"
});
executing.then(function(results) {
console.log("url: " + tabUrl + ", result", results);
}, function(error) {
return console.log("Inject scripts error: " + error);
});
但是脚本无法注入选项卡并显示错误。
我该如何解决?
清单文件:
{
"name": "abc",
"background": {
"page": "background.html"
},
"browser_action": {
"default_icon": "icons/icon_19.png",
"default_popup": "login.html",
},
"content_scripts": [
{
"web_accessible_resources": [
"js/contentscripts/Browser.js",
],
"js": [
"js/contentscripts/ContentScript.js"
],
"matches": [
"file://*/*",
"http://*/*",
"https://*/*"
],
"run_at": "document_end",
"all_frames": true
},
{
"js": [
"js/contentscripts/Browser.js",
],
"matches": [
"file://*/*",
"http://*/*",
"https://*/*"
],
"run_at": "document_start",
"all_frames": true
}
],
"icons": {
"16": "icons/icon_16.png",
"19": "icons/icon_19.png"
},
"incognito": "spanning",
"permissions": [
"activeTab",
"tabs",
"http://*/*",
"https://*/*",
"<all_urls>"
],
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"version": "1.1.16"
}
答案 0 :(得分:4)
在“js / contentscripts / Browser.js”文件中,添加“undefined;”到最后一行。
该值将返回“execution.then”第一个回调参数的结果
参考:https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
答案 1 :(得分:2)
我想我现在明白你的问题。
你的executeScript的返回数据必须是可克隆的 为了被认为是结构化克隆,数据必须匹配以下数据类型之一:
在您的情况下,问题是您正在返回一个在其属性中具有函数的对象。因此,它是非结构化克隆的,这可以解释您的错误。
答案 2 :(得分:0)
根据MDN
脚本的结果是最后计算的语句,...
(类似于脚本 bash 函数如何将最后计算的结果用作其返回结果。)
该结果必须是上述@Forivin的answer中的类型列表之一。但是,这并不是对脚本中最后一条命令的通常约束,因此,它会吸引很多人,这在搜索OP错误消息时会看到许多结果。
添加字符串
"Browser.js END OF FILE"
在文件 Browser.js 的末尾(如果实际到达该行)可以安全地将结果设置为该字符串。
(注意:脚本中的各种处理程序和活动对象将继续计算,但是解释器将完成对脚本的解析,依次执行命令,并返回最终解析的行。) >
就我而言,重构脚本后出现错误
window.onhashchange=winHashHandler;
作为最后一行。只需在该行之后放置一个字符串即可消除错误。