JavaScript history 對象詳解
前言:
我們瀏覽一個網頁時可能不太會註意網頁前進後退這些操作,但是在開發時你是否想過頁面之間的跳轉經歷瞭什麼,瀏覽器時怎麼保存的頁面信息,重新返回上一個頁面的時候是否需要重新加載頁面呢,會有很對疑問,要想解決這些問題,首先需要知道瀏覽器中的window
下的history
對象,本文來詳細總結一下該對象的相關知識點。
history
對象表示當前窗口首次使用以來用戶的導航歷史記錄。因為 history
是 window
的屬性,所以每個 window
都有自己的 history
對象。出於安全考慮,這個對象不會暴露用戶訪問過的 URL,但可以通過它在不知道實際 URL 的情況下前進和後退。
1、路由導航
history.go()
方法可以在用戶歷史記錄中沿任何方向導航,可以前進也可以後退。這個方法隻接收一個參數,這個參數可以是一個整數,表示前進或後退多少步。
history.go(-1);// 後退一頁 history.go(1);// 前進一頁 history.go(2);// 前進兩頁 // go() 有兩個簡寫方法: back() 和 forward() 。 history.back();// 後退一頁 history.forward();//前進一頁
history
對象還有一個 length
屬性,history.length == 1
表示這是用戶窗口中的第一個頁面
histroy
的go方法,back
方法、forword
方法以及用戶在瀏覽器手動的前進後退按鈕都會導致頁面刷新後跳轉。
2、歷史狀態管理API
(1)hashchange 事件
hashchange:history
對象的一個新特性是hashchange
,會在頁面 URL 的散列變化時被觸發,開發者可以在此時執行某些操作。當URL的片段標識符更改時,將觸發hashchange
事件 (跟在#符號後面的URL部分,包括#符號)。而狀態管理API 則可以讓開發者改變瀏覽器 URL 而不會加載新頁面。
比如:pushState和replaceState方法,頁面並不會刷新,但是路由會發生改變。
(2)popstate 事件
當活動歷史記錄條目更改時,將觸發popstate
事件。如果被激活的歷史記錄條目是通過對history.pushState
()
的調用創建的,或者受到對history.replaceState()
的調用的影響,popstate事件的state屬性包含歷史條目的狀態對象的副本。需要註意的是調用history.pushState()
或history.replaceState()
不會觸發popstate
事件。隻有在做出瀏覽器動作時,才會觸發該事件,如用戶點擊瀏覽器的回退按鈕(或者在Javascript
代碼中調用history.back()
或者history.forward()
方法)
(3)history.pushState() 方法
pushState()
方法向當前瀏覽器會話的歷史堆棧中添加一個狀態(state)。這個方法接收 3 個參數:一個 state 對象、一個新狀態的標題和一個(可選的)相對 URL。pushState()
方法執行後,狀態信息就會被推到歷史記錄中,瀏覽器地址欄也會改變以反映新的相對 URL。URL欄顯示新地址, 但是不會加載 頁面,甚至不會檢查頁面是否存在,該方法會增加history.length
(4)history.replaceState()方法
replaceState()
方法修改當前歷史記錄實體。這個方法接收 3 個參數:一個 state
對象、一個新狀態的標題和一個(可選的)相對 URL。r
eplaceState()
方法執行後,將會更新當前的state
對象或者當前歷史實體的URL來響應用戶的的動作,URL欄顯示新地址, 但是不會加載 頁面,甚至不會檢查頁面是否存在。該方法不會增加history.length
。
<body> <button onclick="handleNext()">點我到下一頁</button><br> <button onclick="handleLast()">點我到上一頁</button><br> <script> window.onload = function () { console.log(window.history); } window.addEventListener('hashchange', function () { console.log('The hash has changed!') }, false); window.addEventListener('popstate', (event) => { console.log("location: " + document.location + ", state: " + JSON.stringify(event.state)); }); function handleNext() { const state = { userId: "1234", page: "2" } const title = '二' const url = 'page2.html' window.history.pushState(state, title, url) console.log(window.history); } function handleLast() { const state = { userId: "1234", page: "21" } const title = '一' const url = 'page21.html' window.history.replaceState(state, title, url) console.log(window.history); } </script> </body>
運行結果如下:
3、補充:URL的hash
URL的hash
也就是錨點(#), 本質上是改變window.location
的href
屬性,我們可以通過直接賦值location.hash
來改變href, 但是頁面不發生刷新,
如下圖所示:
寫在最後:
到此這篇關於JavaScript history
對象詳解的文章就介紹到這瞭,更多相關history 對象內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue-router中hash模式與history模式的區別
- Vue.js 前端路由和異步組件介紹
- vue瀏覽器返回監聽的具體步驟
- React中路由參數如何改變頁面不刷新數據的情況
- Vue中Router路由兩種模式hash與history詳解