區(qū)分瀏覽器關(guān)閉和刷新

區(qū)分瀏覽器關(guān)閉和刷新

有這樣一個(gè)需求,關(guān)閉瀏覽器標(biāo)簽頁之后铅歼,再次通過歷史記錄進(jìn)入時(shí)不能直接進(jìn)入公壤,而是要重新登錄之后才能再次進(jìn)入。大家都知道椎椰,只有關(guān)閉整個(gè)瀏覽器厦幅,sessionStorage才會(huì)消失,關(guān)閉單個(gè)標(biāo)簽頁是不會(huì)消失的慨飘,除非手動(dòng)清空慨削。查了一些相關(guān)的資料,實(shí)現(xiàn)了在關(guān)閉頁面時(shí)清空sessionStorage套媚,但是又發(fā)現(xiàn)了新bug缚态,就是在快速刷新的情況下,也會(huì)清空sessionStorage從而跳到登錄頁(很奇葩的一種操作)堤瘤。玫芦。
其實(shí)本身瀏覽器關(guān)閉和刷新沒有區(qū)別的太開,網(wǎng)上也有很多人問到底怎么區(qū)分本辐,這里會(huì)介紹兩種方案桥帆,一種是借鑒網(wǎng)上大神的医增,主要就是區(qū)別了關(guān)閉和刷新,一種是根據(jù)后來測(cè)試提出來的bug修改的老虫,在快速刷新的情況下叶骨,當(dāng)然一般人不會(huì)瘋狂的點(diǎn)f5,除了測(cè)試

先介紹幾個(gè)會(huì)用到的事件

  • onload:頁面載入時(shí)觸發(fā)
  • onbeforeunload: 在即將離開頁面(刷新或關(guān)閉)時(shí)觸發(fā)
  • onunload: 退出頁面時(shí)觸發(fā)祈匙,已經(jīng)從服務(wù)器上讀到了需要加載的新的頁面忽刽,在即將替換掉當(dāng)前頁面時(shí)調(diào)用

頁面加載時(shí)只執(zhí)行onload
頁面關(guān)閉時(shí)先執(zhí)行onbeforeunload,最后onunload
頁面刷新時(shí)先執(zhí)行onbeforeunload夺欲,然后onload跪帝,最后onunload。

以下不做兼容處理些阅,以chrome為例

方案1:

let _beforeUnload_time = 0, _gap_time = 0;
window.onunload = function (){
 _gap_time = new Date().getTime() - _beforeUnload_time;
 if(_gap_time <= 5){
    // 刷新時(shí)onbeforeunload與onunload的時(shí)間差一般都遠(yuǎn)大于5
   // 瀏覽器關(guān)閉
   sessionStorage.clear()
 } else {
   // 瀏覽器刷新
 }
}
window.onbeforeunload = function (){
    // 刷新或關(guān)閉頁面都會(huì)執(zhí)行伞剑,且先于onunload執(zhí)行
    _beforeUnload_time = new Date().getTime();
};

以上方法完全可以區(qū)分刷新和關(guān)閉,但是在你按著f5不動(dòng)的情況下市埋,onbeforeunload與onunload的時(shí)間差也會(huì)小于5黎泣,從而執(zhí)行了sessionStorage.clear(),以至跳到了登錄頁

方案2:

方案2是在方案1的基礎(chǔ)上改造的缤谎,主要是onload事件抒倚,適用于你是關(guān)閉了頁面還是刷新了頁面還是通過歷史記錄又進(jìn)入了頁面

<!DOCTYPE html>
<html lang="en">
  <script>
    // 關(guān)閉頁面清除session
    // 判斷關(guān)閉頁面之后與再次點(diǎn)開頁面得時(shí)間,刷新操作時(shí)間間隔在20ms弓千,>2000ms時(shí)說明是非刷新操作
    // 2000ms是通過關(guān)閉頁面到點(diǎn)擊歷史紀(jì)錄進(jìn)入頁面間隔得大概最短時(shí)間
    var loadTime = function (){ 
      _load_time = new Date().getTime();
      unload_time = localStorage.getItem('unload_time')
      localStorage.setItem('_load_time', _load_time);
      localStorage.setItem('nowload',_load_time-unload_time);
      const gap = _load_time-unload_time;
      if(gap>2000){
        sessionStorage.clear()
      }
    };
    loadTime()
  </script>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
    />
    <title>citic-robot-ui</title>
    <link rel="icon" href="/favicon.ico" type="image/x-icon" />
  </head>
  <body>
    <script>
      let _beforeUnload_time = 0, _gap_time = 0, _load_time=0,unload_time =0 ;
      window.onunload = function (){
        unload_time = new Date().getTime()
        localStorage.setItem('unload_time', unload_time);
      }
    </script>
  </body>
</html>

方案2主要就是通過判斷載入頁面的時(shí)間(onload事件)和上次退出頁面(onunload)之間的時(shí)間差衡便,在每次退出頁面(刷新或關(guān)閉)時(shí),都往localStorage存值洋访,在載入時(shí)取localStorage的值镣陕,并且取到載入時(shí)的時(shí)間與之相減,得到差值姻政,從而判斷用戶是刷新操作還是關(guān)了頁面又通過歷史紀(jì)錄進(jìn)來的操作呆抑。方案2將onload事件放到了最上面,之所以這樣做是避免受網(wǎng)絡(luò)速度影響導(dǎo)致載入的時(shí)間或長(zhǎng)或短從而無法控制在一個(gè)具體的范圍內(nèi)汁展。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹊碍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子食绿,更是在濱河造成了極大的恐慌侈咕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器紧,死亡現(xiàn)場(chǎng)離奇詭異耀销,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铲汪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門熊尉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罐柳,“玉大人,你說我怎么就攤上這事狰住≌偶” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵催植,是天一觀的道長(zhǎng)肮蛹。 經(jīng)常有香客問我,道長(zhǎng)查邢,這世上最難降的妖魔是什么蔗崎? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任酵幕,我火速辦了婚禮扰藕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芳撒。我一直安慰自己邓深,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布笔刹。 她就那樣靜靜地躺著芥备,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舌菜。 梳的紋絲不亂的頭發(fā)上萌壳,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音日月,去河邊找鬼袱瓮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爱咬,可吹牛的內(nèi)容都是我干的尺借。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼精拟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼燎斩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜂绎,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤栅表,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后师枣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怪瓶,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年坛吁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劳殖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铐尚。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哆姻,靈堂內(nèi)的尸體忽然破棺而出宣增,到底是詐尸還是另有隱情,我是刑警寧澤矛缨,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布爹脾,位于F島的核電站,受9級(jí)特大地震影響箕昭,放射性物質(zhì)發(fā)生泄漏灵妨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一落竹、第九天 我趴在偏房一處隱蔽的房頂上張望泌霍。 院中可真熱鬧,春花似錦述召、人聲如沸朱转。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藤为。三九已至,卻和暖如春夺刑,著一層夾襖步出監(jiān)牢的瞬間缅疟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工遍愿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留存淫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓错览,卻偏偏與公主長(zhǎng)得像纫雁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倾哺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5轧邪? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,449評(píng)論 1 45
  • # 1: 監(jiān)聽瀏覽器關(guān)閉事件 --- 后臺(tái)刪用戶登錄信息 --- IE不可用 .jsp : var _befo...
    __凌閱讀 3,876評(píng)論 0 0
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化羞海,入門級(jí)到專家級(jí)忌愚,廣度和深度都會(huì)有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,572評(píng)論 0 7
  • Web開發(fā)者在系統(tǒng)開發(fā)中經(jīng)常要面對(duì)產(chǎn)品經(jīng)理各式各樣的需求却邓,當(dāng)然硕糊,大部分對(duì)產(chǎn)品體驗(yàn)還是有幫助的,例如我們今天提到的刷...
    冰輪封雪閱讀 2,421評(píng)論 1 6
  • 說起刺客螟蝙,不得不說春秋戰(zhàn)國(guó)時(shí)期的四大刺客恢恼。 準(zhǔn)確地說是五大刺客,但是曹沫只是在酒席上拿了把水果刀嚇唬了一下齊桓公胰默,...
    鄂佛歌閱讀 1,658評(píng)論 28 30