這篇文章主要介紹javascript實(shí)現(xiàn)不重載頁(yè)面前提下創(chuàng)建一條歷史紀(jì)錄的方法是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
東洲ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!
背景
最近在上班過(guò)程中,遇到了這么一個(gè)需求,在多頁(yè)面應(yīng)用中,需要在幾個(gè)頁(yè)面上共用同一個(gè)數(shù)據(jù)來(lái)源,且切換頁(yè)面不刷新頁(yè)面數(shù)據(jù),并能實(shí)現(xiàn)歷史記錄的后退功能;因前期只考慮在一個(gè)頁(yè)面內(nèi)實(shí)現(xiàn)多個(gè)頁(yè)面的效果,并未考慮到歷史記錄堆棧中的處理,導(dǎo)致頁(yè)面會(huì)一次性推出入口,以下為總結(jié)的幾種解決方法。
hash
在URL中,#我們稱(chēng)為位置標(biāo)識(shí)符,代表網(wǎng)頁(yè)的一個(gè)位置,在我們剛開(kāi)始接觸到a標(biāo)簽的時(shí)候,我們很多人都有操作過(guò)錨點(diǎn)跳轉(zhuǎn),主要就是通過(guò)在 href 中設(shè)置想要跳到的位置的id值,在這個(gè)過(guò)程中,頁(yè)面是沒(méi)有刷新的,但歷史記錄卻新增了一條;我們利用window.location.hash可以取得當(dāng)前頁(yè)面的hash值,同時(shí)也可以也可以通過(guò)其寫(xiě)入新的hash值,并通過(guò)監(jiān)聽(tīng)hashchange事件,來(lái)檢測(cè)hash值是否發(fā)生了改變。當(dāng)我們?cè)冱c(diǎn)開(kāi)彈框式的遮罩頁(yè)面的時(shí)候,可以手動(dòng)的去修改location.hash的值,這樣點(diǎn)擊window.history.back(),就可以實(shí)現(xiàn)歷史記錄回退;
例子
代碼如下:
Title 加載中....
在瀏覽器中打開(kāi)該頁(yè)面,并在路由上加上#blue,如下:
可看到如下頁(yè)面,初始條件下,頁(yè)面的顯示加載中...,而后定時(shí)器觸發(fā)更新,顯示遞增的數(shù)字,此時(shí)我們可以在控制臺(tái)中打印出對(duì)應(yīng)的history.length,其值為2:
接下來(lái),我們通過(guò)點(diǎn)擊change-url 按鈕,去實(shí)現(xiàn)修改hash值,我們可以看到,對(duì)應(yīng)的路徑發(fā)生了改變,#blue變?yōu)?g'ra,背景顏色也對(duì)應(yīng)的更改,但此時(shí)遞增的數(shù)字沒(méi)有被刷新,說(shuō)明我們的頁(yè)面并沒(méi)有經(jīng)過(guò)刷新重載的過(guò)程。
重新在控制臺(tái)輸入window.history.length可以看到,其值已經(jīng)變?yōu)?,點(diǎn)擊瀏覽器后退箭頭,頁(yè)面背景改為之前的藍(lán)色背景,到這里,我們就實(shí)現(xiàn)我們想要的功能;
history.pushState
除了上面講到的方法外,通過(guò)html5新增的history.pushState也可以實(shí)現(xiàn)同樣的效果;
history.pushState和history.replaceState同是html5新增的api,都可以實(shí)現(xiàn)改變狀態(tài)欄的url而不刷新頁(yè)面,但兩者的區(qū)別是,replaceState是替換當(dāng)前地址為指定的url,而pushState則是創(chuàng)建一條新的歷史紀(jì)錄。執(zhí)行history.back()和history.forward()后會(huì)觸發(fā)window.onpopstate事件。
API
history.pushState(state,title,url)
state:對(duì)象,可以存放一些數(shù)據(jù)表示當(dāng)前的狀態(tài)。當(dāng)瀏覽器執(zhí)行前進(jìn)或在后退的時(shí)候,會(huì)觸發(fā)onpopState事件,state將會(huì)是event對(duì)象的屬性對(duì)象,可以通過(guò)event.state訪問(wèn);需要注意的是,statez中的屬性值不能為對(duì)象。url為將要替換的地址;如果是puhState則會(huì)添加一條歷史記錄;
例子
我們同樣可以用上面的例子來(lái)測(cè)試,只不過(guò),我們需要監(jiān)聽(tīng)的是popstate事件,新建歷史記錄,將當(dāng)前信息保存到history.state中,
history.pushState && window.addEventListener("popstate",function(e){}) history.pushState && history.pushState(state,title,url)
以上是javascript實(shí)現(xiàn)不重載頁(yè)面前提下創(chuàng)建一條歷史紀(jì)錄的方法是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!