Um Guia Rápido para a API de Comandos Invoker
Se você já conectou um botão para abrir um elemento <dialog>, você conhece o processo: consultar o elemento, anexar um listener de clique, chamar showModal(). Funciona, mas é um código repetitivo que você escreve várias vezes. A API de Comandos Invoker muda isso ao permitir que você declare essa relação diretamente no HTML — sem JavaScript necessário para os casos mais comuns.
No final de 2025, a API de Comandos Invoker atingiu disponibilidade Baseline em Chrome/Edge, Firefox e Safari, tornando-a uma escolha prática para projetos modernos. Você pode verificar o suporte atual dos navegadores em webstatus.dev ou caniuse.com.
Pontos-Chave
- A API de Comandos Invoker permite controlar diálogos e popovers de forma declarativa usando os atributos
commandforecommandem elementos<button>— sem necessidade de JavaScript para comandos integrados. - Comandos integrados como
show-modal,close,request-closee alternadores de popover lidam automaticamente com o posicionamento na camada superior, gerenciamento de foco e acessibilidade. - Comandos personalizados (prefixados com
--) permitem definir seus próprios comportamentos mantendo um padrão de conexão declarativo e limpo no seu HTML. - Sempre defina
type="button"em botões invoker para evitar que os padrões de envio de formulário interfiram com o atributocommand.
O Que São os Atributos command e commandfor?
A API de Comandos Invoker introduz dois atributos HTML em elementos <button>:
commandfor— oiddo elemento alvo que você deseja controlarcommand— a ação a ser executada nesse alvo quando o botão é ativado
Juntos, eles formam uma ligação declarativa entre um botão invocador e seu alvo. Quando o botão é clicado, pressionado via teclado ou ativado de outra forma, o navegador despacha um CommandEvent no elemento alvo e — para comandos integrados — executa o comportamento correspondente automaticamente.
Importante: Sempre adicione
type="button"a qualquer botão usando esses atributos. Sem isso, botões dentro de formulários assumem o padrãotype="submit", o que causa comportamento inesperado.
Controlando Diálogos e Popovers com HTML
É aqui que a API entrega o valor mais imediato. Anteriormente, controlar um elemento <dialog> exigia JavaScript. Agora você pode fazer isso de forma declarativa:
<button type="button" commandfor="my-dialog" command="show-modal">
Abrir Diálogo
</button>
<dialog id="my-dialog">
<p>Olá do diálogo!</p>
<button type="button" commandfor="my-dialog" command="request-close">
Fechar
</button>
</dialog>
Sem JavaScript. O navegador lida com o posicionamento na camada superior, captura de foco e restauração do foco quando o diálogo fecha.
Referência de Comandos Integrados
| Elemento Alvo | Valor de command | Comportamento |
|---|---|---|
<dialog> | show-modal | Abre como um diálogo modal |
<dialog> | close | Fecha o diálogo imediatamente |
<dialog> | request-close | Solicita fechamento (respeita o evento cancel) |
[popover] | toggle-popover | Alterna popover aberto/fechado |
[popover] | show-popover | Mostra o popover |
[popover] | hide-popover | Oculta o popover |
Para popovers, isso serve a um propósito similar ao antigo atributo popovertarget. A API de Comandos Invoker é um mecanismo mais geral para ações declarativas de UI, mas os atributos originais de popover ainda existem e permanecem suportados. Veja o guia MDN para a API Popover para detalhes.
Discover how at OpenReplay.com.
Acessibilidade Integrada
Para comandos integrados, o navegador lida automaticamente com os principais comportamentos de acessibilidade e interação. Os comandos de diálogo se integram ao tratamento nativo do <dialog> do navegador, incluindo comportamento de camada superior e restauração de foco quando o diálogo fecha. Esses comportamentos em nível de plataforma ajudam a garantir padrões de interação consistentes e melhor acessibilidade sem exigir atributos ARIA extras.
Comandos Personalizados Ainda Precisam de JavaScript
A API também suporta comandos personalizados para seus próprios componentes. Qualquer valor de command começando com -- é tratado como um comando personalizado. O navegador despacha um CommandEvent no alvo, e seu JavaScript cuida do resto:
<button type="button" commandfor="color-box" command="--toggle-highlight">
Destacar
</button>
<div id="color-box"></div>
<script>
document.getElementById('color-box').addEventListener('command', (e) => {
if (e.command === '--toggle-highlight') {
e.target.classList.toggle('highlighted');
}
});
</script>
O prefixo -- é um namespace reservado — os navegadores garantem que nunca o usarão para comandos integrados, então é seguro para uso personalizado. O CommandEvent expõe tanto e.command (a string do comando) quanto e.source (o botão que o disparou), fornecendo tudo o que você precisa para agir sobre o evento.
Conclusão
A API de Comandos Invoker torna o controle declarativo de UI em HTML uma realidade para os padrões mais comuns. Use comandos integrados para diálogos e popovers para obter acessibilidade, gerenciamento de foco e zero JavaScript gratuitamente. Use comandos personalizados -- quando precisar de comportamento JavaScript, mas quiser um padrão de conexão mais limpo e declarativo. É uma API pequena com escopo claro — e é exatamente isso que a torna útil.
Perguntas Frequentes
Atualmente, os atributos commandfor e command são suportados apenas em elementos button. Outros elementos interativos como links ou inputs não podem atuar como invocadores usando esta API. Se você precisar que um elemento que não seja botão dispare um comando, ainda precisará de manipulação de eventos JavaScript para essa interação.
Se o valor de commandfor não corresponder a nenhum id de elemento no documento, a ativação do botão simplesmente não faz nada. Nenhum erro é lançado e nenhum CommandEvent é despachado. Certifique-se de que o id em commandfor corresponda exatamente ao id do elemento alvo, incluindo a diferenciação entre maiúsculas e minúsculas.
Não. O CommandEvent despachado por comandos personalizados não propaga pela árvore DOM. Você deve escutar o evento no próprio elemento alvo em vez de confiar na delegação de eventos.
A API de Comandos Invoker fornece um mecanismo mais geral para ações declarativas de UI do que os atributos popovertarget anteriores. Embora ambas as abordagens funcionem atualmente, commandfor e command podem ser usados para diálogos, popovers e comandos personalizados, tornando-os a opção mais flexível para interfaces HTML modernas.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.