vue實(shí)現(xiàn)微信瀏覽器左上角返回按鈕攔截功能
【需求】
在微信公眾號開發(fā)中,有時需要對瀏覽器左上角返回按鈕進(jìn)行攔截處理相關(guān)的頁面邏輯,而并不是讓頁面直接返回上一頁,之前在這個細(xì)節(jié)點(diǎn)上的一直實(shí)現(xiàn)得不是很好。但看到京東購物公眾號上的效果卻實(shí)現(xiàn)得非常好,所以自己也開始了這方面的嘗試。京東的效果如下圖:

從上圖京東購物效果上來看,在點(diǎn)擊搜索拉起一個搜索界面,然后點(diǎn)擊左上角反回,只是將搜索界面收起,而頁面沒有重新像讀取進(jìn)度條一樣去返回,而我頁面需要的正是這樣的效果,下面就用vue來做一個這個過程的 demo 吧。
【前提】
微信左上角的返回按鈕其實(shí)無法被攔截,但是可以監(jiān)聽到這個返回事件。
【思路】
要想真正攔截返回事件,可以當(dāng)前頁面先向 window.history 中添加一個記錄(實(shí)際只是在歷史記錄堆棧中添加一條記錄 pushState,瀏覽器并不會真正去加載這個路徑),當(dāng)點(diǎn)擊返回時,監(jiān)聽到返回事件處理自己想處理的邏輯,反正微信它是一定要執(zhí)行返回,剛添加的那條記錄就會從 window.history 拿出并將此路徑替換當(dāng)前頁面路徑。注意:這里只是路徑的替換,只是將路徑換了個名字,并不是會真正去加載這個路徑。
【實(shí)現(xiàn)】
demo 里建立了兩個 vue 頁面( first 和 two ),第一個頁面跳轉(zhuǎn)到到第二個頁面。然后在第二個頁面彈出一個蒙層,這時點(diǎn)擊左上角返回時,并不是返回 first,而是先將蒙層消失,再次點(diǎn)擊返回時才是返回上一頁;實(shí)現(xiàn)效果如下:

【相關(guān)代碼講解】
1. 在第二個頁面 mounted 方法中加入,添加監(jiān)聽返回事件方法。當(dāng)返回按鈕被點(diǎn)擊時,這里讓彈出的蒙層隱藏;
mounted() {
let that = this;
// 添加返回事件監(jiān)聽
window.addEventListener("popstate", function(e) {
that.isShowTestDiv = false;
}, false);
},
2. 監(jiān)聽蒙層,當(dāng)它顯示時,在window.history(歷史堆棧)中添加一條記錄;
watch: {
isShowTestDiv: function(newVal, oldVal) {
if (newVal === true) {
this.pushHistory();
}
}
}
pushHistory() { // 修改history
var state = {
title: "",
url: "/two" // 這個url可以隨便填,只是為了不讓瀏覽器顯示的url地址發(fā)生變化,對頁面其實(shí)無影響
};
window.history.pushState(state, state.title, state.url);
},
3. 最后彈出的蒙層如果用戶點(diǎn)蒙層上相關(guān)操作將蒙層關(guān)閉,那么要手動將自己添加的那條記錄從 history 中移除,在 vue 中將路由 back 一下即可。
helloClick() { // 點(diǎn)擊彈出來的hello蒙板
this.isShowTestDiv = false;
this.$router.back(); // 將添加記錄從history中移除
}
【相關(guān)補(bǔ)充】
注意:window.addEventListener 添加的事件回調(diào)會一直存在,因為 Vue 實(shí)例銷毀時,window 對象并不會銷毀。可以在它的回調(diào)里打印,會發(fā)現(xiàn)在 two 之外的頁面點(diǎn)返回也會進(jìn)入它的方法。但因為 two 頁面內(nèi)對象數(shù)據(jù)都已銷毀,所以進(jìn)了此方法也無任何問題。如果不想讓其進(jìn)入,可以用存儲一些全局變量加入 if 判斷,在 two 頁面 destroyed 等相關(guān)勾子函數(shù)將這個全局變量置成想要狀態(tài);或者在全局路由勾子方法中設(shè)置相關(guān)全局變量也可以。
之前有嘗試在 two 的 destroyed 方法內(nèi),通過 window.removeEventListener 移除添加的方法,但發(fā)現(xiàn)無效果。可能 popstate 是微信內(nèi)置方法,不能被移除。
【demo地址】
https://github.com/LiJinShi/wechat_back_vue
總結(jié)
以上所述是小編給大家介紹的vue實(shí)現(xiàn)微信瀏覽器左上角返回按鈕攔截功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
vue監(jiān)聽sessionStorage中值的變化方式
這篇文章主要介紹了vue監(jiān)聽sessionStorage中值的變化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
vue css 引入asstes中的圖片無法顯示的四種解決方法
這篇文章主要介紹了vue css 引入asstes中的圖片 無法顯示的幾種解決方案,本文給出了四種解決方法,每種方法給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
antdesign-vue結(jié)合sortablejs實(shí)現(xiàn)兩個table相互拖拽排序功能
這篇文章主要介紹了antdesign-vue結(jié)合sortablejs實(shí)現(xiàn)兩個table相互拖拽排序功能,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Vue中import與@import的區(qū)別及使用場景說明
這篇文章主要介紹了Vue中import與@import的區(qū)別及使用場景說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
基于vue-router 多級路由redirect 重定向的問題
今天小編就為大家分享一篇基于vue-router 多級路由redirect 重定向的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼
這篇文章主要介紹了go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11

