上下文菜单项

此用户界面选项将一个或多个项添加到浏览器上下文菜单。这是用户在网页上右键单击时出现的菜单。选项卡和书签也可以有上下文菜单,可以通过 menus API 使用。

Example of content menu items added by a WebExtension, from the context-menu-demo example

您可以使用此选项公开与特定浏览器或网页上下文相关的功能。例如,当用户单击图像时,您可以显示打开图形编辑器的功能,或者在选择页面的一部分时,您可以提供保存页面内容的功能。您可以向菜单添加普通菜单项、复选框项、单选按钮组和分隔符。使用 menus.create 添加上下文菜单项后,它将显示在所有浏览器选项卡中,但您可以通过使用 menus.remove 删除它来隐藏它。

支持的全部上下文列表可在 menus.ContextType 中找到,其中包括网页之外的上下文,例如浏览器 UI 中的书签项。例如,"在容器选项卡中打开书签" 扩展添加了一个菜单项,允许用户在新容器选项卡中打开书签 URL。

A context menu with "open in new container tab" submenu highlighted. The submenu shows personal, work, banking, shopping, and Facebook contextual identities. There is an option at the top of the submenu to select no container.

您还可以使用 menus.overrideContext 覆盖扩展页面(例如自定义侧边栏和弹出窗口)中显示的上下文菜单,以使用选项卡或书签上下文菜单代替默认上下文菜单。当您的扩展提供选项卡或书签的自定义显示时,这是一个有用的方法。该菜单会自动包含任何其他已定义选项卡或书签上下文菜单项的扩展的菜单项。您可以选择是否包含默认上下文菜单项。隐藏默认项使扩展完全控制在呈现的本机上下文菜单中显示的项,如下图所示,显示了 Tree Style Tab 扩展。

A tab context menu displayed for a tab item in the sidebar of the Tree Style Tab extension. The menu shows custom tab actions, a menu item for the extension, and a menu item for the Simple Tab Group extension.

指定上下文菜单项

您可以使用 contextMenus API 以编程方式管理上下文菜单项。但是,您需要在您的 manifest.json 中请求 contextMenus 权限才能利用 API。

json
"permissions": ["contextMenus"]

然后,您可以在扩展的后台脚本中添加(并更新或删除)上下文菜单项。若要创建菜单项,您需要指定一个 ID、标题以及它应该出现的上下文菜单

js
browser.contextMenus.create(
  {
    id: "log-selection",
    title: browser.i18n.getMessage("contextMenuItemSelectionLogger"),
    contexts: ["selection"],
  },
  onCreated,
);

然后,您的扩展将监听菜单项上的点击。传递的关于点击的项、点击发生的上下文以及点击发生的选项卡的详细信息随后可用于调用适当的扩展功能。

js
browser.contextMenus.onClicked.addListener((info, tab) => {
  switch (info.menuItemId) {
    case "log-selection":
      console.log(info.selectionText);
      break;
    // …
  }
});

图标

有关如何创建用于上下文菜单的图标的详细信息,请参阅 图标,内容来自 Acorn 设计系统 文档。

示例

GitHub 上的 webextensions-examples 存储库包含两个实现上下文菜单项的扩展示例

  • menu-demo 将几个项添加到浏览器的上下文菜单。
  • context-menu-copy-link-with-types 向链接添加了一个上下文菜单项,该项会将链接 URL 复制到剪贴板,包括纯文本和富 HTML。