我使用以下方法从非持久性后台脚本添加上下文菜单项:
chrome.contextMenus.create({
title: 'Get Code',
id: 'myUniqueIdForThisExtension123',
contexts: ['all'],
onclick: onClickHandler
});
function onClickHandler() {}
documentation只是声明:
分配给此项目的唯一ID。对事件页面必须提供。不能与此扩展程序的其他ID相同。
所以我添加了一个唯一的ID,但我仍然无法使其工作。上下文菜单中没有插入任何新内容。
答案 0 :(得分:17)
你说你有一个非持久性的背景页面,所以你应该有一个manifest.json
文件,如下所示:
{
"manifest_version": 2,
"name": "My extension",
"description": "My description",
"version": "1",
"permissions": ["contextMenus"],
"background": {
"persistent": false,
"scripts": [
"/background.js"
]
}
}
现在,由于你有一个非持久性的背景页面,当你需要使用上下文菜单时,你必须使用正确的监听器来“唤醒它”。
使用活动页面时的最佳做法:
[...]
- 如果您正在使用上下文菜单API,请将字符串ID参数传递给
醇>contextMenus.create
,然后使用contextMenus.onClicked
回调代替onclick
参数到contextMenus.create
。
因此,简单地说,您的错误是使用onclick
参数而不是contextMenus.onClicked.addListener()
中的background.js
方法。
我已经说过你应该使用onClicked
事件,但我想补充一点,提到x a's answer:
您应该在
runtime.onInstalled
的事件处理程序中通过contextMenus.create
注册一个上下文菜单,因为这些上下文菜单注册仍然存在。
简单地说,一旦创建,上下文菜单一直存在于您的扩展中,最佳做法是一次只定义它们:安装(或更新)扩展时,并在每次后台页面添加监听器装了。
chrome.runtime.onInstalled.addListener(function() {
chrome.contextMenus.create({
title: 'My menu',
id: 'menu1', // you'll use this in the handler function to identify this context menu item
contexts: ['all'],
});
});
chrome.contextMenus.onClicked.addListener(function(info, tab) {
if (info.menuItemId === "menu1") { // here's where you'll need the ID
// do something
}
});
这就是在事件页面中创建上下文菜单所需的内容,如chrome.contextMenus
API的 documentation page 所示。
答案 1 :(得分:5)
修改Marco Bonelli wrote:
如果您想要使用事件页或非持久性背景页,则在调用时,应通过contextMenus.create
注册上下文菜单在runtime.onInstalled
的事件处理程序中,因为这些上下文菜单注册“仍然存在”。
每次重新加载事件页面时,您必须为contextMenus.onClicked
事件添加侦听器函数,但是,愿望的注册监听该事件仍然存在,而处理程序回调本身不。
为了正确执行,请从runtime.onInstalled
注册您的上下文菜单,但使用顶级或其他代码中的contextMenus.onClicked.addListener
设置事件处理程序回调本身,保证每次加载事件页面时都会执行。 [1]