在這里我們把history簡化成一個(gè)鏈表來討論 撼唾, 以下紅色數(shù)字為 url 當(dāng)前位置
引起history變化的動(dòng)作有三類:
頁面點(diǎn)擊鏈接物蝙,js控制location.href跳轉(zhuǎn)等蛉迹,我們給這類起名為硬跳轉(zhuǎn)
pushState
replaceState
引起當(dāng)前位置在表中的變化有兩種:前進(jìn)靠欢、后退
硬跳轉(zhuǎn):
[ 1 ,2 ,3 , 4, ... , n , n+1 , n+2 ]
1)history 表如上杭隙,通過回退的方式使當(dāng)前 url 在 2 處
2)觸發(fā)硬跳轉(zhuǎn)哟绊,history變?yōu)槿缦拢?/p>
[ 1 , 2 , 3?]
當(dāng)前位置為 3 ,url為硬跳轉(zhuǎn)的鏈接
頁面:
1)立即變化
2)接下來的前進(jìn)后退痰憎,頁面按 history 中的url順序變化
pushState:
[ 1 , 2 , 3, ... , n , n+1 ]
1)history 表如上票髓,當(dāng)前位置在 2 處攀涵,觸發(fā)pushState方法
2)history 表如下:
[ 1 , 2 , 3 ]
當(dāng)前位置為 3 ,url為push進(jìn)來的鏈接
頁面:
1)不會(huì)立即變化炬称,還是 2
2)接下來的前進(jìn)后退汁果,1與2都會(huì)正常加載頁面,但當(dāng)url到3時(shí)玲躯,頁面仍是 2据德,這里沒有找到原因,存疑u纬怠<!P嘟伞善玫!
replaceState:
[ 1 , 2 , 3 , ... , n , n+1 ]
1)history 表如上,當(dāng)前位置在 2 處密强,觸發(fā) replaceState 方法
2)history 表如下:
[ 1 , 2 , 3 , ... , n , n+1 ]
當(dāng)前位置在 2 處茅郎,且 url 為 replace 進(jìn)來的 新url
頁面:
1)頁面不會(huì)立即變化
2)接下來的前進(jìn)后退,頁面按 history 中的url順序變化
popstate:
需要注意的是或渤,僅僅調(diào)用popstate方法或replaceState方法 系冗,并不會(huì)觸發(fā)該事件,只有用戶點(diǎn)擊瀏覽器倒退按鈕和前進(jìn)按鈕薪鹦,或者使用JavaScript調(diào)用back掌敬、forward、go方法時(shí)才會(huì)觸發(fā)池磁。另外奔害,該事件只針對同一個(gè)文檔,如果瀏覽歷史的切換地熄,導(dǎo)致加載不同的文檔华临,該事件也不會(huì)觸發(fā)。