天天看點

詳解window.historyhistory.go()、history.back()、history.forward()修改網站路徑并建立新的曆史記錄修改網站路徑但不建立新的曆史記錄曆史記錄狀态事件

Window.history儲存使用者在一個會話期間的網站通路記錄,使用者每次通路一個新的URL即建立一個新的曆史記錄。

history.go()、history.back()、history.forward()

history.back()和history.forward()分别表示向後一頁和向前一頁。

history.go(num)表示向前或向後翻多少頁,num為正數表示向前翻,為負數則向後翻。

History.back()等價于history.go(-1),history.forward()等價于history.go(1)。

執行這三個中的任一方法,觸發浏覽器的popstate事件,如果隻是hash部分發生變化,還可能同時觸發hashchange事件。

修改網站路徑并建立新的曆史記錄

history.pushState(statedata, title, url);
           

參數URL必須和目前URL同源,否則會報錯。隻可以修改URL中路徑、井号之後的片段(即hash)或者URL中問号(?)之後的查詢區段。

每執行一次pushState()用新的URL替換掉目前URL,即位址欄URL會變,window.location.href也會變,同時建立一個新的曆史記錄。但執行pushState()永遠不觸發hashchange事件。

參數statedata可以是任何被序列化的資料,這些資料被儲存在使用者硬碟上。但狀态資料有大小限制,比如Firefox隻允許640KB字元。

使用pushState()的好處:隻改URL的hash部分,window.location使用的是同一個document。

相容性問題

pushState直到IE10才被支援,在早版本的IE中隻能通過修改window.location=”#foo”完成,但這樣會觸發hashchange事件。

修改網站路徑但不建立新的曆史記錄

看标題就知道了,replaceState()和pushState()的唯一差別是不建立新的曆史記錄,而是直接修改目前曆史記錄。

history.replaceState(stateData, title, url);
           

曆史記錄狀态

有兩種方式可以通路曆史通路記錄的狀态資訊,history.state傳回曆史通路堆棧最頂端的記錄的狀态;而PopStateEvent.state值有在PopStateEvent事件觸發的時候在事件監聽中才能通路。

State的預設值在不同浏覽器可能不同,比如IE10以下預設是undefiend,但IE10和IE11預設是null。HTML5推薦使用nul為預設值。

事件

popstate事件

調用history.back()、history.forward()、history.go()等方法,會觸發popstate事件,單純調用pushState()或replaceState()不觸發popstate事件。

通路事件的state屬性可擷取當初pushState()或replaceState()設定的狀态資料。