说明
使用 commands API 添加键盘快捷键,以触发扩展程序中的操作,例如,打开浏览器操作或向扩展程序发送命令的操作。
清单
概念和用法
Commands API 允许扩展程序开发者定义特定命令,并将其绑定到默认组合键。扩展程序接受的每个命令都必须在扩展程序的清单中声明为 "commands" 对象的属性。
属性键用作命令的名称。命令对象可以采用两个属性。
suggested_key一个可选属性,用于声明命令的默认键盘快捷键。如果省略,该命令将解除绑定。此属性可以采用字符串或对象值。
字符串值指定应在所有平台上使用的默认键盘快捷键。
- 对象值允许扩展程序开发者为每个平台自定义键盘快捷键。提供平台专用快捷键时,有效的对象属性为
default、chromeos、linux、mac和windows。
如需了解更多详情,请参阅组合键要求。
- 对象值允许扩展程序开发者为每个平台自定义键盘快捷键。提供平台专用快捷键时,有效的对象属性为
description- 一个字符串,用于向用户简要说明命令的用途。此字符串会显示在扩展程序键盘快捷键管理界面中。 标准命令必须提供说明,但操作命令会忽略说明。
一个扩展程序可以有多个命令,但最多只能指定四个建议的键盘快捷键。用户可以从 chrome://extensions/shortcuts 对话框中手动添加更多快捷方式。
支持的键
以下按键是可用的命令快捷键。键定义区分大小写。尝试加载大小写不正确的键的扩展程序会导致在安装时出现清单解析错误。
- Alpha 键
A…Z- 数字键
0…9- 标准键字符串
常规 -
Comma、Period、Home、End、PageUp、PageDown、Space、Insert、Delete箭头键 -
Up、Down、Left、Right媒体键 -
MediaNextTrack、MediaPlayPause、MediaPrevTrack、MediaStop- 辅助键字符串
Ctrl、Alt、Shift、MacCtrl(仅限 macOS)、Option(仅限 macOS)、Command(仅限 macOS)、Search(仅限 ChromeOS)
组合键要求
扩展程序命令快捷键必须包含
Ctrl或Alt。修饰键不能与媒体键组合使用。
在许多 macOS 键盘上,
Alt是指 Option 键。在 macOS 上,
Command或MacCtrl也可以代替Ctrl使用,Option键可以代替Alt使用(请参阅下一个要点)。
在 macOS 上,
Ctrl会自动转换为Command。Command也可用于"mac"快捷键,以明确指代 Command 键。如需在 macOS 上使用 Control 键,请在定义
"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:
browser.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:
browser.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:
browser.action.onClicked.addListener((tab) => {
browser.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"
browser.commands.onCommand.addListener((command) => {
console.log(`Command "${command}" called`);
});
验证已注册的命令
如果某个扩展程序尝试注册已被其他扩展程序使用的快捷键,则第二个扩展程序的快捷键将无法按预期注册。您可以预见这种可能性,并在安装时检查是否存在冲突,从而提供更强大的最终用户体验。
service-worker.js:
browser.runtime.onInstalled.addListener((details) => {
if (details.reason === browser.runtime.OnInstalledReason.INSTALL) {
checkCommandShortcuts();
}
});
// Only use this function during the initial install phase. After
// installation the user may have intentionally unassigned commands.
function checkCommandShortcuts() {
browser.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
属性
-
说明
字符串 可选
扩展程序命令说明
-
name
字符串 可选
扩展程序命令的名称
-
快捷方式
字符串 可选
此命令的有效快捷键;如果无效,则为空白。
方法
getAll()
browser.commands.getAll(): Promise<Command[]>
返回此扩展程序的所有已注册扩展程序命令及其快捷键(如果处于有效状态)。在 Chrome 110 之前,此命令不会返回 _execute_action。
返回
-
Promise<Command[]>
Chrome 96 及更高版本 browser.*(自 Chrome 148 起)解析为已注册命令的列表。