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

Zhi*_*anc 9 javascript google-chrome google-chrome-extension

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

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

function onClickHandler() {}
Run Code Online (Sandbox Code Playgroud)

文件只是规定:

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

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

Mar*_*lli 20

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

{
    "manifest_version": 2,

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

    "permissions": ["contextMenus"],
    "background": {
        "persistent": false,
        "scripts": [
            "/background.js"
        ] 
    }
}
Run Code Online (Sandbox Code Playgroud)

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

引自官方文件:

使用事件页面时的最佳做法:

[...]

  1. 如果您正在使用上下文菜单API,请将字符串id参数传递给contextMenus.create,并使用contextMenus.onClicked回调而不是onclick参数来contextMenus.create.

所以,简单地说,您的错误是使用onclick参数而不是contextMenus.onClicked.addListener()您的方法background.js.

我已经说过你应该使用这个onClicked事件,但我想补充一点,参考xa的答案:

您应该contextMenus.create在事件处理程序中注册上下文菜单runtime.onInstalled,因为这些上下文菜单注册仍然存在.

简单地说,一旦创建,上下文菜单一直存在于您的扩展中,最佳做法是只定义它们一次:安装(或更新)扩展时,并在每次加载后台页面时添加监听器.

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
    }
});
Run Code Online (Sandbox Code Playgroud)

这就是你需要在活动页面创建上下文菜单,如图所示的文档页面中的chrome.contextMenusAPI.


小智 7

Ammending什么马可白腹中写道

如果你想使用活动页面或一个非持久性背景页面,正如你所说,你应该通过注册一个上下文菜单contextMenus.create中的事件处理程序runtime.onInstalled,因为这些上下文菜单注册“坚持”呢。

不过,contextMenus.onClicked每次重新加载事件页面时,您都必须为该事件添加侦听器功能,因为您希望监听该事件的注册持续存在,而处理程序回调本身却没有

因此,要做正确的事,请从注册您的上下文菜单runtime.onInstalled,但是使用contextMenus.onClicked.addListener顶级代码或其他代码来设置事件处理程序回调本身,这样可以确保每次加载事件页面时都执行该回调函数。[ 1 ]