Às vezes, você pode querer que o servidor saiba que o usuário está saindo da página. Isso é útil, por exemplo, para limpar imagens não salvas armazenadas temporariamente no servidor, para marcar esse usuário como "offline" ou para registrar quando ele termina sua sessão.
Historicamente, você enviaria uma solicitação AJAX na beforeunload
função, mas isso tem dois problemas. Se você enviar uma solicitação assíncrona, não há garantia de que a solicitação será executada corretamente. Se você enviar uma solicitação síncrona, é mais confiável, mas o navegador travará até que a solicitação seja concluída. Se esta for uma solicitação lenta, isso seria um grande inconveniente para o usuário.
Felizmente, agora temos navigator.sendBeacon()
. Com a utilização do sendBeacon()
método, os dados são transmitidos de forma assíncrona ao servidor web quando o Agente do Usuário tem a oportunidade de fazê-lo, sem atrasar o descarregamento ou afetar o desempenho da próxima navegação. Isso resolve todos os problemas com o envio de dados analíticos: os dados são enviados de maneira confiável, são enviados de forma assíncrona e não afetam o carregamento da próxima página. Aqui está um exemplo de seu uso:
window.addEventListener("unload", logData, false);
function logData() {
navigator.sendBeacon("/log.php", analyticsData);
}
sendBeacon()
é compatível com:
- Edge 14
- Firefox 31
- Chrome 39
- Safari 11.1
- Opera 26
- iOS Safari 11.4
Atualmente NÃO é compatível com:
- Internet Explorer
- Opera Mini
Aqui está um polyfill para sendBeacon () caso você precise adicionar suporte para navegadores não suportados. Se o método não estiver disponível no navegador, ele enviará uma solicitação AJAX síncrona.