confirm()需在用户手势中调用并返回值阻断跳转,location.href等JS跳转须前置判断,异步场景应改用自定义弹窗;防数据丢失还需beforeunload事件兜底。
点击链接前用 confirm() 阻断跳转
HTML5 本身不提供“点击链接自动弹确认框”的能力,必须靠 JavaScript 拦截默认行为。核心思路是:给 绑定 click 事件,在回调里调用 confirm(),返回 false 才能阻止跳转。
常见错误是直接写 onclick="confirm('确定?')" —— 这样弹窗会显示,但无论点“确定”还是“取消”,链接都会跳转,因为没把 confirm() 的返回值传给事件处理逻辑。
- 正确写法:
onclick="return confirm('确定要离开当前页面吗?')" - 更推荐的写法(分离逻辑):
前往
-
confirm()返回true(确定)时允许跳转,false(取消)时必须显式调用e.preventDefault()或return false
location.href 跳转前也要手动加 confirm()
如果跳转是通过 JS 主动触发的(比如按钮点击后执行 location.href = 'xxx'),那就完全绕过了 HTML 的默认行为,preventDefault 失效。这时必须把 confirm() 放在赋值语句之前,靠条件控制是否执行跳转。
- 错误示例:
button.addEventListener('click', () => { location.href = '/target'; // 没有确认就直接跳了 }); - 正确写法:
button.addEventListener('click', () => { if (confirm('确定要跳转到目标页?')) { location.href = '/target'; } }); - 注意:
location.assign()和location.replace()同理,都得包在confirm()条件块里
移动端 Safari 对 confirm() 的兼容性限制
iOS Safari 在非用户手势触发的上下文中(比如异步回调、定时器、AJAX 成功后)调用 confirm() 会被静默忽略,不弹窗也不报错——这是浏览器策略,不是 bug。