[https://developer.mozilla.org/zh-CN/docs/Web/API/History_API](https://developer.mozilla.org/zh-CN/docs/Web/API/History_API)
[toc]
## 異步【誤】
>[danger] 是因為pushState不會觸發popState
pushState是異步的,so,如果你直接在下面go,此時還沒有記錄,也就不會觸發popState
```
window.onpopstate = function(event) {
console.log(history.state)
};
// location.href = '#123'
history.pushState({a:1},'1','?123')
history.pushState({b:1},'2','?234')
// history.go(-1); //這樣是無效的
document.documentElement.onclick = function(e){
history.go(-1)
}
```
## hash
hash也會產生歷史記錄,
但如果你使用的是`location.href`(系列)這樣設置的hash,**即使**同一個頁面多次設置hash,只會產生一次記錄,也就只會觸發一次popstate(設置hash是**同步**的)
```
window.onpopstate = function(event) {
console.log(1)
// console.log(history.state)
};
location.href = '#123'
location.href='#hash1122'
document.documentElement.onclick = function(e){
history.go(-1)
}
<<<
1
```
但如果你使用的是`pushState({...},'','#123')`設置hash,則調用幾次就會產生幾次記錄
---
##
你可以用 go() 方法載入到會話歷史中的某一特定頁面, 通過與當前頁面相對位置來標志 (當前頁面的相對位置標志為0).
>history.pushState({},'','./abc')
>
>會改變url,但不會立刻加載,需要調用go()才會加載,才會觸發onpopstate
>
>pushState支持相對路徑
>
>push的url只支持同源,否則報錯
調用history.pushState()或者history.replaceState()不會觸發popstate事件. popstate事件只會在瀏覽器某些行為下觸發, 比如點擊后退、前進按鈕(或者在JavaScript中調用history.back()、history.forward()、history.go()方法).
```
window.onpopstate = function(event) {
alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
};
//綁定事件處理函數.
history.pushState({page: 1}, "title 1", "?page=1"); //添加并激活一個歷史記錄條目 http://example.com/example.html?page=1,條目索引為1
history.pushState({page: 2}, "title 2", "?page=2"); //添加并激活一個歷史記錄條目 http://example.com/example.html?page=2,條目索引為2
history.replaceState({page: 3}, "title 3", "?page=3"); //修改當前激活的歷史記錄條目 http://ex..?page=2 變為 http://ex..?page=3,條目索引為3
history.back(); // 彈出 "location: http://example.com/example.html?page=1, state: {"page":1}"
history.back(); // 彈出 "location: http://example.com/example.html, state: null
history.go(2); // 彈出 "location: http://example.com/example.html?page=3, state: {"page":3}
```
- 空白目錄
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13個核心屬性
- DOM優化
- 回流與重繪
- 未整理
- 文檔碎片
- DOM映射機制
- DOM庫封裝
- 事件
- 功能組件
- table
- 圖片延遲加載
- 跑馬燈
- 回到頂部
- 選項卡
- 鼠標跟隨
- 放大鏡
- 搜索
- 多級菜單
- 拖拽
- 瀑布流
- 數據類型的核心操作原理
- 變量提升
- 閉包(scope)
- this
- 練習題
- 各種數據類型下的常用方法
- JSON
- 數組
- object
- oop
- 單例模式
- 高級單例模式
- JS中常用的內置類
- 基于面向對象創建數據值
- 原型和原型鏈
- 可枚舉和不可枚舉
- Object.create
- 繼承的六種方式
- ES6下一代js標準
- babel
- 箭頭函數
- 對象
- es6勉強筆記
- 流程控制
- switch
- Ajax
- eval和()括號表達式
- 異常信息捕獲
- 邏輯與和或以及前后自增
- JS中的異步編程思想
- 上云
- 優化技巧
- 跨域與JSONP
- 其它跨域相關問題
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重寫和方法重載
- 移動端
- 響應式布局開發基礎
- 項目一:創意簡歷