问题:在项目中,咱们经常有需求,当用户在填写表单时,点击返回的时候,咱们但愿加一个弹窗,确认离开吗,确认将保存为草稿html
解决方案:利用 H5的 pushstate(我的理解为增长页面栈)特性与onpopup事件vue
分析:pushstate 从该方法名咱们能够知道 是增长某种状态,会为history对象的length增长长度, 点击返回键的时候会触发onpopup事件(能够联想到 pop实际上是数组删除的最后一个元素,符合 ‘栈’ 的思想);数组
onpopup触发返回上一页,而 pushstate仅仅是从url上进行了改变,不会校验url的内容,页面不会改变,加入当前页面为 xxx/b.html,此时pushState(null,null,'a.html'),能够发现 url变了,而页面的内容并无改变,咱们能够经过这来形成一种没法返回的假象this
实施: url
//注意:Dialog是一款弹窗的插件
mounted: function() {
//当前页面挂载的时候调用 返回键的监听方法
this.listeningBack()
}
//当页面销毁的时候咱们也要将事件监听销毁,以避免影响其余内容spa
destroyed:function(){插件
window.onpopstate = nullcode
},router
methods:{htm
//监听返回键
listeningBack() {
var that = this;//window.onpopstate方法指向window,因此要储存一下当前的vue实例
let route = '上一页';//根据业务逻辑的上一页决定
window.onpopstate = function() {
//将当前页面window.location.href 放入页面栈当中
history.pushState({}, null, window.location.href);
Dialog.alert({
title: '标题',
message: '确认返回吗,你所填写的内容将保存为草稿'
}).then(() => {
that.$router.push({
path:route
})
}).catch(
console.log('取消返回,留在当前页面')
);
}
},
}