前端-2019 history 與 location

HTML5 API解析之Window.history歷史記錄

一、簡介前端

window.history是用來保存用戶在一個會話期間的網站訪問記錄,並提供相應的方法進行追溯。其對應的成員以下:ajax

方法:back()、forward()、go(num)、pushState(stateData, title, url)、replaceState(stateData, title, url)跨域

屬性:length、state瀏覽器

事件:window.onpopstate異步

方法說明:性能

back():回退到上一個訪問記錄; 在歷史記錄中後退:window.history.back();網站

forward():前進到下一個訪問記錄; 在歷史記錄中前進:window.history.forward();url

go(num):跳轉到相應的訪問記錄;其中num大於0,則前進;小於0,則後退; 例如:後退一頁window.history.go(-1); 向前移動一頁window.history.go(1);spa

查看歷史記錄棧中一共有多少個記錄點:window.history.length;對象

pushState(stateData, title, url):在history中建立一個新的訪問記錄,不能跨域,且不形成頁面刷新;

replaceState(stateData, title, url):修改當前的訪問記錄,不能跨域,且不形成頁面刷新;

另,HTML5新增了能夠監聽history和hash訪問變化的全局方法:

window.onpopstate:當調用history.go()、history.back()、history.forward()時觸發;pushState()、replaceState()方法不觸發。

window.onhashchange:當前 URL 的錨部分(以 '#' 號爲開始) 發生改變時觸發。觸發的狀況以下:

a、經過設置Location 對象 的 location.hash 或 location.href 屬性修改錨部分;

b、使用不一樣history操做方法到帶hash的頁面;

c、點擊連接跳轉到錨點。

二、瀏覽器history的發展

咱們知道在使用location.href、a標籤的href[非錨點的方式]等,進行頁面訪問時,頁面會刷新。但隨着大前端時代的到來,產生了異步單頁來提高性能。咱們再也不但願每次的跳轉都帶來頁面的刷新,而是但願這種跳轉僅僅引起數據變化,從而改變視圖。

此時,產生了HTML5 history API。這些API,是爲了解決異步單頁的路由問題,使得頁面在不刷新的狀況下,帶來視圖的變化,同時變化後的信息能獲得準確的傳播。

下面來看看一個應用場景的實例:咱們在訪問一個新聞列表頁,找到一篇感興趣的新聞,文章的內容經過ajax的方式獲取到。咱們以爲這篇文章頗有趣,並將其分享給了朋友們。若是url地址沒有變化,朋友們訪問的將是列表頁,而非有趣的文章。而經過HTML5的API,在異步請求ajax的同時,咱們能夠改變url地址,朋友們訪問的也正是這篇文章。

那麼,

讓咱們來看看window.history是如何工做的吧~~~

三、瀏覽器history變化與瀏覽器的行爲

history棧變動圖

如圖,展現了初始長度爲4的history棧,在不一樣操做方法下的變化狀況,下面對每步進行分析:

step1~step4:均爲history的訪問方法,獲取相應的歷史記錄中的url;

step5:經過location.href建立一個新的url記錄,其將當前url2以後的記錄清空,並在其後新增url5;history長度由4變成3;history的每次新增操做,都會將其後記錄清空,在其後新增記錄。

step6:經過pushState方法建立一個新的url記錄,其也是清空、再新增記錄;

step8:經過replaceState方法修改一個url記錄,其不會產生新記錄,而是將當前記錄進行修改

值得注意的是,經過pushState新增或者修改的history記錄,被訪問時,當前頁面不刷新。而locaiton.href生成的記錄被訪問時,頁面將進行刷新。

 

 

location.replace() 方法可用一個新文檔取代當前文檔。

location.replace(newURL)

說明

replace() 方法不會在 History 對象中生成一個新的記錄。當使用該方法時,新的 URL 將覆蓋 History 對象中的當前記錄

 

window.location 對象所包含的屬性

屬性 描述
hash 從井號 (#) 開始的 URL(錨)
host 主機名和當前 URL 的端口號
hostname 當前 URL 的主機名
href 完整的 URL
pathname 當前 URL 的路徑部分
port 當前 URL 的端口號
protocol 當前 URL 的協議
search 從問號 (?) 開始的 URL(查詢部分)
相關文章
相關標籤/搜索