Angular 監(jiān)聽(tīng)瀏覽器事件(刷新/關(guān)閉/...)

在項(xiàng)目中歧强,關(guān)于Angular路由跳轉(zhuǎn)的控制(Guard)如果基本都是基于CanActivateecanDeactivate芯急,我在文章Angular的守門(mén)員canActivate與canDeactivate有較為詳細(xì)的介紹岳悟,但是最后也提到主到,對(duì)于瀏覽器的刷新和關(guān)閉河泳,canDeactivate并不能處理伶授,所以還是得回歸本質(zhì)断序,直接監(jiān)聽(tīng)瀏覽器事件。

一糜烹,可監(jiān)聽(tīng)的事件的列表

學(xué)過(guò)御三家 Html , css, js 的人應(yīng)該有耳聞W3School违诗,這個(gè)強(qiáng)大的網(wǎng)站同樣也列出了

我們?cè)陂_(kāi)發(fā)過(guò)程中可能需要監(jiān)聽(tīng)的事件列表([鏈接][https://www.w3school.com.cn/tags/html_ref_eventattributes.asp])。

本文的目的是監(jiān)聽(tīng)瀏覽器事件疮蹦,但因?yàn)闉g覽器的刷新和關(guān)閉會(huì)直接觸發(fā)Window事件诸迟,所以實(shí)際上我們監(jiān)聽(tīng)的是Html中的Window事件。這里就只簡(jiǎn)單列出比較常用的幾個(gè)事件:

事件名稱(chēng) 屬性(window.x) 觸發(fā)時(shí)機(jī)
beforeunload onbeforeunload 顧名思義愕乎,當(dāng)用戶(hù)卸載文檔執(zhí)行之前觸發(fā)
unload onunload 當(dāng)用戶(hù)卸載文檔執(zhí)行時(shí)觸發(fā)(瀏覽器關(guān)閉)
load onload 頁(yè)面加載之后立即觸發(fā)
resize onresize 當(dāng)瀏覽器窗口被調(diào)整大小時(shí)觸發(fā)

一些使用場(chǎng)景:

  • unload: 可以類(lèi)比 onDestroy()阵苇,我們可以在里面寫(xiě)一些清空臨時(shí)數(shù)據(jù)之類(lèi)的操作;
  • load:可以類(lèi)比onInit()感论,可以執(zhí)行一些初始化的函數(shù)在里面慎玖;
  • resize:可以直接想到的就是界面大小變化后界面動(dòng)態(tài)適配;
  • beforeunload:這個(gè)可以想像成 before ngOnDestroy()笛粘,就是還沒(méi)Destroy之前的操作趁怔,這也是經(jīng)常用到一個(gè)事件湿硝。

二,@HostListener

我們?cè)谏厦嫖业囊黄恼聦?xiě)到一個(gè)場(chǎng)景润努,就是用戶(hù)在編輯還未保存的情況下離開(kāi)當(dāng)前界面关斜,我們需要給他個(gè)提醒,當(dāng)時(shí)我們用canDeactivate已經(jīng)解決了大部分場(chǎng)景铺浇,但是針對(duì)瀏覽器刷新和關(guān)閉不能處理痢畜,所以來(lái)看看Angular中的 Dom Event Listner@HostListener

官方的解釋是:

Decorator that declares a DOM event to listen for, and provides a handler method to run when that event occurs.

大致意思:

  1. 它是個(gè)修飾器(一看帶了個(gè)@);
  2. 它需要你傳入兩個(gè)參數(shù):
    • eventName: string // 監(jiān)聽(tīng)的事件名稱(chēng)
    • args: string[] // 事件發(fā)生時(shí)傳給處理器的參數(shù)

注意鳍侣,我們要傳的是事件名稱(chēng)丁稀,不是屬性,比如你要監(jiān)聽(tīng)unload倚聚,就應(yīng)該寫(xiě):

@HostListener('window:unload', [`$event`]) ...  // right !
@HostListener('window.onunload', [`$event`]) ...  // wrong !
@HostListener('window:onunload', [`$event`]) ...  // wrong !

三线衫,實(shí)例

還是那個(gè)場(chǎng)景,未保存修改刷新/關(guān)閉瀏覽器惑折,彈出提示:

import { 
    ...
    HostListener,
    ...
} from '@angular/core';

...
@HostListener('window:beforeunload', ['$event'])
private beforeUnload(event: Event) {
  if(this.form.dirty) {
    event.preventDefault();
    event.returnValue = true;  // Chrome requires returnValue to be set.
  }
}
....

來(lái)看一下代碼授账,我已經(jīng)標(biāo)注了非常重要的一步,我們必須對(duì)該 event-unload來(lái)返回一個(gè)值惨驶,以此來(lái)暫停事件的繼續(xù)進(jìn)行(become unload)來(lái)達(dá)到我們所預(yù)期的目的白热。

如果不寫(xiě)這一句,直接寫(xiě)你的代碼邏輯:

...
private beforeUnload(event: Event) {
  if(this.form.dirty) {
    // event.preventDefault();
    // event.returnValue = true;
    return this.alertService.alert('Are you confrimed ?');
  }
}
...

像這樣的話(huà)粗卜,你會(huì)發(fā)現(xiàn)你的代碼確實(shí)是執(zhí)行了屋确,但是頁(yè)面同樣繼續(xù)執(zhí)行了刷新,與我們的期望背道而馳续扔。

提示

這個(gè)before unload事件我們寫(xiě)的 returnValue = true實(shí)際上你可以寫(xiě)any thing攻臀,因?yàn)樗紩?huì)彈出一個(gè)基于瀏覽器的提示框,這個(gè)東西就不受你的ux掌控了测砂,所以如果選擇使用茵烈,請(qǐng)首先和你的ux確定,他/她覺(jué)得可以這樣做砌些,不然別好心卻被罵了呜投。

以上本文完結(jié)。由錯(cuò)誤的地方或者需要討論的地方請(qǐng)多多指正存璃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仑荐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纵东,更是在濱河造成了極大的恐慌粘招,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偎球,死亡現(xiàn)場(chǎng)離奇詭異洒扎,居然都是意外死亡辑甜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)袍冷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)磷醋,“玉大人,你說(shuō)我怎么就攤上這事胡诗〉讼撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵煌恢,是天一觀的道長(zhǎng)骇陈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瑰抵,這世上最難降的妖魔是什么你雌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谍憔,結(jié)果婚禮上匪蝙,老公的妹妹穿的比我還像新娘主籍。我一直安慰自己习贫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布千元。 她就那樣靜靜地躺著苫昌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幸海。 梳的紋絲不亂的頭發(fā)上祟身,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音物独,去河邊找鬼袜硫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挡篓,可吹牛的內(nèi)容都是我干的婉陷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼官研,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秽澳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起戏羽,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤担神,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后始花,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體妄讯,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孩锡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亥贸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮创。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砌函,靈堂內(nèi)的尸體忽然破棺而出斩披,到底是詐尸還是另有隱情,我是刑警寧澤讹俊,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布垦沉,位于F島的核電站,受9級(jí)特大地震影響仍劈,放射性物質(zhì)發(fā)生泄漏厕倍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一贩疙、第九天 我趴在偏房一處隱蔽的房頂上張望讹弯。 院中可真熱鬧,春花似錦这溅、人聲如沸组民。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臭胜。三九已至,卻和暖如春癞尚,著一層夾襖步出監(jiān)牢的瞬間耸三,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工浇揩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仪壮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓胳徽,卻偏偏與公主長(zhǎng)得像积锅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膜廊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • ??JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的爪瓜。 ??事件蹬跃,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評(píng)論 1 11
  • 本節(jié)介紹各種常見(jiàn)的瀏覽器事件。 鼠標(biāo)事件 鼠標(biāo)事件指與鼠標(biāo)相關(guān)的事件,主要有以下一些蝶缀。 click 事件丹喻,dblc...
    許先生__閱讀 2,432評(píng)論 0 4
  • 之前寫(xiě)過(guò)一篇瀏覽器事件的相關(guān)操作和事件運(yùn)行的原理——JavaScript瀏覽器事件解析。這一篇主要寫(xiě)一些常用的事件...
    faremax閱讀 1,616評(píng)論 0 0
  • 資源事件 beforeunload 事件 beforeunload事件在窗口翁都、文檔碍论、各種資源將要卸載前觸發(fā)。它可以...
    oWSQo閱讀 614評(píng)論 0 1
  • JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的柄慰。事件鳍悠,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬...
    LemonnYan閱讀 679評(píng)論 0 4