使用浏览器API window.history 进行后退控制,须要浏览器支持history
(大部分移动浏览器都支持了) 代码示例:html
// 添加浏览器历史纪录
history.pushState('test', '', '')
复制代码
// 监听浏览器后退事件
window.onpopstate = function (e) {
// 这里进行业务逻辑的处理
location.href = 'c.html'
}
复制代码
这样在页面加载的时候添加入新的浏览器纪录就能够在后退的时候触发 popState 事件,而后处理你的业务逻辑前端
history.pushState
在当前页面刷新一次页面就会添加一次,当屡次刷新的时候会将history
的长度加长,须要使用一个存储变量进行判断是否须要添加历史纪录,显然H5新接口sessionStorage
很适合当前使用,这样在跳转到后退页面以后在使用浏览器后退会返回到当前页,因为使用了判断是当前页再也不进行历史压栈,就不会在从新触发popState
事件了,避免了无限次浏览器后退无限循环。let active_view = sessionStorage.getItem('active_view')
if (!active_view) {
sessionStorage.setItem('active_view', 'has')
}
复制代码
popstate
的bug,在当前A.html页跳转到b.html页,而后再b.html页经过浏览器返回按钮回到a.html页面的时候会直接触发popState
事件,直接跳转到c.html页面了,真实需求是再b.html返回的时候回到a.html页面,而后在a.html页面的后退的时候才进行跳转c.html页面。因此我将Ios和Android区分开来,分别进行不一样的业务处理。// 判断ios 的时候在第二次返回才进行页面跳转,不是的在从新将history增长
let jumps: any = sessionStorage.getItem('jump_number') || 0;
let count = parseInt(jumps) + 1;
let u = navigator.userAgent;
let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
sessionStorage.setItem('jump_number', count);
if (isIOS) {
if (count >= 2) {
// ios
setJump();
} else {
pushHistory();
}
} else {
// 其它
setJump();
}
复制代码
参考了 IOS微信浏览器返回事件popstate监听ios
location.href = c.html
有可能页面不会替换,其实显示的仍是a.html,须要点击刷新页面才是c.html,因此封装了一个跳转函数,加上一段打印log就能够正常跳转了// 须要将url打印出来页面跳转才会正常,(发稿以前还未弄清楚是什么缘由,之后知道了在附上)
function setJump(url) {
// 跳转
console.log('连接:' + url);
window.location.href = url;
}
复制代码
history.pushState(state, "test", "#")
添加参数的时候,若是当前页面的url中有#号,就是最后一个参数和url中最后的字符相同,会破坏popState
事件,可能致使不触发,所以使用参数加入历史的须要注意投放连接的url,Android 手机部分机型在此状况下点击浏览器后退也会触发两次popState
事件// push 浏览器历史记录
function pushHistory() {
let state = {
title: "test",
url: "#"
};
window.history.pushState(state, "test", "#")
}
复制代码
window
的API有一些差别,许多BUG都是该差别引发的,因此在遇到的时候多查查资料就能够了。popState
事件,须要在控制台打印history.length
在点击后退按钮才会触发(还不知道这个缘由是什么)