在非持久性后台脚本上添加上下文菜单项?

时间:2014-10-07 21:48:33

标签: javascript google-chrome google-chrome-extension

我使用以下方法从非持久性后台脚本添加上下文菜单项:

chrome.contextMenus.create({
  title: 'Get Code',
  id: 'myUniqueIdForThisExtension123',
  contexts: ['all'],
  onclick: onClickHandler
});

function onClickHandler() {}

documentation只是声明:

  

分配给此项目的唯一ID。对事件页面必须提供。不能与此扩展程序的其他ID相同。

所以我添加了一个唯一的ID,但我仍然无法使其工作。上下文菜单中没有插入任何新内容。

2 个答案:

答案 0 :(得分:17)

你说你有一个非持久性的背景页面,所以你应该有一个manifest.json文件,如下所示:

{
    "manifest_version": 2,

    "name": "My extension",
    "description": "My description",
    "version": "1",

    "permissions": ["contextMenus"],
    "background": {
        "persistent": false,
        "scripts": [
            "/background.js"
        ] 
    }
}

现在,由于你有一个非持久性的背景页面,当你需要使用上下文菜单时,你必须使用正确的监听器来“唤醒它”。

引自 official documentation

  

使用活动页面时的最佳做法:

     

[...]

     
      
  1. 如果您正在使用上下文菜单API,请将字符串ID参数传递给contextMenus.create,然后使用 contextMenus.onClicked回调代替onclick 参数到contextMenus.create
  2.   

因此,简单地说,您的错误是使用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]