chrome.commands

说明

使用 Command API 添加可在扩展程序中触发操作的键盘快捷键,例如,用于打开浏览器操作或向扩展程序发送命令的操作。

清单

必须在清单中声明以下键才能使用此 API。

"commands"

概念和用法

Commands API 允许扩展程序开发者定义特定命令,并将其绑定到默认组合键。扩展程序接受的每个命令都必须在扩展程序的清单中声明为 "commands" 对象的属性。

属性键将用作命令的名称。命令对象可以具有两个属性。

suggested_key

可选属性,用于声明命令的默认键盘快捷键。如果省略,该命令将解除绑定。此属性可以采用字符串或对象值。

  • 字符串值用于指定应在所有平台中使用的默认键盘快捷键。

  • 借助对象值,扩展程序开发者可为每个平台自定义键盘快捷键。提供平台专用快捷方式时,有效的对象属性包括 defaultchromeoslinuxmacwindows

如需了解更多详情,请参阅键组合要求

description

用于为用户提供命令用途的简短说明的字符串。此字符串会显示在扩展程序键盘快捷键管理界面中。标准命令需要说明,但操作命令会忽略说明。

一个扩展程序可以有多个命令,但最多可以指定 4 个建议的键盘快捷键。用户可以通过 chrome://extensions/shortcuts 对话框手动添加更多快捷方式。

支持的键

以下键是可用的命令快捷键。键定义区分大小写。如果尝试使用大小写有误的键加载扩展程序,则会导致在安装时出现清单解析错误。

Alpha 键
A ... Z
数字键
0 ... 9
标准密钥字符串

常规 - CommaPeriodHomeEndPageUpPageDownSpaceInsertDelete

箭头键 - UpDownLeftRight

媒体键 - MediaNextTrackMediaPlayPauseMediaPrevTrackMediaStop

辅助键字符串

CtrlAlt(macOS 上为 Option)、ShiftMacCtrl(仅限 macOS)、Command(仅限 macOS)、Search(仅限 ChromeOS)

键组合要求

  • 扩展程序命令快捷键必须包含 CtrlAlt

    • 修饰符不能与媒体键结合使用。
  • 在 macOS 上,Ctrl 会自动转换为 Command

    • 如需在 macOS 上使用 Ctrl 键,请在定义 "mac" 快捷方式时将 Ctrl 替换为 MacCtrl

    • 在其他平台中组合使用 MacCtrl 将会导致验证错误,并阻止该扩展程序安装。

  • Shift 在所有平台上都是可选的修饰符。

  • Search 是 ChromeOS 专用的可选修饰符。

  • 某些操作系统和 Chrome 快捷键(例如窗口管理)始终优先于扩展程序命令快捷键,并且无法被覆盖。

处理命令事件

manifest.json:

{
  "name": "My extension",
  ...
  "commands": {
    "run-foo": {
      "suggested_key": {
        "default": "Ctrl+Shift+Y",
        "mac": "Command+Shift+Y"
      },
      "description": "Run \"foo\" on the current page."
    },
    "_execute_action": {
      "suggested_key": {
        "windows": "Ctrl+Shift+Y",
        "mac": "Command+Shift+Y",
        "chromeos": "Ctrl+Shift+U",
        "linux": "Ctrl+Shift+J"
      }
    }
  },
  ...
}

在 Service Worker 中,您可以使用 onCommand.addListener 将处理程序绑定到清单中定义的每个命令。例如:

service-worker.js

chrome.commands.onCommand.addListener((command) => {
  console.log(`Command: ${command}`);
});

操作命令

_execute_action (Manifest V3)、_execute_browser_action (Manifest V2) 和 _execute_page_action (Manifest V2) 命令已预留,分别用于触发您的操作、浏览器操作或网页操作。这些命令不会像标准命令一样分派 command.onCommand 事件。

如果您需要根据弹出式窗口的打开情况执行操作,不妨考虑在弹出式窗口的 JavaScript 中监听 DOMContentLoaded 事件。

范围

默认情况下,命令的作用域限定为 Chrome 浏览器。这意味着,当浏览器没有焦点时,命令快捷方式处于无效状态。从 Chrome 35 开始,扩展程序开发者可以选择将命令标记为“全局”。当 Chrome 没有焦点时,全局命令也能发挥作用。

全局命令的键盘快捷键建议仅限于 Ctrl+Shift+[0..9]。这是一种保护措施,可最大限度地降低其他应用中快捷键被替换的风险,例如,如果允许将 Alt+P 设为全局快捷键,那么用于打开打印对话框的键盘快捷键可能在其他应用中可能不起作用。

最终用户可以使用 chrome://extensions/shortcuts 中提供的界面,随意将全局命令重新映射到其首选按键组合。

例如:

manifest.json:

{
  "name": "My extension",
  ...
  "commands": {
    "toggle-feature-foo": {
      "suggested_key": {
        "default": "Ctrl+Shift+5"
      },
      "description": "Toggle feature foo",
      "global": true
    }
  },
  ...
}

示例

以下示例演示了 Commands API 的核心功能。

基本命令

命令允许扩展程序将逻辑映射到用户可调用的键盘快捷键。从最基本的层面上说,命令只需在扩展程序的清单中声明命令和进行监听器注册,如以下示例所示。

manifest.json:

{
  "name": "Command demo - basic",
  "version": "1.0",
  "manifest_version": 3,
  "background": {
    "service_worker": "service-worker.js"
  },
  "commands": {
    "inject-script": {
      "suggested_key": "Ctrl+Shift+Y",
      "description": "Inject a script on the page"
    }
  }
}

service-worker.js

chrome.commands.onCommand.addListener((command) => {
  console.log(`Command "${command}" triggered`);
});

操作命令

用法部分中所述,您还可以将命令映射到扩展程序的操作。以下示例注入了一个内容脚本,当用户点击扩展程序的操作或触发键盘快捷键时,该脚本会在当前页面上显示提醒。

manifest.json:

{
  "name": "Commands demo - action invocation",
  "version": "1.0",
  "manifest_version": 3,
  "background": {
    "service_worker": "service-worker.js"
  },
  "permissions": ["activeTab", "scripting"],
  "action": {},
  "commands": {
    "_execute_action": {
      "suggested_key": {
        "default": "Ctrl+U",
        "mac": "Command+U"
      }
    }
  }
}

service-worker.js

chrome.action.onClicked.addListener((tab) => {
  chrome.scripting.executeScript({
    target: {tabId: tab.id},
    func: contentScriptFunc,
    args: ['action'],
  });
});

function contentScriptFunc(name) {
  alert(`"${name}" executed`);
}

// This callback WILL NOT be called for "_execute_action"
chrome.commands.onCommand.addListener((command) => {
  console.log(`Command "${command}" called`);
});

验证命令已注册

如果某个扩展程序尝试注册的快捷方式已被其他扩展程序使用,则第二个扩展程序的快捷方式将无法按预期注册。您可以通过预测这种可能性并在安装时检查是否发生碰撞来提供更可靠的最终用户体验。

service-worker.js

chrome.runtime.onInstalled.addListener((details) => {
  if (details.reason === chrome.runtime.OnInstalledReason.INSTALL) {
    checkCommandShortcuts();
  }
});

// Only use this function during the initial install phase. After
// installation the user may have intentionally unassigned commands.
function checkCommandShortcuts() {
  chrome.commands.getAll((commands) => {
    let missingShortcuts = [];

    for (let {name, shortcut} of commands) {
      if (shortcut === '') {
        missingShortcuts.push(name);
      }
    }

    if (missingShortcuts.length > 0) {
      // Update the extension UI to inform the user that one or more
      // commands are currently unassigned.
    }
  });
}

类型

Command

属性

  • 说明

    字符串(可选)

    Extension 命令说明

  • name

    字符串(可选)

    Extension 命令的名称

  • 快捷指令

    字符串(可选)

    对此命令有效的快捷键,如果未激活,则为空白。

方法

getAll()

Promise
chrome.commands.getAll(
  callback?: function,
)

返回此扩展程序的所有已注册扩展程序命令及其快捷方式(如果有效)。在 Chrome 110 之前,此命令不会返回 _execute_action

参数

  • callback

    函数(可选)

    callback 参数如下所示:

    (commands: Command[])=>void

返回

  • Promise<Command[]>

    Chrome 96 及更高版本

    Manifest V3 及更高版本支持 promise,但提供回调以实现向后兼容性。您不能在同一个函数调用中同时使用这两者。promise 使用传递给回调函数的同一类型进行解析。

活动

onCommand

chrome.commands.onCommand.addListener(
  callback: function,
)

使用键盘快捷键激活注册的命令时触发。

参数

  • callback

    功能

    callback 参数如下所示:

    (command: string,tab?: tabs.Tab)=>void

    • 命令

      string

    • 标签页

      tabs.Tab 可选