javascript - vue单页应用阻止浏览器后退?
问题描述
web app 单页应用,是用vue vue-router写的。
有些页面是需要禁止后退的,我把当前页面是否能后退写在了路由元信息meta里面,比如为allowBack。
查到资料 禁止后退的方法是 history.pushState(null, null, location.href)
之前项目用的是vue1.0,解决方法是
1. 在全局的router.beforeEach 里面 判断当前路由的handler里面的allowBack变量是否为false2. 如果为false 则 history.pushState(null, null, location.href)
现在改用vue2.0, 原来的方法不好使了,
现在的问题是,不知道该把 history.pushState(null, null, location.href) 这段代码放在哪 或者说 各位大神 有没有什么其他的解决方案? 谢谢!!
其实主要的使用场景是这样的, tabbar点击切换到不同的页面,假如我现在在a页面,点击tabbar到b页面,我不能通过返回键回到a页面,但是能通过点击tabbar去到a页面
问题解答
回答1:自问自答.....需求是:需要某个路由不能通过浏览器返回,同时不影响相互之间的切换整理一下解决方法 和 使用方法:
1.在路由配置中给这个路由添加meta信息,比如:
{ path: ’/home’, component: xxx, meta: {allowBack: false}}
2.在全局的router.beforeEach 函数里面获取allowBack的状态,同时更新vuex的allowBack的值,如:
let allowBack = true // 给个默认值trueif (to.meta.allowBack !== undefined) { allowBack = to.meta.allowBack if (!allowBack) {history.pushState(null, null, location.href) }} store.dispatch(’updateAppSetting’, { allowBack: allowBack})
这段代码得写在next()的后面,因为写在next()前面location.href并不是to的地址,这点跟vue1.0有点不同
3.接下来就是最核心的了,在app.vue的mounted里面注册onpopstate事件:
window.onpopstate = () => { if (!this.allowBack) { // 这个allowBack 是存在vuex里面的变量history.go(1) }}
去掉history.pushState(null, null, location.href) 也能防止后退,但是组件会重新渲染,所以这部分也很关键
回答2:试试这样看看
//改写返回函数,返回的时候就会触发这个,//你也可以直接监听浏览器的返回事件,定义一个变量就行了,逻辑跟这个差不多Router.prototype.goBack = function () { this.isBack = true window.history.go(-1)}//假如当前页面是b页面,是由a页面点击过来的,现在b页面点击返回键,不能返回到a页面router.beforeEach( (to, from, next) => { //一当点击返回键,那么to就是a页面,from就是b页面 if(!from.meta.allowBack){//进行页面判断,取出history里面之前的url,对这个url进行判断,看他等不等于to这个页面//因为安全原因,js没法获取history里的url,或者获取麻烦,所以你就要自己来记住url//就是每进入一个页面,你都去把之前的页面路径存在sessionStorage中//···判断过程省略//这里取出,然后对比就可以了//如果等于的话,直接禁止//取出结果var path = sessionStorage.getItem(’path’);//这个this我没有实验,应是指向router if(path == to.path && this.isBack){ //什么都不做,只要不执行next方法,路由是不会跳的 this.isBack = false; } else { //否则的话,就代表不是点击的返回键,该跳转就跳转 //这里也存储 sessionStorage.setItem(’path’,from.path); this.isBack = false; next() } }else{//在这里存储sessionStorage.setItem(’path’,from.path);this.isBack = false;next(); }});
相关文章:
1. 主从备份 - 跪求mysql 高可用主从方案2. python - django 里自定义的 login 方法,如何使用 login_required()3. python如何不改动文件的情况下修改文件的 修改日期4. android-studio - Android 动态壁纸LayoutParams问题5. javascript - git clone 下来的项目 想在本地运行 npm run install 报错6. angular.js - 不适用其他构建工具,怎么搭建angular1项目7. mysql主从 - 请教下mysql 主动-被动模式的双主配置 和 主从配置在应用上有什么区别?8. mysql优化 - mysql count(id)查询速度如何优化?9. node.js - 使用 superagent 抓取 UTF-8网站乱码10. sql语句如何按or排序取出记录
