Safari 15-16中beforeunload弹窗无法阻止缓存页面跳转:Bug还是特性?
Safari中beforeunload事件的异常行为与解决方案疑问
beforeunload事件的设计初衷是让用户在离开页面前有机会保存未完成的工作,但Safari 15-16版本中该功能无法正常工作。我仅需要它的原生用途,未用于触发beaconing、清空localStorage等操作,也未使用Promise或await。
在空白HTML页面中使用以下测试脚本时,能看到beforeunload弹窗,但页面会立即跳转到目标地址(需先点击窗口确保浏览器检测到交互):
<script> function beforeUnloadListener(event) { if (true) { event.preventDefault(); // eslint-disable-next-line no-param-reassign event.returnValue = 'This message is ignored in modern browsers.'; return event; } return null; } addEventListener('beforeunload', beforeUnloadListener, { capture: true }); </script>
测试场景及异常表现:
- 关闭浏览器窗口时,弹窗会正常阻止窗口关闭
- 跳转到Safari中的另一个缓存页面时,弹窗会显示,但页面会直接跳转到新地址,弹窗仍停留在原页面的上层。此时点击弹窗的确认或取消按钮仅会关闭弹窗,无法对页面跳转行为产生任何影响,弹窗形同虚设。
这与Chrome、Firefox的预期行为完全不符:在这两款浏览器中,页面会等待用户点击弹窗选项后,才执行跳转或取消跳转操作。
这种弹窗显示但页面已跳转的行为明显不合理,这是Safari的设计如此吗?目前尚未找到在Safari中实现该功能的有效方法,求可行的解决方案。
内容的提问来源于stack exchange,提问作者Benjamin Tremblay
相关产品推荐
相关产品推荐

