您说您有一个非持久化的后台页面,因此您应该拥有一个类似于以下内容的 manifest.json
文件:
{
"manifest_version": 2,
"name": "My extension",
"description": "My description",
"version": "1",
"permissions": ["contextMenus"],
"background": {
"persistent": false,
"scripts": [
"/background.js"
]
}
}
现在,由于您有一个非持久的后台页面,您必须使用正确的监听器在需要使用上下文菜单时“唤醒”它。
引用自官方文档(注:此链接指向2014年的文档存档副本,已过时):
使用事件页的最佳实践:
[...]
- 如果您正在使用上下文菜单API,请将字符串id参数传递给
contextMenus.create
,并使用contextMenus.onClicked
回调而不是onclick
参数到contextMenus.create
。
所以,简单来说,您的错误是在background.js
中使用了onclick
参数而不是contextMenus.onClicked.addListener()
方法。
解决方案
我已经说过你应该使用onClicked
事件,但是我想引用x a's answer的话语:
您应该通过runtime.onInstalled
的事件处理程序注册上下文菜单,因为这些上下文菜单注册无论如何都会持久存在。
因此,简单地说,既然创建了上下文菜单后,它们会在您的扩展中持久存在,最佳实践是只在安装(或更新)扩展时定义一次,并在每次加载后台页面时添加监听器。
chrome.runtime.onInstalled.addListener(function() {
chrome.contextMenus.create({
title: 'My menu',
id: 'menu1',
contexts: ['all'],
});
});
chrome.contextMenus.onClicked.addListener(function(info, tab) {
if (info.menuItemId === "menu1") {
}
});
这就是您在事件页中创建上下文菜单所需的内容,如 chrome.contextMenus API 的 documentation page
所示。
"background": { "persistent": false, scripts: [] }
。 - Zhianc