JS區(qū)分瀏覽器頁面是刷新還是關閉
Web開發(fā)者在系統(tǒng)開發(fā)中經(jīng)常要面對產品經(jīng)理各式各樣的需求,當然,大部分對產品體驗還是有幫助的,例如我們今天提到的刷新頁面,前進后退,關閉瀏覽器標簽時,為了避免用戶誤操作,需給出二次確認提示框,這個相信大家都非常熟悉了,采用瀏覽器提供的BOM事件機制就可以解決,使用window對象的onbeforeunload事件即可,如果產品經(jīng)理只提出這樣的需求,那確實無可厚非,然而其需要的不僅僅是這些...
例如,我們一次項目開發(fā)中,產品經(jīng)理就針對我們的實現(xiàn)提出了“改進方案”:
你們這彈出框太丑了,跟系統(tǒng)整體風格不搭調啊,不能使用咱們自己組件庫中的Dialog嗎?很好的問題...我只想說,you can you up...
你們這刷新和關閉標簽頁中展示的文案一樣啊,需要區(qū)分對待下,刷新提示XXX,關閉時提示SSS,這樣用戶才能更明確。恩,考慮到了用戶的體驗,很好,我還是想說,you can you up...其實,瀏覽器在關閉和刷新時,本身已經(jīng)區(qū)別對待了,提示是不同的,只不過我們自定義的部分并不能顯示不同的文案而已;當然,也有一些hack的方法,但是很難適應多個瀏覽器,各瀏覽器內部對于關閉標簽頁和刷新的實現(xiàn)機制會有所不同;
你們每次登錄進來,為什么要延時10秒,才讓坐席簽入電話系統(tǒng)啊(我們做的是客服系統(tǒng))?能不能把這個限制去掉啊,用戶體驗太不好了!我們也想去掉啊,但是電話系統(tǒng)頻繁簽入簽出會有問題,用戶刷新了瀏覽器,再次簽入,如果相隔時間很短的話,電話系統(tǒng)會出現(xiàn)故障,為了避免這個問題,我們才加上了這個限制,但是回過頭來思考,就可以進入我們今天討論的主題了;
區(qū)分刷新與關閉標簽頁
我們無法根據(jù)瀏覽器事件區(qū)分刷新還是關閉標簽頁,進而在相應動作觸發(fā)前,執(zhí)行不同的動作,但是對于上文中產品提出的第三點意見,其實還是可以考慮優(yōu)化一下的,就是只有在刷新的時候延時10秒,新登錄或關閉標簽頁一段時間之后再進來時不延時;
要做到這點其實也很簡單,使用瀏覽器的本地存儲機制就可以實現(xiàn),例如cookie,LocalStorage等,這里就不能使用SessionStorage了,因為本次回話結束后,該緩存就失效了;由于在cookie中存儲會增加cookie的字節(jié)數(shù),每次請求中相應的網(wǎng)絡傳輸量會增加,因此,我們采用了LocalStorage;其操作很簡單,我們使用的前端框架是AngularJS,具體如下:
const MAX_WAIT_TIME = 10; const currentDate = new Date().getTime(); const lastestLeaveTime = parseInt(this.$window.localStorage.getItem('lastestLeaveTime'), 10) || currentDate; this.secondCounter = Math.max(MAX_WAIT_TIME - Math.ceil((currentDate - lastestLeaveTime) / 1000), 0); if (this.secondCounter > 0) { this.logoutTimeInterval = this.$interval(()=> { this.secondCounter--; this.$scope.$digest(); }, 1000, this.secondCounter, false).then(() => { this.updateByStatus(this.AvayaService.status.OFFLINE); }); } else { this.updateByStatus(this.AvayaService.status.OFFLINE); }
上面代碼主要作用是,進入系統(tǒng)后,會先去LocalStorage中獲取上次退出時的時間,再獲取當前時間,兩個時間進行減法,如果值小于10秒,我們就認為這是刷新,如果值大于10秒,我們認為是關閉標簽頁或新登錄,進而可以執(zhí)行不同的方法,讓客服有更好的體驗,不用每次進入系統(tǒng)都要等待10秒才能簽入電話系統(tǒng)了,產品經(jīng)理還是很重要的,吼吼,要不是他的疑問,可能我們也不會來優(yōu)化這個地方了...當然,其實RD也要逐漸培養(yǎng)這種用戶體驗至上的思維,哪怕有一點可提升客服效率的地方,都值得我們花時間來優(yōu)化;
下面把相關退出的代碼也貼一下吧,前面忘說了,不管是刷新,還是關閉標簽頁,只要是頁面銷毀,我們都會去執(zhí)行登出電話系統(tǒng)的操作,所以每次進來后需要重新簽入;
//刷新頁面或者關閉頁面 $window.onbeforeunload = () => { return '操作將會導致頁面數(shù)據(jù)清空,請謹慎操作...'; }; //每次頁面unload時,設置LocalStorage時間; $window.onunload = () => { $window.localStorage.setItem('lastestLeaveTime', new Date().getTime()); };
我們可能還注意到一些問題,那就是刷新,關閉頁面,前進后退,你需要跳出瀏覽器默認二次確認框,但是用戶點擊退出系統(tǒng)按鈕,則必須彈出自己組件庫中的Dialog了,還必須不能兩個都彈出,具體代碼如下:
onStatusClick(index, name) { if (name === '退出') { this.mgDialog.openConfirm({ showClose: false, template: 'app/header/logoutDialog.html', controller: 'HeaderDialogController as dialog', data: { 'title': '您確定要退出系統(tǒng)嗎?' } }).then(() => { this.$window.location.href = '/logout'; this.$window.onbeforeunload = null; }); } else { // 內部操作,大家不用管 ... } }
以上所述是小編給大家介紹的JS區(qū)分瀏覽器頁面是刷新還是關閉的全部內容,希望對大家有所幫助!
- 基于Jquery 解決Ajax請求的頁面 瀏覽器后退前進功能,頁面刷新功能實效問題
- 捕獲瀏覽器關閉、刷新事件不同情況下的處理方法
- JavaScript不刷新實現(xiàn)瀏覽器的前進后退功能
- js監(jiān)控IE火狐瀏覽器關閉、刷新、回退、前進事件
- Js智能判斷瀏覽器是關閉還是刷新的代碼
- 基于JavaScript判斷瀏覽器到底是關閉還是刷新(超準確)
- 驗證碼在IE中不刷新而谷歌等瀏覽器正常的解決方案
- 解決微信瀏覽器Javascript無法使用window.location.reload()刷新頁面
- javaweb用戶注銷后點擊瀏覽器返回刷新頁面重復登錄問題的解決方法
- 深入理解瀏覽器的各種刷新規(guī)則
相關文章
es6 javascript對象Object.values() , Object.entr
這篇文章主要介紹了es6 javascript對象Object.values() , Object.entries()的示例代碼,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12javascript實現(xiàn)簡約的頁面右下角點擊彈出窗口示例【測試可用】
這篇文章主要介紹了javascript實現(xiàn)的頁面右下角點擊彈出窗口功能,結合實例形式詳細分析了javascript頁面右下角點擊彈出窗口功能的相關步驟、原理與注意事項,需要的朋友可以參考下2023-07-07javascript 多種搜索引擎集成的頁面實現(xiàn)代碼
這個頁面是為了方便自己同時使用多種搜索引擎(呵呵我用其作默認主頁),在IE5/IE6/FireFox下均運行正常,效果如下圖2010-01-01JavaScript數(shù)據(jù)類型及相互間的轉換規(guī)則
這篇文章主要介紹了JavaScript數(shù)據(jù)類型及相互間的轉換規(guī)則,文章通過圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09JavaScript數(shù)學對象(Math)方法舉例詳解
這篇文章主要給大家介紹了關于JavaScript數(shù)學對象(Math)方法的相關資料,Math(數(shù)學)對象的作用是執(zhí)行普通的算數(shù)任務,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-03-03