瀏覽器 或 一些 h5 容器(比如 webview 或 uniwebview),由於處在沙盒環境,無法監聽原生的物理返回鍵,需要借助客戶端實現這一行為。
以主流前端框架的 hash 路由模式為例,物理返回鍵會觸發默認的 hashchange ,導致無法阻止當前頁面跳轉。
由於 hashchange 不會觸發頁面刷新,因此通過相同的 hash 形成不同的記錄,在兩者間跳轉,可以巧妙地捕捉到 物理返回鍵 的行為,因此可以先 push 相同hash頁面1 入棧,再 push 相同hash頁面2 入棧。
一方面,為了避免這種解決方案可能造成的額外困擾,我們可以事先記錄 需要捕捉返回鍵頁面 的跳轉前頁面,一般可以存到 model 里面,這樣兩個相同的 hash 頁面都可以實現和原來只有一個 hash 頁面時相同的行為;
另一方面,為了區分 相同hash頁面1 和 相同hash頁面2,可以在同一頁面內監聽 hashchange 事件,通過 event.oldURL 來區分 相同hash頁面1 和 相同hash頁面2。
兩個相同的 hash 頁面可以通過 query 參數來對瀏覽器形成差異,每次顯示的都是 相同hash頁面2,但是 物理返回鍵 將在 相同hash頁面1 停留,以模擬監聽到物理返回鍵的行為。