vue項目使用js監(jiān)聽瀏覽器關(guān)閉、刷新、后退事件實現(xiàn)方法
業(yè)務(wù)場景
在Web應(yīng)用開發(fā)中,我們經(jīng)常會遇到這樣的需求:在用戶執(zhí)行關(guān)鍵操作,如提交表單、支付交易等過程中,突然關(guān)閉、刷新或者后退瀏覽器,可能會導(dǎo)致操作未完成或者數(shù)據(jù)丟失。為了提高用戶體驗和保證應(yīng)用數(shù)據(jù)的完整性,我們需要合理地使用JavaScript來監(jiān)聽瀏覽器關(guān)閉、刷新、后退事件,并作出相應(yīng)處理。
實現(xiàn)方案
監(jiān)聽beforeunload事件
beforeunload事件是在頁面即將卸載時觸發(fā)的,這通常發(fā)生在用戶關(guān)閉或刷新頁面之前。我們可以利用這個事件來提示用戶確認(rèn)是否真的需要離開當(dāng)前頁面。
window.addEventListener('beforeunload', function (e) {
// 兼容不同瀏覽器的提示方式
var confirmationMessage = '您確定要離開嗎?';
e.returnValue = confirmationMessage; // Gecko, Trident, Chrome 34+
return confirmationMessage; // Gecko, WebKit, Chrome <34
});
監(jiān)聽unload事件
當(dāng)文檔被完全卸載后,unload事件會被觸發(fā)。該事件可以用來執(zhí)行一些清理操作,比如清除cookies,記錄日志等。
window.addEventListener('unload', function(event) {
// 執(zhí)行一些清理操作
});
監(jiān)聽瀏覽器后退按鈕事件
瀏覽器后退按鈕觸發(fā)的是popstate事件,它通常與HTML5的歷史API結(jié)合使用。在Vue項目中,如果你使用vue-router管理路由,可以如下監(jiān)聽路由變化來處理后退按鈕的行為:
router.beforeEach((to, from, next) => {
// 可以在這里處理后退邏輯
// to 和 from 是路由對象
next(); // 確保要調(diào)用next()方法,否則鉤子就不會被resolved
});
另外,你也可以直接監(jiān)聽popstate事件來處理后退操作:
methods:{
onPopState(e) {
// 監(jiān)聽到瀏覽器回退事件(這里提示用的confirm,是可以自定義的)
if (confirm('離開當(dāng)前頁面數(shù)據(jù)可能會丟失,您確定離開當(dāng)前頁面嗎?')) {
// 點擊確定回退
window.removeEventListener('popstate', this.onPopState)
window.history.go(-1)
} else {
// 點擊取消不回退
window.history.pushState(null, null, window.location.href)
}
},
},
mounted() {
// 添加 popstate 事件監(jiān)聽
window.history.pushState(null, null, window.location.href);
window.addEventListener('popstate', this.onPopState);
},
beforeDestroy() {
// 在組件銷毀前,移除 popstate 事件監(jiān)聽
window.removeEventListener('popstate', this.onPopState)
}
區(qū)分瀏覽器刷新與關(guān)閉
對于瀏覽器刷新事件的監(jiān)聽,雖然它會觸發(fā)beforeunload事件,但有時我們需要區(qū)分頁面是被刷新還是被關(guān)閉。這可以通過一些技巧來實現(xiàn),例如使用sessionStorage。
if (performance.navigation.type == performance.navigation.TYPE_RELOAD) {
console.info("這是一個刷新頁面的操作");
} else {
console.info("這是一個新訪問頁面的操作");
}
請注意,performance.navigation特性已不推薦使用,因為它已被廢棄并不被所有瀏覽器支持。取而代之的是Navigation Timing API,盡管如此,這個API也不能直接檢測刷新事件。
在使用上述事件時,我們應(yīng)當(dāng)小心謹(jǐn)慎,避免阻礙用戶的正常操作。特別是beforeunload事件,如果不是非常必要,最好不要使用,因為它可能會影響用戶體驗。我們應(yīng)該只在用戶可能會丟失重要數(shù)據(jù)的情況下使用警告提示。
附:vue如何區(qū)別瀏覽器刷新和關(guān)閉
知識點
瀏覽器關(guān)閉執(zhí)行的是 beforeunload , unload 這兩個事件;
而瀏覽器刷新執(zhí)行的是beforeunload, unload, load 三個事件;
思路
雖然刷新與關(guān)閉都會走onbeforeunload與onunload,但可能因為刷新在加載新頁面前內(nèi)部機(jī)制還需要做一些準(zhǔn)備工作,所以刷新事件在執(zhí)行到onunload事件時,用的時間會比關(guān)閉事件時間長。
所以,通過時間差來判斷瀏覽器是刷新還是關(guān)閉,瀏覽器執(zhí)行beforeunload的時候給一個開始時間,執(zhí)行unload的時候給一個結(jié)束時間;判斷一下時間差;我設(shè)置的是5毫秒來區(qū)分瀏覽器的關(guān)閉和刷新,具體的時間最好還是親自測一下;
代碼
mounted() {
let beginTime = 0; //開始時間
let differTime = 0; //時間差
window.onunload = function () {
differTime = new Date().getTime() - beginTime;
if (differTime <= 5) {
console.log("這是關(guān)閉");
} else {
console.log("這是刷新");
}
};
window.onbeforeunload = function () {
beginTime = new Date().getTime();
};
},
};
本人親測有效
總結(jié)
到此這篇關(guān)于vue項目使用js監(jiān)聽瀏覽器關(guān)閉、刷新、后退事件實現(xiàn)方法的文章就介紹到這了,更多相關(guān)vue js監(jiān)聽瀏覽器關(guān)閉、刷新、后退事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Element-ui table中過濾條件變更表格內(nèi)容的方法
下面小編就為大家分享一篇Element-ui table中過濾條件變更表格內(nèi)容的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
vue中使用iview自定義驗證關(guān)鍵詞輸入框問題及解決方法
這篇文章主要介紹了vue中使用iview自定義驗證關(guān)鍵詞輸入框問題及解決方法,本文通過實例結(jié)合代碼的形式給大家介紹解決方法,需要的朋友可以參考下2018-03-03
如何使用el-cascader組件寫下拉級聯(lián)多選及全選功能
這篇文章主要介紹了如何使用el-cascader組件寫下拉級聯(lián)多選及全選功能,因為是有全選的功能,所以不能直接使用el-cascader組件,?而是選擇使用el-select組件,?在此組件內(nèi)部使用el-cascader-panel級聯(lián)面板,感興趣的朋友跟隨小編一起看看吧2024-03-03
vue結(jié)合Axios+v-for列表循環(huán)實現(xiàn)網(wǎng)易健康頁面(實例代碼)
這篇文章主要介紹了vue結(jié)合Axios+v-for列表循環(huán)實現(xiàn)網(wǎng)易健康頁面,在項目下安裝axios,通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
KKFileView結(jié)合vue多格式文件在線預(yù)覽功能實現(xiàn)
kkFileView是git的開源在線文件預(yù)覽項目,這篇文章主要介紹了KKFileView結(jié)合vue多格式文件在線預(yù)覽功能,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
Vue實現(xiàn)獲取后端接口API代碼片段(已封裝Service方法名)
Vue實現(xiàn)獲取后端接口API代碼片段(已封裝Service方法名),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

