产品提了个“关闭页面,弹出提示框挽留用户”的 需求,网上找了资料后,发现很难实现,微信中也实现不了,目前只有微信中京东可以实现“关闭/再逛逛”的弹框挽留,总结下:
beforeunload
触发条件: 当页面的资源将要卸载(及刷新或者关闭标签页前)
只能在PC浏览器上被触发,而且在chrome浏览器中不能自定义返回文字
window.addEventListener('beforeunload', function (e) {
let confirmationMessage = `还差1步即可获取5万额度,千万别放弃呀`;
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome
});

谷歌浏览器效果
unload
触发条件: 窗口关闭或者 document 对象将要卸载时触发
如果通过按下“前进/后退”导致页面卸载,并不会触发 unload 事件。
在移动端和PC端的safari中都不会被触发
unload在ios中被废弃了,需要使用pagehide替代
pagehide
页面跳走,或者关闭之前的瞬
Firefox 和 Safari 没有问题,但 google chrome 直到现在,除了加载页面后会正常触发,前进/后退操作都是不会触发此事件的。
在移动端方面,Safari 和 webkit 内核的浏览器均不支持此事件。
visibilitychange
触发条件: 浏览器标签页被隐藏或显示的时候会触发
无法阻止默认事件, 只是记录了状态,可以用来检测用户是否在看当前页面
document.addEventListener('visibilitychange', function (e) {
console.log('我监听到了浏览器的返回按钮事件啦');
}
pushHistory
触发条件: 返回时 触发, 刷新、关闭页面不触发
function pushHistory() {
const pathname = window.location.href;
let state = {
title: 'title',
url: pathname
};
window.history.pushState(state, 'title', pathname);
}
pushHistory();
window.addEventListener("popstate", function(e) {
console.log('返回')
showAlert(xxx, function(){
// 留在当前页面时重新 push
pushHistory();
}, funcrion(){
// 离开时执行原本操作
navigation.back();
});
}, false);