1. 程式人生 > >HTML5的popstate、pushState、replaceState如何玩轉瀏覽器歷史記錄

HTML5的popstate、pushState、replaceState如何玩轉瀏覽器歷史記錄

一、popstate用來做什麼的?
簡而言之就是HTML5新增的用來控制瀏覽器歷史記錄的api。

二、過去如何操縱瀏覽器歷史記錄?
window.history物件,該物件上包含有length和state的兩個值,在它的__proto__上繼承有back、forward、go等幾個功能函式
在popstate之前,我們可以利用back、forward、go對history進行後退和前進操作。
例如:
history.back(); (後退一步,使用history.go(-1)也可實現後退效果)
弊端:只能操作前進後退,但是無法控制前進後要去哪,history.length都只會維持原來的狀態

三、popstate的怎麼用?


HTML5的新API擴充套件了window.history,使歷史記錄點更加開放了。可以儲存當前歷史記錄點pushState、替換當前歷史記錄點replaceState、監聽歷史記錄點popstate。

pushState、replaceState兩者用法差不多。

使用方法:

history.pushState(data,title,url);
//其中第一個引數data是給state的值;第二個引數title為頁面的標題,但當前所有瀏覽器都忽略這個引數,傳個空字串就好;第三個引數url是你想要去的連結;

replaceState用法類似,例如:history.replaceState("首頁","",location.href+ "#news");

兩者區別:pushState會改變history.length,而replaceState不改變history.length

 使用場景重現:

1.由於業務邏輯需要:開啟我專案頁面連結時,如果url中攜帶了指定引數,初始化進入頁面的時候,就顯示彈窗。

2.頁面中提供了一些其他連結的入口banner

3.這樣如果進入頁面時攜帶了引數,點選其中banner時,跳轉到其他頁面,然後點選宿主的返回按鈕,一般是會取之前歷史記錄裡的。這時回到之前頁面時,還是會開啟彈窗,因為頁面連結裡還攜帶著引數

4.解決辦法,使用pushState方法,無重新整理改變頁面url 我只需要這樣做:

      let lcthref=location.href.replace(/openMyPrize=true/g,"")
      console.log(lcthref)
      window.history.pushState("","",lcthref)

就可以解決了。