我正在处理需要在后台运行的小型Chrome扩展程序。但是,据我所知,当我使用弹出窗口时,这是不可能的。经过一些阅读后,似乎最好的选择是使用popup.js
函数创建background.js
以便运行chrome.extension.getBackgroundPage()
。
有人可以告诉我一个如何完成的例子吗?
这是清单:
"browser_action": {
"permissions": ["background"],
"default_popup": "popup.html"},
"options_page": "options.html",
"background": {
"scripts": ["background.js"],
"persistent" : true
}
我在popup.html
中包含了popup.js参考:
<script src="popup.js"></script>
并在popup.js
var bkg = chrome.runtime.getBackgroundPage();
所以现在我需要一种激活background.js
的方法
我是否需要在background.js
popup.js
内运行相关功能,
或者给出background.js
运行的一般命令?
答案 0 :(得分:4)
是的,您需要在弹出窗口中从后台调用函数。这是一个简单的例子,演示了它是如何工作的。
<强> background.js 强>
function backgroundFunction () {
return "hello from the background!"
}
<强> popup.js 强>
(function () {
var otherWindows = chrome.extension.getBackgroundPage();
console.log(otherWindows.backgroundFunction());
})();
当你检查你的popup.js时,你会看到“你好!”在你的控制台中。 GetBackgroundPage()只返回背景页面的窗口对象,因为您可能知道所有变量都附加到此窗口对象,因此您可以通过这种方式访问后台脚本中定义的函数。
示例代码demonstrating this in chrome documentation请参阅Idle Simple Example并查看文件history.js
答案 1 :(得分:3)
加载后台页面,然后将扩展程序加载到Chrome中。
将弹出页面视为普通网页:在此处,您需要使用chrome.runtime向后台页面发出请求。
通常,我使用隐式(时间)或显式(永久)通道。使用时间通道:
的 popup.js 强> 的
chrome.runtime.onMessage.addListener(function (answer) { /* your code */ }
chrome.runtime.sendMessage({cmd: "shutdown"});
的 background.js 强> 的
chrome.runtime.onMessage.addListener(function (request) {
if (request.cmd === "shutdown") {
shutdown();
}
}
使用永久频道:
的 popup.js 强> 的
var port = chrome.runtime.connect({name: "myChannel"});
port.onMessage.addListener(function (answer) { /* your code */ })
port.postMessage({cmd: "shutdown"});
的 background.js 强> 的
chrome.runtime.onConnect.addListener(function (port) {
port.onMessage.addListener(function (request) {
if (request.cmd === "shutdown") {
shutdown();
}
}
}
UPD。虽然这种content-backgrounf通信方式功能齐全,但使用chrome.runtime.getBackgroundPage()
调用后台脚本中的函数的当前规范建议是请求不应该是异步的(因此,需要更少的编码并且更容易阅读代码)。请参阅the manual以及此帖的其他答案,以澄清此事。