history新特性pushState、replaceState


history,就是歷史記錄,h5的新特性是加入了pushState與replaceState,我的理解是改變location的hash值做到無刷新頁面的路由跳轉,並且攜帶了state的相關狀態信息。

先對history先作一個簡要說明。

history.back()就是回退;這個方法會像用戶點擊了瀏覽器工具欄上的返回鍵一樣。
history.forward()是前進一頁;
history.go(n)根據n的值來瀏覽器來處理前進一頁還是后退一頁,當n=0時,此時是刷新頁面;

此時再說一下popstate方法;MDN的概要是這么說的:

popstate窗口上事件的事件處理程序。

popstate每次活動歷史記錄條目在同一文檔的兩個歷史記錄條目之間改變時,將事件分派到窗口。如果被激活的歷史記錄條目是通過調用創建的,
history.pushState()或者被調用影響history.replaceState(),
則popstate事件的state屬性包含歷史條目的狀態對象的副本。

 簡單理解就是:

pushState,replaceState都不會觸發popstate的方法,僅當用戶在相同文檔的兩個歷史條目之間導航時才觸發事件。如果當下有多個歷史記錄,back(),go(n)觸發了路由哈希的改變,就會觸發該事件。

window.onpopstate = function(event) {
  console.log("location: " + document.location + ", state: " + JSON.stringify(event.state));
};

我們來打開頁面看下history

發現這個時候history的length是 1,state是null;下面我們來使用一下pushState,

history.pushState({page: 1}, "title 1", "?page=1");

此時的history變成這樣

我們發現state中有了page的值,就是我們pushState傳入的狀態值,並且length+1了;

然后我們再pushState一次效果是這樣,說明每次pushState會改變state的值,並且會讓history的棧里面多推入一個。額,也不知道形容的對不對,我猜大家應該懂我想表達的意思。

下面說一下replaceState,其實跟pushState差不多,只是replaceState()修改當前歷史記錄條目,而不是創建一個新的。

history.replaceState({page: 4}, "title 4", "?page=4");

 

可以看到length沒有改變,只是修改了history的state的page值。

總結:pushState也就是往history里放一個狀態值,並且創建一個新的歷史記錄;replaceState修改history的狀態值,不創建新的歷史記錄。popstate只在歷史記錄發生哈希值改變的情況下觸發。

 本文是基於如下鏈接做的自我解讀,如若理解有誤,還請指出。大家共同學習進步。

鏈接:https://developer.mozilla.org/en-US/docs/Web/API/History_API

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM