menus.create()

使用定义项目属性的选项对象创建菜单项。

与其他异步函数不同,此函数不返回 Promise,而是使用可选的回调来传达成功或失败。这是因为它的返回值是新项目的 ID。

为了与其他浏览器兼容,Firefox 在 contextMenus 命名空间和 menus 命名空间中提供了此方法。但是,无法使用 contextMenus 命名空间创建工具菜单项 (contexts: ["tools_menu"])。

在持久性和非持久性扩展中创建菜单

创建菜单项的方式取决于您的扩展是否使用

  • 非持久性后台页面(事件页面),其中菜单在浏览器和扩展重启之间保持持久性。您可以在 runtime.onInstalled 监听器中调用 menus.create(使用特定于菜单的 ID)。这避免了在页面重启时重复尝试创建菜单项,这会在顶级调用中发生。
  • 持久性后台页面
    • 在 Chrome 中,来自持久性后台页面的菜单项会保持持久性。在 runtime.onInstalled 监听器中创建您的菜单。
    • 在 Firefox 中,来自持久性后台页面的菜单项永远不会保持持久性。无条件地从顶级调用 menus.create 来注册菜单项。

有关更多信息,请参阅后台脚本页面上的 初始化扩展 和扩展工作坊上的 事件驱动的后台脚本

语法

js
browser.menus.create(
  createProperties, // object
  () => {/* … */}   // optional function
)

参数

创建属性

对象。新菜单项的属性。

checked 可选

布尔值。复选框或单选按钮的初始状态:true 表示选中,false 表示未选中。在给定的单选按钮组中,一次只能选择一个单选按钮。

command 可选

字符串。描述用户点击项目时应采取的操作的字符串。识别值如下:

  • "_execute_browser_action":模拟点击扩展的浏览器操作,如果它有弹出窗口,则打开它(仅限清单 V2)
  • "_execute_action":模拟点击扩展的操作,如果它有弹出窗口,则打开它(仅限清单 V3)
  • "_execute_page_action":模拟点击扩展的页面操作,如果它有弹出窗口,则打开它
  • "_execute_sidebar_action":打开扩展的侧边栏

有关详细信息,请参阅 manifest.jsoncommands 中特殊快捷方式的文档。

当指定识别值之一时,点击项目不会触发 menus.onClicked 事件;而是触发默认操作,例如打开弹出窗口。否则,点击项目会触发 menus.onClicked,并且可以使用该事件来实现回退行为。

contexts 可选

数组 of menus.ContextType。此菜单项将显示的上下文的数组。如果省略此选项

  • 如果项目的父级设置了上下文,则此项目将继承其父级的上下文
  • 否则,该项目将获得上下文数组 ["page"]。
documentUrlPatterns 可选

数组 of 字符串。允许您限制项目仅应用于 URL 与给定 匹配模式 之一匹配的文档。这也适用于框架。

enabled 可选

布尔值。此菜单项是启用还是禁用。默认为 true

icons 可选

对象。一个或多个要显示在项目旁边的自定义图标。自定义图标只能为出现在子菜单中的项目设置。此属性是一个对象,其中每个提供的图标都有一个属性:属性的名称应包含图标的大小(以像素为单位),路径相对于扩展根目录中的图标。浏览器尝试为普通显示选择 16x16 像素的图标,或为高密度显示选择 32x32 像素的图标。为了避免任何缩放,您可以像这样指定图标

js
browser.menus.create({
  icons: {
    16: "path/to/geo-16.png",
    32: "path/to/geo-32.png",
  },
});

或者,您可以指定单个 SVG 图标,它将按比例缩放

js
browser.menus.create({
  icons: {
    16: "path/to/geo.svg",
  },
});

注意:顶级菜单项使用清单中指定的 icons,而不是使用此键指定的图标。

id 可选

字符串。要分配给此项目的唯一 ID。对于清单 V2 中和清单 V3 中的非持久性 后台(事件)页面 来说是强制性的。不能与此扩展的另一个 ID 相同。

onclick 可选

函数。当点击菜单项时调用的函数。事件页面不能使用此函数:相反,它们应该为 menus.onClicked 注册监听器。

parentId 可选

整数字符串。父菜单项的 ID;这使得该项目成为先前添加的项目的子项。注意:如果您创建了多个菜单项,则这些项目将放置在子菜单中。子菜单的父级将使用扩展的名称进行标记。

targetUrlPatterns 可选

数组 of 字符串。类似于 documentUrlPatterns,但允许您根据锚标记的 href 和 img/audio/video 标记的 src 属性进行筛选。此参数支持任何 URL 方案,即使是通常不允许在匹配模式中使用的方案。

title 可选

字符串。要在项目中显示的文本。除非type为“separator”,否则为必填项。

您可以在字符串中使用“%s”。如果您在菜单项中执行此操作,并且在显示菜单时页面中选择了一些文本,则所选文本将被插入到标题中。例如,如果title为“将'%s'翻译成猪拉丁语”,并且用户选择了单词“cool”,然后激活菜单,则菜单项的标题将为:“将'cool'翻译成猪拉丁语”。

如果标题包含一个&符号“&”,则下一个字符将用作项目的访问键,并且&符号不会显示。对此的例外情况是

  • 如果下一个字符也是一个&符号:则将显示一个&符号,并且不会设置访问键。实际上,“&&”用于显示一个&符号。
  • 如果下一个字符是插值指令“%s”:则不会显示&符号,也不会设置访问键。
  • 如果&符号是标题中的最后一个字符:则不会显示&符号,也不会设置访问键。

仅第一个&符号将用于设置访问键:后续的&符号不会显示,但不会设置键。因此,“&A and &B”将显示为“A and B”,并将“A”设置为访问键。

在 Firefox 的某些本地化版本(日语和中文)中,访问键用括号括起来并附加到菜单标签上,除非菜单标题本身已以访问键结尾(例如“toolkit(&K)”)。有关更多详细信息,请参阅Firefox 错误 1647373

type 可选

menus.ItemType。菜单项的类型:“normal”、“checkbox”、“radio”、“separator”。默认为“normal”。

viewTypes 可选

extension.ViewType。将显示菜单项的视图类型的列表。默认为任何视图,包括没有viewType的视图。

visible 可选

布尔值。项目是否显示在菜单中。默认为true

callback 可选

函数。在创建项目后调用。如果创建项目时有任何问题,详细信息将在runtime.lastError中提供。

返回值

整数字符串。新创建项目的ID

示例

此示例创建一个上下文菜单项,当用户在页面中选择了一些文本时显示该项目。它只是将所选文本记录到控制台。

js
browser.menus.create({
  id: "log-selection",
  title: "Log '%s' to the console",
  contexts: ["selection"],
});

browser.menus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "log-selection") {
    console.log(info.selectionText);
  }
});

此示例添加了两个单选项目,您可以使用它们来选择是否在页面上应用绿色或蓝色边框。请注意,此示例将需要activeTab 权限

js
function onCreated() {
  if (browser.runtime.lastError) {
    console.log("error creating item:", browser.runtime.lastError);
  } else {
    console.log("item created successfully");
  }
}

browser.menus.create(
  {
    id: "radio-green",
    type: "radio",
    title: "Make it green",
    contexts: ["all"],
    checked: false,
  },
  onCreated,
);

browser.menus.create(
  {
    id: "radio-blue",
    type: "radio",
    title: "Make it blue",
    contexts: ["all"],
    checked: false,
  },
  onCreated,
);

let makeItBlue = 'document.body.style.border = "5px solid blue"';
let makeItGreen = 'document.body.style.border = "5px solid green"';

browser.menus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "radio-blue") {
    browser.tabs.executeScript(tab.id, {
      code: makeItBlue,
    });
  } else if (info.menuItemId === "radio-green") {
    browser.tabs.executeScript(tab.id, {
      code: makeItGreen,
    });
  }
});

扩展示例

浏览器兼容性

BCD 表格仅在浏览器中加载

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