Commands
概念和用法commands API
可用于添加可触发扩展程序中操作的键盘快捷键,例如,打开浏览器操作或向扩展程序发送命令的操作。manifest.json
声明 commands
,才能使用此 API
。chrome://extensions/shortcuts
对话框手动添加更多快捷方式。属性键 将用作命令的名称。命令对象可以具有两个属性。
suggested_key
可选属性,用于声明命令的默认键盘快捷键。如果省略,该命令将解除绑定。此属性可以接受字符串或对象值。
string
:用于指定应在所有平台中使用的默认键盘快捷键。object
:组合键对象description
用于为用户提供命令用途的简短说明的字符串。字符串类型。标准命令必须包含说明,而操作命令会忽略说明。
string
"commands": {
"run-foo": {
"suggested_key": {
"default": "Ctrl+Shift+Y",
"mac": "Command+Shift+Y"
},
"description": "Run "foo" on the current page."
}
}
Alpha
键A … Z
Comma, Period, Home, End, PageUp, PageDown, Space, Insert, Delete
Up, Down, Left, Right
MediaNextTrack, MediaPlayPause, MediaPrevTrack, MediaStop
Ctrl
、Alt
(macOS
上为 Option
)、Shift
、MacCtrl
(仅限 macOS
)、Command
(仅限 macOS
)、Search
(仅限 ChromeOS
)扩展程序命令快捷方式必须包含 Ctrl
或 Alt
。
在 macOS
上,Ctrl
会自动转换为 Command
。
macOS
上使用 Ctrl
键,请在定义 "mac"
快捷方式时将 Ctrl
替换为 MacCtrl
。MacCtrl
用于其他平台会导致出现验证错误,并会阻止该扩展程序安装。Shift
是所有平台上的可选修饰符。
Search
是 ChromeOS
独有的可选修饰符。
某些操作系统和 Chrome
快捷方式(例如窗口管理)始终优先于扩展程序命令快捷方式,因此无法被覆盖。
{
"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
将处理程序绑定到清单中定义的每个命令。
chrome.commands.onCommand.addListener((command) => {
console.log(`Command: ${command}`);
});
_execute_action (Manifest V3)、_execute_browser_action (Manifest V2)
和 _execute_page_action (Manifest V2)
命令分别预留用于触发操作、浏览器操作或网页操作的操作。
默认情况下,commands
的适用范围为 Chrome
浏览器。这意味着,当浏览器没有焦点时,命令快捷方式处于非活动状态。
全局命令的键盘快捷键建议仅限 Ctrl+Shift
+[0…9]。这是一种保护措施,可最大限度地降低覆盖其他应用中快捷键的风险。
借助命令,扩展程序可以将逻辑映射到用户可以调用的键盘快捷键。最基本的命令是只需扩展程序清单中的命令声明和监听器注册。
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.
}
});
}
Commands
类型(Types
)、方法(Methods
)和事件(Events
)Command
属性description
可选属性,Command
描述
string
name
可选属性,Command
名称
string
shortcut
可选属性,此命令已启用快捷键,否则留空。
string
getAll()
返回此扩展程序的所有已注册的扩展程序命令及其快捷方式
chrome.commands.getAll(
callback?: function,
)
callback
参数如下所示:(commands: Command[])=>void
Promise<
Command
[]>
onCommand
使用键盘快捷键激活注册的命令时触发
chrome.commands.onCommand.addListener(
callback: function,
)
callback:function
callback
参数如下所示:(command: string,tab?: tabs.Tab)=>void