Introdução
Como desenvolvedores da Web, tendemos a ficar animados com novas tecnologias que nos permitem criar páginas da Web cada vez mais envolventes e interativas. Gráficos 3D com WebGL? Com certeza. Recursos de áudio avançados com o WebAudio? Com certeza. Aplicativos de colaboração em tempo real que usam a webcam e o microfone? Eu quero!
Menos empolgantes, mas igualmente importantes, são as tecnologias que nos permitem criar aplicativos que são executados de maneira mais eficiente e oferecem uma experiência geral melhor para o usuário. É aqui que uma API como a PageVisibility entra em ação.
A API Page Visibility executa uma função simples, mas importante: ela informa ao app quando uma página está visível para o usuário. Essa informação básica permite a criação de páginas da Web que se comportam de maneira diferente quando não estão sendo visualizadas. Confira alguns exemplos:
- Uma página da Web que recupera informações de um servidor pode desacelerar o ciclo de atualização quando não está sendo visualizada ativamente
- Uma página que mostra um carrossel de imagens ou conteúdo de vídeo/áudio pode ser pausada até que o usuário a mostre novamente
- Um aplicativo pode decidir mostrar notificações ao usuário somente quando ele está oculto
No início, essa API pode não parecer muito útil além da conveniência do usuário, mas, considerando o enorme aumento na navegação na Web para dispositivos móveis, tudo o que ajuda a economizar a bateria do dispositivo se torna muito importante. Ao usar a API PageVisibility, seu site pode ajudar o dispositivo do usuário a consumir menos energia e durar mais.
A especificação da API, que está na fase de recomendação de candidato, fornece as duas propriedades para detectar o estado de visibilidade do documento e um evento para responder a mudanças de visibilidade.
Neste tutorial, vamos abordar os conceitos básicos da API e mostrar como aplicá-la a alguns exemplos práticos. Se você é do tipo impaciente, pode pular para eles.
Propriedades de visibilidade do documento
A versão atual da especificação da API PageVisibilityAPI define duas propriedades de documento: o booleano hidden
e a enumeração visibilityState
. No momento, a propriedade visibilityState tem quatro valores possíveis: hidden
, visible
, prerender
e unloaded
.
Como você pode imaginar, o atributo oculto retorna verdadeiro quando o documento não está visível. Normalmente, isso significa que o documento está minimizado, em uma guia em segundo plano, a tela de bloqueio do SO está aberta etc. O atributo é definido como falso se qualquer parte do documento estiver pelo menos parcialmente visível em pelo menos uma tela. Além disso, para acomodar ferramentas de acessibilidade, o atributo oculto pode ser definido como falso quando uma ferramenta, como uma lupa de tela, obscurece completamente o documento, mas mostra uma visualização dele.
Como lidar com prefixos de fornecedores
Para manter o foco no código em vez de todos os prefixos específicos do fornecedor, vou usar algumas funções auxiliares para isolar as especificidades do navegador. Assim que você remover o suporte ao navegador do Android 4.4, poderá remover essa parte e usar os nomes padrão.
function getHiddenProp(){
var prefixes = ['webkit','moz','ms','o'];
// if 'hidden' is natively supported just return it
if ('hidden' in document) return 'hidden';
// otherwise loop over all the known prefixes until we find one
for (var i = 0; i < prefixes.length; i++){
if ((prefixes[i] + 'Hidden') in document)
return prefixes[i] + 'Hidden';
}
// otherwise it's not supported
return null;
}
Exemplo de propriedades do documento
Agora podemos escrever uma função entre navegadores, isHidden()
, para saber se o documento está visível.
function isHidden() {
var prop = getHiddenProp();
if (!prop) return false;
return document[prop];
}
Para uma visualização mais detalhada da visibilidade do documento, use a propriedade visibilityState. Essa propriedade retorna um dos quatro valores:
hidden
: o documento está completamente ocultovisible
: o documento está pelo menos parcialmente visível em pelo menos um dispositivo de exibiçãoprerender
: o documento é carregado fora da tela e não está visível. Esse valor é opcional. Nem todos os navegadores oferecem suporte a ele.unloaded
: se o documento for descarregado, esse valor será retornado. Esse valor é opcional e nem todos os navegadores oferecem suporte a ele.
O evento VisibilityChange
Além das propriedades de visibilidade, há um evento visibilitychange que é acionado sempre que o estado de visibilidade do documento muda. É possível registrar um listener de eventos para esse evento diretamente no objeto do documento:
Exemplo de evento
// use the property name to generate the prefixed event name
var visProp = getHiddenProp();
if (visProp) {
var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
document.addEventListener(evtname, visChange);
}
function visChange() {
var txtFld = document.getElementById('visChangeText');
if (txtFld) {
if (isHidden())
txtFld.value += "Tab Hidden!\n";
else
txtFld.value += "Tab Visible!\n";
}
}
Resumo
Criar um ótimo aplicativo da Web envolve muito mais do que apenas usar recursos chamativos que os usuários podem ver e interagir. Um aplicativo realmente bom faz uso adequado dos recursos e da atenção do usuário, e a API Page Visibility é uma peça importante desse quebra-cabeça. Para saber mais sobre como criar aplicativos da Web com consciência de recursos, confira nossos outros artigos relacionados à performance.