Ofereça uma experiência imersiva em tela cheia para vários casos de uso, incluindo sites interativos, jogos e streaming de aplicativos ou desktops remotos.
Com cada vez mais usuários passando a maior parte do tempo no navegador, sites interativos, jogos, streaming de desktops remotos e streaming de aplicativos buscam oferecer uma experiência imersiva em tela cheia. Para isso, os sites precisam de acesso a teclas especiais e atalhos de teclado enquanto estão no modo de tela cheia, para que possam ser usados para navegação, menus ou jogos. Alguns exemplos de teclas que podem ser necessárias são Esc, Alt + Tab, Cmd + ` e Ctrl + N.
Por padrão, essas teclas não estão disponíveis para o aplicativo da Web porque são capturadas pelo navegador ou pelo sistema operacional subjacente. A API Keyboard Lock permite que os sites usem todas as teclas disponíveis permitidas pelo SO do host (consulte Compatibilidade com navegadores).
Como usar a API Keyboard Lock
A interface Keyboard da API Keyboard fornece funções que alternam a captura de pressionamentos de teclas do teclado físico, além de receber informações sobre o layout do teclado do usuário.
Pré-requisito
Há dois tipos de tela cheia disponíveis em navegadores modernos: iniciada por JavaScript pela API Fullscreen e iniciada pelo usuário por um atalho de teclado. A API Keyboard Lock só está disponível quando a tela cheia iniciada por JavaScript está ativa. Confira um exemplo de tela cheia iniciada por JavaScript:
await document.documentElement.requestFullscreen();
Detecção de recursos
Você pode usar o padrão a seguir para verificar se a API Keyboard Lock é compatível:
if ('keyboard' in navigator && 'lock' in navigator.keyboard) {
// Supported!
}
Como bloquear o teclado
O método lock() da interface Keyboard retorna uma promessa depois de ativar a captura de pressionamentos de teclas para qualquer ou todas as teclas do teclado físico. Esse método só pode capturar chaves que recebem acesso pelo sistema operacional subjacente. O método lock() usa uma matriz de um ou mais códigos de chave para bloquear. Se nenhum código de chave for fornecido, todas as chaves serão bloqueadas. Uma lista de valores de código de chave válidos está disponível na especificação de valores de código KeyboardEvent de eventos de interface.
Como capturar todas as chaves
O exemplo a seguir captura todos os pressionamentos de teclas.
navigator.keyboard.lock();
Como capturar chaves específicas
O exemplo a seguir captura as teclas W, A, S e D. Ele captura essas teclas, independentemente dos modificadores usados com o pressionamento de tecla. Considerando um layout QWERTY dos EUA, o registro de "KeyW" garante que W, Shift + W, Control + W, Control + Shift + W e todas as outras combinações de modificadores de chave com W sejam enviadas ao app. O mesmo se aplica a "KeyA", "KeyS" e "KeyD".
await navigator.keyboard.lock([
"KeyW",
"KeyA",
"KeyS",
"KeyD",
]);
Você pode responder a pressionamentos de teclas capturados usando eventos de teclado.
Por exemplo, este código usa o onkeydown evento:
document.addEventListener('keydown', (event) => {
if ((event.code === 'KeyA') && !(event.ctrlKey || event.metaKey)) {
// Do something when the 'A' key was pressed, but only
// when not in combination with the command or control key.
}
});
Como desbloquear o teclado
O método unlock() desbloqueia todas as chaves capturadas pelo método lock() e retorna de forma síncrona.
navigator.keyboard.unlock();
Quando um documento é fechado, o navegador sempre chama unlock() implicitamente.
Demonstração
Você pode testar a API Keyboard Lock executando esta demonstração. Não deixe de conferir o código-fonte. Clicar no botão "Enter full screen" abaixo inicia a demonstração em uma nova janela para que ela possa entrar no modo de tela cheia.
Considerações sobre segurança
Uma preocupação com essa API é que ela pode ser usada para capturar todas as chaves e (em conjunto com a API Fullscreen e a API PointerLock) impedir que o usuário saia da página da Web. Para evitar isso, a especificação exige que o navegador ofereça uma maneira para o usuário sair do bloqueio de teclado, mesmo que todas as chaves sejam solicitadas pela API. No Chrome, essa saída de emergência é um pressionamento longo (dois segundos) da tecla Esc para acionar uma saída do bloqueio de teclado.
Links úteis
- Rascunho da especificação
- Repositório do GitHub
- Entrada do ChromeStatus
- Bug de rastreamento do Chrome
- Códigos de chave para teclados padrão
Agradecimentos
Este artigo foi revisado por Joe Medley e Kayce Basques. A especificação do bloqueio de teclado foi criada por Gary Kacmarcik e Jamie Walch.