使用场景:用户回退挽留自定义弹窗
开发环境:vite4.1.4、vue3.2.47、router4.1.6
封装的工具类:
export function handleBrowserGoBack(backCallBack) {
// 保存初始历史记录长度
pushHistory();
addPopstateListener(backCallBack);
}
/**
* 向历史记录中插入了当前页
*/
function pushHistory() {
window.history.pushState(null, null, location.href);
}
/**
* 添加popstate监听
*/
function addPopstateListener(backCallBack) {
if (window.addEventListener) {
window.addEventListener("popstate", backCallBack, false);
} else {
window.attachEvent("popstate", backCallBack);
}
}
/**
* 移除popstate监听
*/
export function removeBrowserBackListener(backCallBack) {
if (window.removeEventListener) {
window.removeEventListener("popstate", backCallBack, false);
} else {
window.detachEvent("popstate", backCallBack);
}
}
页面逻辑:
onMounted(() => {
// 给拦截监听事件绑定函数
handleBrowserGoBack(pageBackHandler)
})
// 用户页面返回相关逻辑
const pageBackHandler = () => {
// 弹出挽留页
scopeState.retainDialog = true
}
// 用户点击挽留页关闭按钮
const closeReturn = () => {
// 先删除拦截监听事件
removeBrowserBackListener(pageBackHandler)
if (isWeiXin()) {
// 兼容微信
setTimeout(function () {
document.addEventListener("WeixinJSBridgeReady", function () {
parent.WeixinJSBridge.call('closeWindow')
}, false)
parent.WeixinJSBridge.call('closeWindow')
}, 300)
} else {
// 根据路由保留记录的长度一直返回
for (let i = 0; i <= history.length; i++) {
history.back()
}
}
}
改用
history.go(-1);
试一下应该可以这个浏览器的缓存也可能会这样, 手动禁用看一下,
不过你哪里为什么直接返回第一页呢, 可以保存第一页的路由然后直接跳转到第一页, 你的那个写法会比较耗性能用户用起来也可能会有影响