vue中监听返回键

摘要:在项目中,我们常常有需求,当用户在填写表单时,点击返回的时候,我们希望加一个弹窗,确认离开吗,确认将保存为草稿;利用 H5的 pushstate(个人理解为增加页面栈)特性与onpopup事件

问题:

在项目中,我们常常有需求,当用户在填写表单时,点击返回的时候,我们希望加一个弹窗,确认离开吗,确认将保存为草稿


解决方案:

利用 H5的 pushstate(个人理解为增加页面栈)特性与onpopup事件


分析:

pushstate 从该方法名我们可以知道 是增加某种状态,会为history对象的length增加长度, 点击返回键的时候会触发onpopup事件(可以联想到 pop其实是数组删除的最后一个元素,符合  ‘栈’ 的思想);

onpopup触发返回上一页,而 pushstate仅仅是从url上进行了改变,不会校验url的内容,页面不会改变,加入当前页面为 xxx/b.html,此时pushState(null,null,'a.html'),可以发现 url变了,而页面的内容并没有改变,我们可以通过这来造成一种无法返回的假象


实施: 

//注意:Dialog是一款弹窗的插件
mounted: function() {
	//当前页面挂载的时候调用 返回键的监听方法
	this.listeningBack()
}
//当页面销毁的时候我们也要将事件监听销毁,以免影响其他内容
destroyed: function() {
	window.onpopstate = null
},
methods: {
	//监听返回键
	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('取消返回,留在当前页面')
			);

		}
	},
}


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_4961