让我们说,我有一个功能:
var rand = function(n) {
return Math.floor(Math.random() * n);
}
我可以在没有copypaste的内容脚本和后台脚本中使用此功能吗?
谢谢。
答案 0 :(得分:18)
是。 您可以拥有一个外部JS文件,该文件作为后台和内容脚本(与任何普通的JS文件一样)的一部分加载。只需将它添加到清单中的后台和内容脚本文件数组中,它就会为您加载。
例如,如果我们的共享功能位于sharedFunctions.js
,则使用它们的内容脚本位于mainContentScript.js
中,后台代码位于mainBackground.js
中(全部位于js
子文件夹中)我们可以在清单中做这样的事情:
"background": {
"scripts": [ "js/sharedFunctions.js", "js/mainBackground.js" ]
},
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["js/sharedFunctions.js", "js/mainContentScript.js"]
}
]
注意:请确保在使用它的其他文件之前按正确的顺序加载。
或者您也可以在background.html中将其添加为脚本标记(带有相对URL),并且只在清单中将其添加到内容脚本的JS数组中。所以清单看起来像:
"background": {
"page": "background.html"
},
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["js/sharedFunctions.js", "js/mainContentScript.js"]
}
]
并且background.html文件将包含以下脚本标记:
<script type="text/javascript" src="js/sharedFunctions.js"></script>
修改:此外,还要与扩展程序的其他部分中的其他作用域共享(遗憾的是,内容脚本中没有这些作用域)。
您还可以将要共享的功能驻留在后台脚本中,并通过chrome.runtime.getBackgroundPage()
与您联系,您可以在此处详细了解:
https://developer.chrome.com/extensions/runtime#method-getBackgroundPage
所以,假设您在背景脚本中将rand()
函数声明为全局变量(这意味着它是背景窗口对象的属性),您可以在脚本开头处执行此类操作在另一个范围内(这可以是一个像browserAction窗口一样的弹出上下文):
var background, newRandomNumber;
chrome.runtime.getBackgroundPage(function(backgroundWindow){
background = backgroundWindow;
newRandomNumber = background.rand();
})
这样,您还可以使用变量background
来访问背景窗口对象上的任何属性或方法集。请注意,此函数以异步方式运行,这意味着只有在调用回调之后才会定义变量background和newRandomNumber。
答案 1 :(得分:1)
是的,你可以把它放在一个单独的JS文件中并加载它们。
说,你有一个包含所有这些功能的文件utils.js
。
然后你可以像这样加载背景页面:
"background": {
"scripts": [ "utils.js", "background.js" ]
},
内容脚本如下:
"content_scripts": [
{
"matches": ["..."],
"js": ["utils.js", "content.js"]
}
],
或者,如果您正在使用程序化注入,请将调用链接起来:
chrome.tabs.executeScript(tabId, {file: "utils.js"}, function(){
chrome.tabs.executeScript(tabId, {file: "content.js"}, yourActualCallback);
});