我在我的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