利用HTML5的history.replacestate()修改當前頁面的URL

mmcrsx_blog發表於2018-07-19

history物件

history物件儲存著使用者上網的歷史記錄,從視窗被開啟的那一刻算起。由於安全方面的考慮,開發人員無法得到使用者瀏覽器的URL,但藉由使用者訪問過的頁面列表,可以在不知道實際URL的情況下實現後退和前進。

跳轉方法

go()

使用go()方法可以在使用者的歷史記錄中任意跳轉。這個方法接收一個引數,表示向後或向前跳轉的頁面數的一個整數值。負數表示向後跳轉(類似於後退按鈕),正數表示向前跳轉(類似於前進按鈕)
go()方法無引數時,相當於history.go(0),可以重新整理當前頁面

back()

back()方法用於模仿瀏覽器的後退按鈕,相當於history.go(-1)

forward()

forward()方法用於模仿瀏覽器的前進按鈕,相當於history.go(1)
如果移動的位置超出了訪問歷史的邊界,以上三個方法並不報錯,而是靜默失敗

[注意]使用歷史記錄時,頁面通常從瀏覽器快取之中載入,而不是重新要求伺服器傳送新的網頁

增改記錄:

history.pushState() , history.replaceState()

HTML5為history物件新增了兩個新方法,history.pushState()和history.replaceState(),用來在瀏覽歷史中新增和修改記錄。state屬性用來儲存記錄物件,而popstate事件用來監聽history物件的變化

pushState()

history.pushState()方法向瀏覽器歷史新增了一個狀態(增加一個記錄)。pushState()方法帶有三個引數:一個狀態物件、一個標題(現在被忽略了)以及一個可選的URL地址

history.pushState(state, title, url);

state object —— 狀態物件是一個由pushState()方法建立的、與歷史紀錄相關的javascript物件。當使用者定向到一個新的狀態時,會觸發popstate事件。事件的state屬性包含了歷史紀錄的state物件。如果不需要這個物件,此處可以填null

title —— 新頁面的標題,但是所有瀏覽器目前都忽略這個值,因此這裡可以填null

URL —— 這個引數提供了新歷史紀錄的地址。新URL必須和當前URL在同一個域,否則,pushState()將丟出異常。這個引數可選,如果它沒有被特別標註,會被設定為文件的當前URL

replaceState(引數見上所述)

把當前的頁面的歷史記錄替換掉

他們最大的特點是新增或替換歷史記錄後,瀏覽器位址列會變成你傳的地址,而頁面並不會重新載入或跳轉。

例如,假設當前的頁面地址是example.com/1.html,且history中此時只有一條當前頁面的記錄。

當你執行 history.pushState(null, null, “2.html”)後,瀏覽器的位址列會顯示example.com/2.html,但並不會跳轉到2.html,甚至並不會去檢查2.html存不存在,只是加入一個最新的歷史記錄項。此時history中會有兩個記錄。假如你此時點選頁面上的link跳轉到另外一個頁面後,點選瀏覽器的後退按鈕,則url會變成example.com/2.html,如果此前的1.html的頁面瀏覽器有快取的話會顯示1.html的內容,否則會發起請求example.com/2.html。如果再次點後退,url會變成example.com/1.html。

而如果執行 history.replaceState(null, null, “2.html”)的話,瀏覽器的位址列也會顯示example.com/2.html,區別是history中只有當前2.html的記錄,而1.html的記錄已被替換掉。

利用這些特性,可以用來修改當前頁面的URL來達成某些目的,比如可以用來記住搜尋條件。

參考原文連結

相關文章