簡體   English   中英

當瀏覽器沒有立即觸發popstate事件時如何處理后退按鈕

[英]How to handle back button when browser is not firing popstate event immediately

這個問題可能聽起來很奇怪,因為大多數時候popstate會在用戶按下后退按鈕時同步觸發。

但是,W3C規范規定允許UA(瀏覽器)在遍歷歷史時對popstate進行排隊(參見第14項),即。 popstate是異步觸發的(即使此時URL已更改)。

瀏覽器供應商以不同方式解釋和實現此規 Mozilla決定 Firefox應該能夠在load之前觸發popstate ,並且有充分的理由,以便慢速圖像不會阻止popstate

Chrome / Safari另有決定,它引發了我們的問題:

在管理Web應用程序的歷史記錄時,通常需要盡快啟動歷史記錄管理,例如。 DOMContentLoaded而不是load 但作為回報,用戶無法退出任何pushState ,因為所有popstate排隊直到load

我們正在尋求處理此類方案的方法的建議。 我自己想出幾個:

  • 延遲load圖像,因此load可以盡快解雇。
  • 阻止UI直到load為止。
  • init框架load而不是DOMContentLoaded

有更好的解決方案嗎?

更新 :當load前激活ajax時,事情變得難看,如果這些請求導致DOM更改,並且DOM更改恰好有一些圖像, load會延遲,直到這些圖像被加載/超時,這意味着popstate排隊等待更長時間。

更新2 :要為它添加一個簡單的演示,請訪問帶有chrome的jsbin頁面 ,看看popstate將被阻止,直到load為止。 您可以比較緩存圖像和未緩存圖像之間的結果。

你可以嘗試在卸載上一頁時調用popstate。 例如,如果您在第1頁並希望轉到第2頁,而不是在第2頁的加載/准備期間調用pop狀態,為什么不在第1頁的unload事件中調用pop狀態?

不確定它是否滿足您的情況。 但是我無法在你的箱子里嘗試它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM