可通过设置 window.onbeforeunload 返回非空字符串触发浏览器离开确认弹窗,仅当 isdirty 为 true 时启用,保存成功后重置 isdirty 并清除监听,移动端可能受限。

可以通过设置 window.onbeforeunload 事件处理函数,返回一个非空字符串(现代浏览器会忽略该字符串内容,但需存在),来触发浏览器原生的“离开页面”确认弹窗。关键在于:仅当用户有未保存的数据时才启用提示,避免干扰正常操作。
判断是否需要提示(核心逻辑)
不能每次页面加载就开启提示,而应根据数据状态动态控制。常见做法是维护一个布尔变量(如 isDirty),在用户修改表单、编辑内容等操作后设为 true;调用保存接口成功后重置为 false。
- 初始化时设
let isDirty = false - 监听输入框
input、change或富文本编辑器变更事件,更新isDirty = true - 保存成功回调中执行
isDirty = false - 注意:避免在保存失败或取消时误清标志
绑定 onbeforeunload 并返回提示
仅当 isDirty 为 true 时,才设置事件处理器并返回字符串。返回值不是自定义文案(Chrome/Firefox 已屏蔽),而是用于触发确认框的“信号”。
- 写法示例:
window.onbeforeunload = () => isDirty ? '您有未保存的更改,确定要离开吗?' : null - 也可以用
addEventListener('beforeunload', handler),但需注意移除逻辑(见下条) - 返回
null、undefined或不返回,均表示不提示
保存后及时清除监听(避免误提示)
一旦数据保存成功,除了重置 isDirty,还应主动清除 onbeforeunload 绑定,防止后续操作(如切换 Tab 后返回)因状态残留导致异常提示。
- 推荐统一管理:只用
window.onbeforeunload = handler赋值方式,清除时直接赋null - 例如:
window.onbeforeunload = null或window.onbeforeunload = () => {} - 若用
addEventListener,需保存 handler 引用,并在保存后调用removeEventListener
兼容性与注意事项
该机制在所有主流桌面浏览器中有效,但在移动端 Safari 和部分 Android 浏览器中可能被限制或静默忽略。另外,用户刷新、关闭标签页、点击链接跳转等都会触发,但无法区分具体行为。
- 不能阻止关闭动作,只能询问用户是否确认
- 不能执行异步操作(如发请求、弹自定义 Modal),否则会被忽略
- 不要在提示中承诺“自动保存”,实际保存必须在用户确认前完成
- 测试时注意:开发者工具中禁用缓存可能导致重复触发,建议用无痕窗口验证











