问卷系统防未答完离开需双重拦截:先用 vue router 的 beforerouteleave 守卫判断 isdirty 并阻止路由跳转,再用 window.beforeunload 事件覆盖刷新、关闭等所有卸载场景,配合 sessionstorage 草稿保存与状态同步优化体验。

在问卷调查系统中,防止用户未答完题目就关闭页面或跳转,核心是利用 Vue Router 的导航守卫配合浏览器原生事件,做两层拦截:路由跳转前判断、页面卸载前提醒。
监听路由跳转,拦截未提交的问卷页
对问卷填写页(如 /survey/:id)设置组件内守卫 beforeRouteLeave,它在用户点击链接、调用 router.push 或浏览器后退时触发,且能访问当前组件实例。
- 在问卷组件中,通过 data 或 computed 维护一个 isDirty 标志(例如:表单有任意字段被修改但未提交)
-
beforeRouteLeave中检查该标志,若为 true,弹出确认框;用户点“取消”则调用next(false)阻止跳转 - 注意:该守卫无法拦截直接刷新或关闭标签页,需配合下一层机制
捕获页面卸载,防止意外刷新或关闭
仅靠路由守卫不够,必须补充 beforeunload 事件——它是浏览器级钩子,覆盖所有退出场景(刷新、关闭、地址栏输入、前进/后退)。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
- 在问卷组件
mounted钩子中添加监听:window.addEventListener('beforeunload', handleBeforeUnload) -
handleBeforeUnload函数返回字符串(现代浏览器会忽略内容,但必须返回值才能触发提示),例如:return '您还有未提交的题目,确定要离开吗?' - 在
beforeUnmount或提交成功后移除监听,避免内存泄漏和误提示
状态同步与用户体验优化
单纯弹窗容易引起反感,建议配合状态管理提升体验:
- 将“是否已答题”状态存入
sessionStorage,即使刷新也能恢复草稿并继续拦截 - 在拦截提示中提供“保存草稿”按钮(调用本地保存逻辑),再允许离开
- 对已提交的问卷页,自动清除
beforeunload监听,并将isDirty置为 false
不复杂但容易忽略:beforeunload 只能显示浏览器默认提示,无法自定义样式或按钮;而 beforeRouteLeave 对应的是可控的 Vue 导航流程。两者结合,才构成完整防护。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










