hash模式與history模式

隨着 ajax 的使用愈來愈普遍,前端的頁面邏輯開始變得愈來愈複雜,特別是spa的興起,前端路由系統隨之開始流行。javascript

從用戶的角度看,前端路由主要實現了兩個功能(使用ajax更新頁面狀態的狀況下):css

  1. 記錄當前頁面的狀態(保存或分享當前頁的url,再次打開該url時,網頁仍是保存(分享)時的狀態);
  2. 可使用瀏覽器的前進後退功能(如點擊後退按鈕,可使頁面回到使用ajax更新頁面以前的狀態,url也回到以前的狀態);

做爲開發者,要實現這兩個功能,咱們須要作到:html

  1. 改變url且不讓瀏覽器向服務器發出請求;
  2. 監測 url 的變化;
  3. 截獲 url 地址,並解析出須要的信息來匹配路由規則。

咱們路由經常使用的hash模式history模式實際上就是實現了上面的功能。前端

hash模式

  這裏的 hash 就是指 url 尾巴後的 # 號以及後面的字符。這裏的 # 和 css 裏的 # 是一個意思。hash 也 稱做 錨點,自己是用來作頁面定位的,她可使對應 id 的元素顯示在可視區域內。html5

  因爲 hash 值變化不會致使瀏覽器向服務器發出請求,並且 hash 改變會觸發 hashchange 事件,瀏覽器的進後退也能對其進行控制,因此人們在 html5 的 history 出現前,基本都是使用 hash 來實現前端路由的。java

  使用到的api:ajax

window.location.hash = 'qq' // 設置 url 的 hash,會在當前url後加上 '#qq'

var hash = window.location.hash // '#qq'  

window.addEventListener('hashchange', function(){ 
    // 監聽hash變化,點擊瀏覽器的前進後退會觸發
})

 

history模式

  已經有 hash 模式了,並且 hash 能兼容到IE8, history 只能兼容到 IE10,爲何還要搞個 history 呢?
  首先,hash 原本是拿來作頁面定位的,若是拿來作路由的話,原來的錨點功能就不能用了。其次,hash 的傳參是基於 url 的,若是要傳遞複雜的數據,會有體積的限制,而 history 模式不只能夠在url裏放參數,還能夠將數據存放在一個特定的對象中。
  最重要的一點:若是不想要很醜的 hash,咱們能夠用路由的 history 模式。api

  相關API:瀏覽器

window.history.pushState(state, title, url) 
// state:須要保存的數據,這個數據在觸發popstate事件時,能夠在event.state裏獲取
// title:標題,基本沒用,通常傳 null
// url:設定新的歷史記錄的 url。新的 url 與當前 url 的 origin 必須是一樣的,不然會拋出錯誤。url能夠是絕對路徑,也能夠是相對路徑。
//如 當前url是 https://www.baidu.com/a/,執行history.pushState(null, null, './qq/'),則變成 https://www.baidu.com/a/qq/,
//執行history.pushState(null, null, '/qq/'),則變成 https://www.baidu.com/qq/

window.history.replaceState(state, title, url)
// 與 pushState 基本相同,但她是修改當前歷史記錄,而 pushState 是建立新的歷史記錄

window.addEventListener("popstate", function() {
    // 監聽瀏覽器前進後退事件,pushState 與 replaceState 方法不會觸發              
});

window.history.back() // 後退
window.history.forward() // 前進
window.history.go(1) // 前進一步,-2爲後退兩步,window.history.lengthk能夠查看當前歷史堆棧中頁面的數量

  history 模式改變 url 的方式會致使瀏覽器向服務器發送請求,這不是咱們想看到的,咱們須要在服務器端作處理:若是匹配不到任何靜態資源,則應該始終返回同一個 html 頁面。服務器

相關文章
相關標籤/搜索