history保存列表頁ajax請(qǐng)求的狀態(tài)使用示例詳解
問題
最近碰到兩個(gè)問題:
- 從首頁進(jìn)入列表頁之后,點(diǎn)擊下一頁的時(shí)候,使用ajax請(qǐng)求更新數(shù)據(jù), 然后點(diǎn)擊瀏覽器“后退”按鈕就直接返回到首頁,實(shí)際這里想要的效果是返回列表頁上一頁。
- 在列表頁分頁為2的頁面進(jìn)入詳情頁,然后點(diǎn)擊“后退”按鈕,返回的事列表頁分頁為1的頁面。沒法記住之前分頁狀態(tài)。
優(yōu)化前代碼
代碼如下,在頁數(shù)變化的時(shí)候,去異步請(qǐng)求數(shù)據(jù),渲染頁面。
const currentChange = (currentPage) => {
ajax(`請(qǐng)求地址/${currentPage}`)
.then(renderPage)
}
history
經(jīng)過幾番搜索,發(fā)現(xiàn)可以用History 接口來實(shí)現(xiàn)我們想要功能。
history.pushState()
按指定的名稱和URL(如果提供該參數(shù))將數(shù)據(jù)push進(jìn)會(huì)話歷史棧,數(shù)據(jù)被DOM進(jìn)行不透明處理;你可以指定任何可以被序列化的javascript對(duì)象。具體描述可以參考文檔
通過history.pushState(state, title, url)可以修改會(huì)話歷史棧,把我們需要保存的數(shù)據(jù)存到state中,這里我們存入一個(gè)對(duì)象,屬性為當(dāng)前頁數(shù);title一般沒什么用,這里傳入null;url會(huì)修改當(dāng)前歷史紀(jì)錄的地址,瀏覽器在調(diào)用pushState()方法后不會(huì)去加載這個(gè)URL
假設(shè)當(dāng)前currentPage為1,當(dāng)前url為www.example.com/search/index
...
const pushState = () => {
const url = `/search/index/${currentPage}`
history.push({
page: currentPage
}, null, url)
}
const currentChange = (currentPage) => {
ajax(`請(qǐng)求地址/${currentPage}`)
.then(res =>{
pushState(currentPage)
renderPage()
})
}
...
現(xiàn)在代碼執(zhí)行順序是:頁數(shù)改變 => ajax請(qǐng)求 => pushState => renderPage()
在pushState之后當(dāng)前url變成www.example.com/search/index/1
window.onpopstate
現(xiàn)在我們通過history.pushState()方法把狀態(tài)存入歷史會(huì)話中了,接下來就要監(jiān)聽window.onpopstate事件
參考mdn文檔window.onpopstate
每當(dāng)處于激活狀態(tài)的歷史記錄條目發(fā)生變化時(shí),popstate事件就會(huì)在對(duì)應(yīng)window對(duì)象上觸發(fā).
調(diào)用history.pushState()或者h(yuǎn)istory.replaceState()不會(huì)觸發(fā)popstate事件. popstate事件只會(huì)在瀏覽器某些行為下觸發(fā), 比如點(diǎn)擊后退、前進(jìn)按鈕(或者在JavaScript中調(diào)用history.back()、history.forward()、history.go()方法).
接下來監(jiān)聽這個(gè)事件
window.addEventListener("popstate", (event) => {
if(event.state !== null){
page = event.state.page
changeCurrentPage(page) // 修改當(dāng)前頁數(shù)
}
})
當(dāng)popstate觸發(fā)時(shí),會(huì)修改當(dāng)前頁數(shù),然后觸發(fā)之前定義的currentChange方法,更新數(shù)據(jù),渲染頁面。
問題2
到此為止,問題1就解決了。
接下來要解決問題二:從詳情頁返回列表頁,記住之前的狀態(tài)
這里我用url來記錄狀態(tài),之前pushState推入的url就派上用場了。 只要把進(jìn)入頁面首次請(qǐng)求的地址改成當(dāng)前url就可以了
假設(shè)之前push的url為www.example.com/search/index/5,從詳情頁返回之后url還會(huì)顯示www.example.com/search/index/5
mounted () {
ajax(location.href)
}
這樣就完成了。 當(dāng)然如果你的狀態(tài)比較復(fù)雜,可以把數(shù)據(jù)存入本地Storage,添加一些判斷即可
以上就是history保存列表頁ajax請(qǐng)求的狀態(tài)使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于history保存列表頁ajax請(qǐng)求狀態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django框架利用ajax實(shí)現(xiàn)批量導(dǎo)入數(shù)據(jù)功能
這篇文章主要介紹了Django框架利用ajax實(shí)現(xiàn)批量導(dǎo)入數(shù)據(jù)功能的相關(guān)資料,需要的朋友可以參考下2016-03-03
AJAX 二級(jí)級(jí)聯(lián)菜單實(shí)現(xiàn)代碼
AJAX實(shí)現(xiàn)二級(jí)級(jí)聯(lián)菜單,用PHP完成2009-11-11
HTTP報(bào)文及ajax基礎(chǔ)知識(shí)
客戶端傳遞給服務(wù)器的內(nèi)容 和 服務(wù)器傳遞給客戶端的內(nèi)容 都屬于HTTP報(bào)文。Ajax是客戶端JS中的方法,用來向服務(wù)端發(fā)送請(qǐng)求,下面通過本文給大家分享HTTP報(bào)文及ajax基礎(chǔ)知識(shí),感興趣的朋友一起看看吧2017-08-08
Ajax實(shí)現(xiàn)無刷新分頁實(shí)例代碼
這篇文章主要介紹了Ajax實(shí)現(xiàn)無刷新分頁實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
AJAX在GB2312的中文編碼傳輸 AJAX特殊字符編碼正確方法
此文章為個(gè)人總結(jié),花了近半天時(shí)間搜索、試驗(yàn),在網(wǎng)上看到很多關(guān)于AJAX編碼問題,不一而足2010-01-01

