首先我們要了解關閉和刷新所用到的事件
頁面加載時只執行onload
頁面關閉時只執行onunload
頁面刷新時先執行onbeforeunload,然后onunload,最后onload。這樣我們可以在onbeforeunload中加一個標記,在onunload中判斷該標記,即可達到判斷頁面是否真的關閉了。
了解了這個的話就可以開始寫代碼了
首先我以下代碼是實現刷新之后退出當前頁面,返回上一頁。
要實現其他的退出之后請求接口也是可以的,自行看備注實現
先在 methods里面寫兩個方法
unloadFn() { this._gap_time = new Date().getTime() - this._beforeUnload_time; if(this._gap_time <= 5){ //關閉瀏覽器執行的代碼或者接口
sessionStorage.clear(); } else { //刷新我需要做的事情 sessionStorage.setItem('reload',1) } }, beforeunloadFn(e) { this._beforeUnload_time = new Date().getTime(); e = e || window.event; if (e) { e.returnValue = "您是否確認離開此頁面-您輸入的數據可能不會被保存"; } return "您是否確認離開此頁面-您輸入的數據可能不會被保存"; }
注意!在舊版瀏覽器中可以自定義提示文案,既是return
后面返回的參數
但在新版的瀏覽中,已經不支持自定義彈窗。只能調用瀏覽器自帶的提示確認窗格
添加了方法我們需要加個監聽事件來執行我們的代碼
在cerated或者在methods里面加入
var _t = this; if(!!sessionStorage.getItem("reload")){ //剛剛解析了因為我實現的是刷新返回到上一頁,所以刷新的時候我存了個sessionStorage,然后進來判斷有這個就返回上一頁,然后把sessionStorage去掉 _t.$router.go(-1); sessionStorage.clear() } window.addEventListener("unload", e => this.unloadFn()); window.addEventListener("beforeunload", e => this.beforeunloadFn(e));
然后在離開當前頁面的時候注銷監聽
destroyed里面
window.removeEventListener("unload", e => this.unloadFn()); window.removeEventListener("beforeunload", e => this.beforeunloadFn());
這里實現的原理是根據時間差來實現
注意的是當在你按着f5不動的情況下,onbeforeunload與onunload的時間差也會小於5,從而執行了關閉頁面的代碼,不管很少人會按住不放