【发布时间】:2015-05-03 12:10:09
【问题描述】:
我正在尝试向 Chrome 上下文菜单添加一项功能,以从选定的文本中添加待办事项。我从background.js 的上下文菜单中传递选定的文本,如下所示:
function onClickHandler(info, tab) {
chrome.extension.sendMessage(info.selectionText, function(){});
}
chrome.contextMenus.onClicked.addListener(onClickHandler);
chrome.runtime.onInstalled.addListener(function() {
chrome.contextMenus.create({"title": "Add: %s", "contexts":["selection"]});
});
然后在app.js 内容脚本中监听消息:
chrome.extension.onMessage.addListener(function(task, sender, sendResponse) {
Task.setNewTask(task); // Saves the task in storage
});
当我的扩展在标签页中打开时,该消息被正确接收,但在它关闭时不起作用。这是因为我没有在我的manifest.json 中将app.js 设置为后台脚本:
"permissions": [
"storage",
"contextMenus",
"tabs",
"notifications"
],
"background": {
"scripts": ["background.js"]
}
我没有将app.js 包含为后台脚本的原因是它包含了我的应用程序的其余代码,当尝试在没有 DOM 的情况下在后台运行时会产生错误。
不幸的是,我无法轻松地在 background.js 文件中进行存储,因为我需要访问我的内容脚本中的函数 Task.setNewTask。
我的应用有多种存储数据的方法,具体取决于环境——如果我不得不将这个逻辑放在background.js 中,将会有很多重复。
我尝试将我的应用作为背景页面:
"background": {
"page": "index.html"
},
然后在页面底部包含两个脚本:
<script src="background.js"></script>
<script src="js/app.js"></script>
</body>
但我的应用仍然不会在后台添加新任务。
有没有办法:
- 让
background.js尽可能简单, - 不包括
app.js作为后台脚本, -
app.js不在后台时仍会收到消息?
【问题讨论】:
标签: javascript google-chrome-extension