我在我的JS/ReactJS应用程序中添加了一个beforeunload
as customary事件列表器。该功能根据内部状态unSaved
添加确认对话框。* onbeforeunload *缓存在Safari(macOS)上?
在Chrome和Firefox(macOS/desktop)上一切正常。
在Safari浏览器,但是:
- 第一次“我使用”的事件处理程序(我离开,而
unSaved==true
页),它工作正常的aspected, - 然而,在随后的尝试离开页面
unSaved==true
,Safari不会要求任何确认。 - 当我去到一个新的标签(与以前同样的网址),再次在第一时间的作品,随后的时间不...
什么是怪异:我可以看到我添加的事件功能实际上每次在Safari上都会被调用,因为每次都会打印一个测试console.log
。
我唯一可能的猜测是,Safari以某种方式缓存我对该选项卡的确认响应? (?)
如何解决这个问题的任何想法?
我的堆栈:
Safari: Version 10.0.1 (12602.2.14.0.7) macOS: 10.12.1 (16B2657) host: localhost protocols: tested on both, http and https
更多信息:
- 事件
pageshow
有属性persisted
始终设置为false。因此,Safari的页面缓存(BFCache)不应该是问题的原因。
由于关闭标签之前的“确认”在恶意网站上很常见,您可能会遭遇反恶意软件防护。 – ssube
@ssube你的意思是Safari将我重复的确认尝试解释为恶意软件行为,因此只是忽略了我的逻辑? - Chrome和Firefox添加到确认弹出复选框,以供用户决定_“防止此页面创建额外的对话”_,这当然是非常明智的。 - Safari不提供这样的选项吗? – juanmirocks
我不确定Safari的行为,但听起来像一个类似的功能可能会破坏你的代码。如果你曾经看到过一个页面反复打开对话框来阻止用户离开,大多数浏览器都有一些防范措施。如果Chrome和FF做得很好,那么Safari很可能会做一些阴暗和不幸的事情。 – ssube