Listening unload is already < strong"> unbeforeunload that occurs when you press F5, CTRL + F5, click a hyperlink or any element that with javascript redirects to another page, forms submission and etc.
Important to remember that as @Guilherme Nascimento mentioned, that in unbeforeunload / unload you can not run any javascript, some like alert ("Hellow Wolrd") or calls that open window.open (" link ", "myid", "myconfigs"), redirects and etc are blocked by browsers. It has utility for eg (as already mentioned): destroy cookies or sessionStorage.
In fact, there is no simple and unique way of listening to the window being close, but I went through a situation where I needed this functionality and followed the steps in the code below.
(The code below is a feature for clearing the session of a user logged in after closing a window, it can also be adapted to other functionality that is allowed by browsers.)
Follow the code tested and run on Chrome 67+ and Firefox 61+:
var wrapper = function () {
var deslogarUsuario = true;
//Se o usuário está "focando" a janela, não há motivos para crer
//que ele pretende fechar a mesma (oposto de blur)
$(window).on('focus', function () {
deslogarUsuario = false;
});
$(window).on('blur', function () {
$(window).off('resize'); //evita listening múltiplos e desnecessários
deslogarUsuario = true;
//quando o usuário está minimizando a janela
if (!document.hidden) {
deslogarUsuario = false;
}
//quando o usuário está maximizando a janela
$(window).on('resize', function (e) {
deslogarUsuario = false;
});
});
//Quando o usuário está deixando a página html, nos dá mais razões para
//acreditar que ele pretende fechar a janela (com o mouse)
$('html').on('mouseleave', function () {
deslogarUsuario = true;
});
//Quando o usuário está entrando na página, nos dá menos razões para
//acreditar que ele pretenda fechar a janela (com o mouse)
$('html').on('mouseenter', function () {
deslogarUsuario = false;
});
//Estas escutas são essenciais, pois F5 e CTRL+F5 também acionam o evento
//onbeforeunload, você também pode tentar escutar por eventos como ALT+F4
//mas este mesmo não terá o mesmo efeito, pois é primeiramente escutado pelo
//navegador e efetuado a ação padrão (fechar)
$(document).on('keydown', function (e) {
if (e.keyCode == 91 || e.keyCode == 18 && !blurOnPage) {
deslogarUsuario = false;
}
if (e.keyCode == 116 || (e.ctrlKey && e.keyCode == 82)) {
deslogarUsuario = false;
}
});
//Evita que hiperlinks acionem a função no onbeforeunload
$(document).on("click", "a", function () {
deslogarUsuario = false;
});
//Evita que botões acionem a função no onbeforeunload (útil para aqueles que
//contiverem javascripts que redirecionam ou recarregam a página)
$(document).on("click", "button", function () {
deslogarUsuario = false;
});
//Evita os submits de formulários
$(document).on("submit", "form", function () {
deslogarUsuario = false;
});
//Evita os input[type="submit"] de formulários
$(document).on("click", "input[type=submit]", function () {
deslogarUsuario = false;
});
//Função que pode ser utilizada ou adaptada para quando ocorrer fechamento
//da janela
var derrubaUsuario = function () {
$.ajax({
url: '/MeuController/MinhaActionLogOut',
async: false,
data: {
},
error: function () {
},
success: function (data) {
},
});
};
window.onbeforeunload = function () {
console.log('teste');
if (deslogarUsuario) {
derrubaUsuario();
}
};
};