做过这个功能,但只适合主流浏览器,代码如下:
let beforeUnloadTime = null;
window.addEventListener("beforeunload", e => beforeunloadHandler(e));
window.addEventListener("unload", e => unloadHandler(e))
function beforeunloadHandler () {
beforeUnloadTime = new Date().getTime();
}
function unloadHandler(e) {
let unloadTime = new Date().getTime() - beforeUnloadTime;
// 判断是窗口关闭还是刷新
if (unloadTime <= 5) {
await fetch(``, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Edc-Authorization":
"Bearer " + localStorage.getItem("Token")
},
// 保持连接
keepalive: true
});
}
}
如果想更好的解决这个问题,建议使用socket做心跳连接,一直ping,如何断开连接,表示浏览器关闭了,这时候后端处理这个逻辑。
问题:有没有可能同一个浏览器打开了多个页面,我只关闭了其中一个页面,但是我切换了另外一个页面时,并不想退出登录,那么我们应该在这个浏览器关闭这个域名的最后一个网页时处理这个逻辑。
所以我们应该记住当前浏览器打开几个页面:
window.onload = function() {
const count = localStorage.getItem("BrowserWindowNumber");
if (count === null) {
localStorage.setItem("BrowserWindowNumber", 1);
} else if (~~count === -1) {
localStorage.setItem("BrowserWindowNumber", 1);
} else {
localStorage.setItem("BrowserWindowNumber", parseInt(count) + 1);
}
};
// 当窗口关闭时,减少计数器
window.onunload = function() {
const count = localStorage.getItem("BrowserWindowNumber");
if (count !== null) {
localStorage.setItem("BrowserWindowNumber", parseInt(count) - 1);
}
};
function beforeunloadHandler () {
beforeUnloadTime = new Date().getTime();
}
function unloadHandler(e) {
let unloadTime = new Date().getTime() - beforeUnloadTime;
// 判断是窗口关闭还是刷新
if (unloadTime <= 5) {
const count = localStorage.getItem("BrowserWindowNumber");
if(~~count === 0) {
await fetch(``, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Edc-Authorization":
"Bearer " + localStorage.getItem("Token")
},
// 保持连接
keepalive: true
});
}
}
}