Invoker Commands API 说明文档
HTML Invoker Commands API 是 Web 平台上一个新兴的声明式 API,通过 HTML 本身就能控制 UI 交互元素(如弹出框、对话框等),减少对手写 JavaScript 的依赖,从而改善页面首屏加载体验。
背景与目标
过去常见的交互模式,比如点击按钮弹出一个对话框、显示/隐藏弹出菜单等,需要开发者编写大量事件监听器和逻辑代码。在资源受限或初始加载场景下,这会导致延迟和性能问题。Invoker Commands API 的目标是用原生、声明式的方式,通过 HTML 直接表达这些行为,减少开发和运行时对 JavaScript 的依赖,从而提高交互的即时性和可访问性。
核心概念
声明式控制按钮
Invoker Commands API 为 <button> 元素增加了两个核心属性:
commandfor:指定该按钮控制的目标元素 IDcommand:定义要执行的操作名称
这两者联合起来,使按键行为可以由浏览器原生执行,不再需要手写监听器。
HTML 属性详解
| 属性 | 类型 | 说明 |
|---|---|---|
commandfor | string | 目标元素的 id,用于指定被控制元素 |
command | string | 执行的命令标识(如内置命令或自定义命令) |
内置命令
当前 API 内置了一些常用命令,用于控制 UI 组件:
弹出框(Popover)
toggle-popover:切换显示 / 隐藏状态show-popover:显示弹出框hide-popover:隐藏弹出框
对话框(Dialog)
show-modal:以模态方式展示对话框close:关闭对话框
这些命令可以让按钮直接控制对应的组件行为,而不必绑定事件处理器。
自定义命令
除了内置命令,Invoker API 支持开发者定义自定义命令,以扩展更多行为。自定义命令名称必须以两个短横线 -- 开头(类似 CSS 自定义属性),并且通常需要监听 command 事件来处理行为。
自定义命令示例
<button commandfor="my-img" command="--rotate-left">向左旋转</button>
<button commandfor="my-img" command="--rotate-right">向右旋转</button>
<img id="my-img" src="photo.jpg" alt="示例图片" />
const img = document.getElementById("my-img");
img.addEventListener("command", (e) => {
if (e.command === "--rotate-left") {
img.style.rotate = "-90deg";
} else if (e.command === "--rotate-right") {
img.style.rotate = "90deg";
}
});
上述示例展示了如何通过自定义命令,在不依赖按钮事件监听器的前提下,对目标元素做业务逻辑处理。
使用示例
声明式弹出菜单
<button commandfor="popover1" command="toggle-popover">
切换弹出菜单
</button>
<div id="popover1" popover>
<button commandfor="popover1" command="hide-popover">关闭</button>
弹出内容...
</div>
声明式对话框
<button commandfor="dialog1" command="show-modal">打开弹窗</button>
<dialog id="dialog1">
<p>弹框内容</p>
<button commandfor="dialog1" command="close">关闭</button>
</dialog>
这些都是常见 UI 组件的实现方式,无需编写 JavaScript 事件监听器即可实现交互。
JavaScript API
除了 HTML 属性外,相关 DOM 接口也有对应的 JS 属性:
| 属性 | 对应说明 |
|---|---|
HTMLButtonElement.commandForElement | 对应按钮的 commandfor 属性 |
HTMLButtonElement.command | 对应按钮的 command 属性 |
CommandEvent | 当按钮触发命令时,在目标元素上触发的事件对象 |
通过这些 JavaScript 属性,开发者可以在脚本中读取或动态设置命令行为。
浏览器兼容与状态
截至 2026 年初,该 API 已在主流浏览器中实现基础支持:
- Chrome 135+
- Firefox 144+
- Safari 26.2+(最新完成基础支持)
这意味着开发者可以放心在大多数现代浏览器环境中使用该 API 构建 UI,而不必担心过长等待 JavaScript 加载才能交互。
与传统方式对比
与 JS 事件监听器
历史上我们要通过添加事件监听器并在回调中调用 API 来实现 UI 控制,例如:
button.addEventListener("click", () => dialog.showModal());
而使用 Invoker Commands API,则可以将行为直接写在 HTML 中:
<button commandfor="dialog" command="show-modal">打开</button>
这简化了代码结构并提升初始交互速度。
使用建议
- 适用于交互量较小、希望减少初始 JavaScript 的页面
- 可以作为渐进增强(Progressive Enhancement)机制,在不支持的浏览器降级为常规事件处理
- 在复杂逻辑时仍需配合自定义命令和事件监听器
参考资料
最后更新于 2026-03-03 20:36
