menus

将项目添加到浏览器的菜单系统中。

此 API 基于 Chrome 的 "contextMenus" API,该 API 使 Chrome 扩展程序能够将项目添加到浏览器的上下文菜单中。browser.menus API 为 Chrome API 增加了一些功能。

在 Firefox 55 之前,此 API 最初也命名为 contextMenus,并且该名称已保留为别名,因此您可以使用 contextMenus 来编写可在 Firefox 和其他浏览器中运行的代码。

要使用此 API,您需要拥有 menus 权限。您也可以使用 contextMenus 别名而不是 menus,但如果这样做,则必须通过 browser.contextMenus 来访问 API。

除了 menus.getTargetElement() 之外,此 API 不能从内容脚本使用。

创建菜单项

要创建菜单项,请调用 menus.create() 方法。您将一个包含项目选项的对象传递给此方法,包括项目 ID、项目类型以及应显示它的上下文。

在使用非持久性 后台页面(事件页面)的 Firefox 扩展程序中,或在任何 Chrome 扩展程序中,您会在 runtime.onInstalled 侦听器中调用 menus.create。在使用持久性后台页面的 Firefox 扩展程序中,您会进行顶级调用。有关更多信息,请参阅 menus.create()

通过向 menus.onClicked 事件添加侦听器来监听您的菜单项的点击事件。此侦听器将收到一个包含事件详细信息的 menus.OnClickData 对象。

您可以根据在 create() 选项中提供的 type 属性的值创建四种不同类型的菜单项:

  • "normal":一个仅显示标签的菜单项
  • "checkbox":一个表示二进制状态的菜单项。它在标签旁边显示一个复选标记。单击该项目会切换复选标记。点击侦听器将收到两个额外的属性:"checked",指示项目当前是否已选中,以及 "wasChecked",指示项目在点击事件之前是否已选中。
  • "radio":一个表示一组选项中一个选项的菜单项。与复选框一样,它也在标签旁边显示一个复选标记,并且其点击侦听器会收到 "checked" 和 "wasChecked" 属性。但是,如果您创建了多个单选项目,那么这些项目将作为一组单选项目运行:组中一次只能选中一个项目,单击一个项目会使其成为已选中的项目。
  • "separator":用于分隔项目组的线条。

如果您创建了多个上下文菜单项或多个工具菜单项,则这些项将放置在子菜单中。子菜单的父项将以扩展程序的名称进行标记。例如,这是一个名为“Menu demo”的扩展程序,它添加了两个上下文菜单项

Context menu with two items labeled click me, and click me too!

图标

如果您使用 "icons" manifest 键 为您的扩展程序指定了图标,那么您的菜单项将在其标签旁边显示指定的图标。浏览器将尝试为正常显示选择一个 16x16 像素的图标,为高密度显示选择一个 32x32 像素的图标。

Context menu with two items labeled click me, and click me too!

仅对于子菜单中的项目,您可以通过将 icons 选项传递给 menus.create() 来指定自定义图标。

Context menu with two items labeled click me, and click me too!. The click me option is labeled with a green paint can icon. The click me too option is labeled with a blue paint can icon.

示例

这是一个包含 4 个项目的上下文菜单:一个普通项目,两个带有分隔符的单选项目,以及一个复选框。单选项目被赋予了自定义图标。

Context menu with four items labeled remove me, Greenify, Bluify, and uncheck me. Greenify and Bluify are radio buttons given custom icons.

您可以使用类似以下的 JavaScript 代码创建子菜单:

js
browser.menus.create(
  {
    id: "remove-me",
    title: browser.i18n.getMessage("menuItemRemoveMe"),
    contexts: ["all"],
  },
  onCreated,
);

browser.menus.create(
  {
    id: "separator-1",
    type: "separator",
    contexts: ["all"],
  },
  onCreated,
);

browser.menus.create(
  {
    id: "greenify",
    type: "radio",
    title: browser.i18n.getMessage("menuItemGreenify"),
    contexts: ["all"],
    checked: true,
    icons: {
      16: "icons/paint-green-16.png",
      32: "icons/paint-green-32.png",
    },
  },
  onCreated,
);

browser.menus.create(
  {
    id: "bluify",
    type: "radio",
    title: browser.i18n.getMessage("menuItemBluify"),
    contexts: ["all"],
    checked: false,
    icons: {
      16: "icons/paint-blue-16.png",
      32: "icons/paint-blue-32.png",
    },
  },
  onCreated,
);

browser.menus.create(
  {
    id: "separator-2",
    type: "separator",
    contexts: ["all"],
  },
  onCreated,
);

let checkedState = true;

browser.menus.create(
  {
    id: "check-uncheck",
    type: "checkbox",
    title: browser.i18n.getMessage("menuItemUncheckMe"),
    contexts: ["all"],
    checked: checkedState,
  },
  onCreated,
);

类型

菜单可能出现的不同上下文。

菜单项的类型:"normal"(普通)、"checkbox"(复选框)、"radio"(单选)、"separator"(分隔符)。

菜单项被点击时发送的信息。

属性

添加到上下文类型为 "browser_action" 或 "page_action" 的菜单项中的顶级扩展项的最大数量。

函数

创建一个新的菜单项。

返回给定 info.targetElementId 的元素。

隐藏所有默认的 Firefox 菜单项,以提供自定义上下文菜单 UI。

更新当前正在显示的菜单。

移除一个菜单项。

移除此扩展程序添加的所有菜单项。

更新先前创建的菜单项。

事件

菜单项被点击时触发。

浏览器隐藏菜单时触发。

浏览器显示菜单时触发。

扩展程序示例

浏览器兼容性

注意:此 API 基于 Chromium 的 chrome.contextMenus API。本文档摘自 Chromium 代码中的 context_menus.json