在Hybrid APP混合式開(kāi)發(fā)時(shí)遇到的history.replacestate的問(wèn)題

原理:

Native?App:?本地應(yīng)用程序(原生App)

Web?App:網(wǎng)頁(yè)應(yīng)用程序(移動(dòng)web)

Hybrid?App:混合應(yīng)用程序(混合App)


如圖1所示,三種移動(dòng)應(yīng)用開(kāi)發(fā)方式具體比較如表2所示:



history對(duì)象

history對(duì)象保存著用戶上網(wǎng)的歷史記錄,從窗口被打開(kāi)的那一刻算起。由于安全方面的考慮,開(kāi)發(fā)人員無(wú)法得到用戶瀏覽器的URL,但借由用戶訪問(wèn)過(guò)的頁(yè)面列表,可以在不知道實(shí)際URL的情況下實(shí)現(xiàn)后退和前進(jìn)。

跳轉(zhuǎn)方法

go()

使用go()方法可以在用戶的歷史記錄中任意跳轉(zhuǎn)。這個(gè)方法接收一個(gè)參數(shù),表示向后或向前跳轉(zhuǎn)的頁(yè)面數(shù)的一個(gè)整數(shù)值。負(fù)數(shù)表示向后跳轉(zhuǎn)(類似于后退按鈕),正數(shù)表示向前跳轉(zhuǎn)(類似于前進(jìn)按鈕)?

go()方法無(wú)參數(shù)時(shí),相當(dāng)于history.go(0),可以刷新當(dāng)前頁(yè)面

back()

back()方法用于模仿瀏覽器的后退按鈕,相當(dāng)于history.go(-1)

forward()

forward()方法用于模仿瀏覽器的前進(jìn)按鈕,相當(dāng)于history.go(1)?

如果移動(dòng)的位置超出了訪問(wèn)歷史的邊界,以上三個(gè)方法并不報(bào)錯(cuò),而是靜默失敗

[注意]使用歷史記錄時(shí),頁(yè)面通常從瀏覽器緩存之中加載,而不是重新要求服務(wù)器發(fā)送新的網(wǎng)頁(yè)

增改記錄:

history.pushState() , history.replaceState()

HTML5為history對(duì)象添加了兩個(gè)新方法,history.pushState()和history.replaceState(),用來(lái)在瀏覽歷史中添加和修改記錄。state屬性用來(lái)保存記錄對(duì)象,而popstate事件用來(lái)監(jiān)聽(tīng)history對(duì)象的變化

pushState()

history.pushState()方法向?yàn)g覽器歷史添加了一個(gè)狀態(tài)(增加一個(gè)記錄)。pushState()方法帶有三個(gè)參數(shù):一個(gè)狀態(tài)對(duì)象、一個(gè)標(biāo)題(現(xiàn)在被忽略了)以及一個(gè)可選的URL地址

history.pushState(state, title, url);

state object —— 狀態(tài)對(duì)象是一個(gè)由pushState()方法創(chuàng)建的、與歷史紀(jì)錄相關(guān)的javascript對(duì)象。當(dāng)用戶定向到一個(gè)新的狀態(tài)時(shí),會(huì)觸發(fā)popstate事件。事件的state屬性包含了歷史紀(jì)錄的state對(duì)象。如果不需要這個(gè)對(duì)象,此處可以填null

title —— 新頁(yè)面的標(biāo)題,但是所有瀏覽器目前都忽略這個(gè)值,因此這里可以填null

URL —— 這個(gè)參數(shù)提供了新歷史紀(jì)錄的地址。新URL必須和當(dāng)前URL在同一個(gè)域,否則,pushState()將丟出異常。這個(gè)參數(shù)可選,如果它沒(méi)有被特別標(biāo)注,會(huì)被設(shè)置為文檔的當(dāng)前URL

replaceState(參數(shù)見(jiàn)上所述)

把當(dāng)前的頁(yè)面的歷史記錄替換掉

他們最大的特點(diǎn)是添加或替換歷史記錄后,瀏覽器地址欄會(huì)變成你傳的地址,而頁(yè)面并不會(huì)重新載入或跳轉(zhuǎn)。

例如,假設(shè)當(dāng)前的頁(yè)面地址是example.com/1.html,且history中此時(shí)只有一條當(dāng)前頁(yè)面的記錄。

當(dāng)你執(zhí)行 history.pushState(null, null, “2.html”)后,瀏覽器的地址欄會(huì)顯示example.com/2.html,但并不會(huì)跳轉(zhuǎn)到2.html,甚至并不會(huì)去檢查2.html存不存在,只是加入一個(gè)最新的歷史記錄項(xiàng)。此時(shí)history中會(huì)有兩個(gè)記錄。假如你此時(shí)點(diǎn)擊頁(yè)面上的link跳轉(zhuǎn)到另外一個(gè)頁(yè)面后,點(diǎn)擊瀏覽器的后退按鈕,則url會(huì)變成example.com/2.html,如果此前的1.html的頁(yè)面瀏覽器有緩存的話會(huì)顯示1.html的內(nèi)容,否則會(huì)發(fā)起請(qǐng)求example.com/2.html。如果再次點(diǎn)后退,url會(huì)變成example.com/1.html。

而如果執(zhí)行 history.replaceState(null, null, “2.html”)的話,瀏覽器的地址欄也會(huì)顯示example.com/2.html,區(qū)別是history中只有當(dāng)前2.html的記錄,而1.html的記錄已被替換掉。

遇到的應(yīng)用場(chǎng)景:

在做H5的頁(yè)面時(shí),會(huì)根據(jù)版本號(hào)跳轉(zhuǎn)到更新頁(yè),此時(shí)在更新頁(yè)點(diǎn)擊后退時(shí),會(huì)返回到活動(dòng)頁(yè),其實(shí)不應(yīng)該,此時(shí)返回應(yīng)該退出H5頁(yè)面,故此時(shí)替換掉歷史記錄到更新頁(yè),在點(diǎn)擊返回按鈕時(shí)歷史記錄里已經(jīng)沒(méi)有活動(dòng)頁(yè),就只有更新頁(yè),代碼如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容