Detector de foco de aba — o que a página registra quando você sai
Verificando…
Lendo o que este documento informa sobre a própria visibilidade e o próprio foco.
Esta página executa, no seu próprio navegador, a mesma verificação de foco e visibilidade que uma prova online ou uma página de monitoramento executa. Troque de aba, clique em outra janela ou minimize esta e veja exatamente o que fica registrado. Nada é enviado — cada leitura abaixo fica nesta aba.
Registro de eventos
Troque de aba, clique em outra janela ou minimize esta — depois volte.
Sinais
| # | Hora | Evento | Estado registrado | Tempo fora |
|---|---|---|---|---|
| Nada ainda. Vá para outra aba ou clique em outra janela e volte. | ||||
O que este teste lê
Todo navegador expõe duas leituras independentes. document.visibilityState diz se esta aba é a que está sendo exibida, e document.hasFocus() diz se este documento é o que recebe as teclas digitadas. Nenhuma exige permissão e nenhuma pode ser desligada.
Elas não são a mesma leitura. Trocar de aba deixa a página oculta. Clicar numa segunda janela do navegador, num aplicativo de mensagens ou num terminal deixa esta aba visível, mas tira o foco — a página fica sem foco, não oculta.
Plataformas de avaliação costumam registrar as duas, contá-las separadamente e cronometrar quanto durou cada ausência. A tabela abaixo mostra exatamente o histórico que elas montariam.
O que dispara
- Trocar para outra aba — dispara
visibilitychangee o estado vira oculto. Registrado em toda parte, inclusive no celular. - Minimizar a janela, bloquear a tela ou o celular entrar em suspensão — também conta como oculto.
- Clicar em outra janela ou aplicativo — uma segunda janela do navegador, um editor, um mensageiro, um painel de busca ou lançador. A aba continua visível; o que dispara é o evento
blurda janela. - Abrir as ferramentas de desenvolvedor em janela separada — conta como troca de janela, então dispara blur.
- O navegador congelar ou descartar a aba para economizar memória — dispara
freezeepagehideno Chromium. - Fechar ou recarregar a página — dispara
pagehide, o evento que as plataformas usam para encerrar uma tentativa incompleta.
Antes de uma avaliação online
Se uma prova avisa que sair da página é registrado, vale saber o que isso significa de fato antes de começar.
- Abra esta página no navegador que você realmente vai usar na avaliação e deixe-a aberta.
- Troque para outra aba e volte imediatamente. Repare que o registro anota um evento oculto e o número exato de segundos.
- Agora clique numa janela diferente em vez disso — um mensageiro ou um editor. O registro mostra um evento blur, e a aba nunca ficou oculta.
- Ative a tela de bloqueio para ver o que uma página de avaliação exibe no instante em que você sai. Muitas plataformas mostram exatamente isso.
- Cuidado com os acidentais: um banner de notificação, um pop-up do gerenciador de senhas em janela própria ou um lançador de atalhos também são registrados.
Saber o que é registrado não é o mesmo que burlar. Esta página diz qual é a leitura; como a plataforma a interpreta é decisão dela.
Como o resultado é definido
Com foco — visibilityState é visible e hasFocus() é true. Esta aba está na tela e recebe suas teclas.
Sem foco — ainda visível, mas o foco foi para outra janela ou aplicativo. Você está olhando esta aba enquanto digita em outra coisa, ou há uma janela por cima.
Oculta — a aba não está sendo desenhada: outra aba está na frente, a janela está minimizada, ou a tela do aparelho está desligada.
O cronômetro de ausência começa no primeiro evento que tira o foco e para quando as duas leituras voltam a ser verdadeiras, de modo que um blur que vira troca de aba conta como uma única ausência contínua.
O que ele não vê
Nenhuma dessas leituras diz para onde você foi. A página sabe que esta aba deixou de ser a ativa e por quanto tempo — não qual aba, qual aplicativo ou o que havia na tela.
Tudo o que acontece fora do navegador sem mover o foco do teclado é invisível para essa API, porque não há evento a disparar. Isso inclui um segundo aparelho físico, uma folha impressa ou outra pessoa na sala.
A contagem sozinha não prova nada. Uma notificação roubando o foco, um painel de leitor de tela, um aviso de atualização do sistema e uma troca de aba deliberada produzem o mesmo evento.
Monitoramento sério não depende só disso. Câmera, microfone, compartilhamento de tela e navegadores bloqueados instalados enxergam muito mais do que uma página web — veja o teste de detecção de monitor externo para outra leitura que uma página pode fazer sem pedir.
Privacidade
A página é estática. Não tem analytics, nem cookies, nem armazenamento local, e não faz nenhuma requisição de rede depois de carregar.
Cada contador e cada horário desta página é calculado dentro da sua aba e some assim que você a fecha. Recarregar zera tudo.
Você pode ler tudo: é um único arquivo de JavaScript, com link no rodapé.
Compatibilidade
visibilitychange e document.hasFocus() funcionam em todo navegador atual, no computador e no celular, sem permissão e sem exigir origem segura.
freeze e resume são exclusivos do Chromium e disparam quando o navegador suspende uma aba em segundo plano para economizar memória. Os demais simplesmente nunca os relatam.
No iOS, trocar de aplicativo é registrado como oculto e não como perda de foco, porque o navegador inteiro vai para segundo plano. A distinção entre os dois só existe onde há janelas.
Perguntas frequentes
Um site consegue detectar quando eu troco de aba?
Sim, e sem precisar de permissão alguma. O evento visibilitychange dispara no instante em que sua aba deixa de ser a visível, e document.visibilityState retorna hidden até você voltar. Todo navegador atual implementa isso, inclusive os de celular. Não existe configuração que esconda isso de uma página.
Uma avaliação online sabe diferenciar trocar de aba e abrir outro aplicativo?
Sim. Trocar de aba deixa a página oculta; clicar em outra janela ou aplicativo deixa a página visível, mas remove o foco do teclado, o que dispara um evento blur. Uma plataforma que registra os dois consegue diferenciá-los, e esta página mostra cada um separadamente para você mesmo ver a diferença.
A prova online sabe para qual aba ou aplicativo eu fui?
Não. O navegador informa à página apenas que ela deixou de ser o documento ativo e por quanto tempo. O destino — outra aba, outro programa, a tela bloqueada — nunca é exposto. Qualquer coisa mais detalhada exige compartilhamento de tela ou um navegador bloqueado instalado, ambos visíveis e que precisam ser aprovados.
Tirar um print conta como sair da página?
Depende inteiramente de como o print é tirado. Um atalho tratado pelo sistema operacional, sem interface própria, não dispara nada, porque o navegador nunca perde o foco. Já qualquer coisa que abra um seletor, um painel ou uma janela de pré-visualização toma o foco, e isso é registrado como blur. Teste os dois nesta página e observe o registro.
Por que meu contador subiu se eu não troquei de aba?
O foco é roubado por mais coisas do que se imagina: banners de notificação, pop-ups do gerenciador de senhas, um aviso de atualização do sistema, um lançador de atalhos de teclado ou as ferramentas de desenvolvedor abertas em janela própria. Todos disparam um blur indistinguível de uma troca deliberada.
Dá para desligar essa detecção nas configurações do navegador?
Não. A Page Visibility API faz parte do próprio documento, não é uma permissão, então não há o que revogar. Bloqueá-la quebraria usos legítimos como pausar vídeo, parar animações e interromper temporizadores em abas em segundo plano.
Um segundo monitor impede que a troca de aba seja registrada?
Não. Mover os olhos para a segunda tela não muda nada, mas clicar numa janela dessa tela tira o foco do teclado desta aqui e dispara um blur exatamente como aconteceria com uma tela só. Se a segunda tela em si é visível para uma página é outra questão, coberta pelo teste de detecção de monitor externo.
Alguma coisa disso é enviada para um servidor?
Não. A página é estática, não tem analytics nem cookies e não faz nenhuma requisição de rede depois de carregar. Cada evento e cronômetro exibido é calculado dentro da sua aba e descartado quando você a fecha.