你知道關(guān)閉頁(yè)面時(shí)怎么向后臺(tái)發(fā)送消息嗎臣疑?

image

需求

這兩天碰到一個(gè)需求:在用戶刷新頁(yè)面或者關(guān)閉頁(yè)面的時(shí)候,前端要給后臺(tái)發(fā)一條請(qǐng)求洗搂,釋放該頁(yè)面的授權(quán)占用。

分析了一下载弄,這不就是在頁(yè)面卸載時(shí)發(fā)請(qǐng)求嘛耘拇,三下五除二就實(shí)現(xiàn)一版:

window.addEventListener("beforeunload", () => {
let oReq = new XMLHttpRequest();
oReq.open("POST", "http://127.0.0.1:1991/loginout");
oReq.send(JSON.stringify({name: "編程三昧"}));

測(cè)試發(fā)現(xiàn):

  • 刷新頁(yè)面時(shí)基本滿足需求(偶爾也會(huì)有后臺(tái)接收不到請(qǐng)求的現(xiàn)象,但概率很低)
  • 關(guān)閉頁(yè)面時(shí)宇攻,后臺(tái)接收不到請(qǐng)求

既然異步 Ajax 不行惫叛,那就試試同步的吧,結(jié)果直接報(bào)錯(cuò)了:

image

搜了一下逞刷,解釋如下:

Chrome now disallows synchronous XHR during page dismissal when the page is being navigated away from or closed by the user. This involves the following events (when fired on the path of page dismissal): beforeunload, unload, pagehide, and visibilitychange.

概括起來就是:對(duì)現(xiàn)在的 Chrome 來說嘉涌,在頁(yè)面導(dǎo)航離開或者被用戶關(guān)閉時(shí)妻熊,不允許發(fā)送同步 XHR 請(qǐng)求,涉及到的事件有:beforeunload仑最、unload扔役、pagehide 和 visibilitychange。

雖然問題沒解決警医,但是卻長(zhǎng)知識(shí)了亿胸,這波不太虧!

navigator.sendBeacon()

后來通過搜索预皇,看到有一個(gè)接口是專門來干這事的侈玄,那就是 navigator.sendBeacon()

描述

這個(gè)方法主要用于滿足統(tǒng)計(jì)和診斷代碼的需要深啤,這些代碼通常嘗試在卸載(unload)文檔之前向web服務(wù)器發(fā)送數(shù)據(jù)拗馒。

語(yǔ)法

navigator.sendBeacon(url, data);

參數(shù)

  • url 表明 data 將要被發(fā)送到的網(wǎng)絡(luò)地址。
  • data 參數(shù)是將要發(fā)送的 ArrayBufferViewBlob 溯街、DOMString 或者 FormData 類型的數(shù)據(jù)诱桂。

返回值

當(dāng)用戶代理成功把數(shù)據(jù)加入傳輸隊(duì)列時(shí),sendBeacon() 方法將會(huì)返回 true呈昔,否則返回 false挥等。

實(shí)現(xiàn)

既然有了接口,那實(shí)現(xiàn)起來就簡(jiǎn)單了堤尾。

代碼

 window.addEventListener("beforeunload", (e) => {
    const data = {name: "編程三昧"};
    window.navigator.sendBeacon("http://127.0.0.1:1991/loginout", JSON.stringify(data));
});

效果

不管是刷新頁(yè)面還是關(guān)閉頁(yè)面肝劲,后臺(tái)都能接收到前端發(fā)送過來的請(qǐng)求,完美實(shí)現(xiàn)需求郭宝。

總結(jié)

瀏覽器現(xiàn)在功能越來越強(qiáng)大辞槐,支持的 API 也越來越豐富,放在之前很難實(shí)現(xiàn)的功能粘室,現(xiàn)在可能就是輕而易舉的事榄檬,還是要多關(guān)注技術(shù)動(dòng)態(tài)。

~

~本文完衔统,感謝閱讀鹿榜!

~

學(xué)習(xí)有趣的知識(shí),結(jié)識(shí)有趣的朋友锦爵,塑造有趣的靈魂舱殿!

大家好,我是〖編程三昧〗的作者 隱逸王险掀,我的公眾號(hào)是『編程三昧』沪袭,歡迎關(guān)注,希望大家多多指教樟氢!

你來冈绊,懷揣期望创倔,我有墨香相迎! 你歸焚碌,無論得失,唯以余韻相贈(zèng)霸妹!

知識(shí)與技能并重十电,內(nèi)力和外功兼修,理論和實(shí)踐兩手都要抓叹螟、兩手都要硬鹃骂!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市罢绽,隨后出現(xiàn)的幾起案子畏线,更是在濱河造成了極大的恐慌,老刑警劉巖良价,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寝殴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡明垢,警方通過查閱死者的電腦和手機(jī)蚣常,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痊银,“玉大人抵蚊,你說我怎么就攤上這事∷莞铮” “怎么了贞绳?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)致稀。 經(jīng)常有香客問我冈闭,道長(zhǎng),這世上最難降的妖魔是什么豺裆? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任拒秘,我火速辦了婚禮,結(jié)果婚禮上臭猜,老公的妹妹穿的比我還像新娘躺酒。我一直安慰自己,他們只是感情好蔑歌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布羹应。 她就那樣靜靜地躺著,像睡著了一般次屠。 火紅的嫁衣襯著肌膚如雪园匹。 梳的紋絲不亂的頭發(fā)上雳刺,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音裸违,去河邊找鬼掖桦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛供汛,可吹牛的內(nèi)容都是我干的枪汪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怔昨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雀久!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趁舀,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赖捌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矮烹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體越庇,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年擂送,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悦荒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘹吨,死狀恐怖搬味,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蟀拷,我是刑警寧澤碰纬,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站问芬,受9級(jí)特大地震影響悦析,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜此衅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一强戴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挡鞍,春花似錦骑歹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春最域,著一層夾襖步出監(jiān)牢的瞬間谴分,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工镀脂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牺蹄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓薄翅,卻偏偏與公主長(zhǎng)得像钞馁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匿刮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 背景: 有一個(gè)任務(wù)非常耗時(shí)會(huì)消耗后臺(tái)大量算力,所以在退出頁(yè)面的時(shí)候探颈,要求前端這邊發(fā)送一個(gè)請(qǐng)求來殺死任務(wù)熟丸。 一開始以...
    OBKoro1閱讀 1,580評(píng)論 0 0
  • 有時(shí)候我們需要在用戶離開頁(yè)面的時(shí)候,做一些上報(bào)來記錄用戶行為伪节。又或者是發(fā)送服務(wù)器ajax請(qǐng)求光羞,通知服務(wù)器用戶已經(jīng)離...
    grain先森閱讀 1,779評(píng)論 2 26
  • 1. 監(jiān)聽頁(yè)面離開 頁(yè)面離開包括跳轉(zhuǎn)到新頁(yè)面和關(guān)閉頁(yè)面注意:例如手機(jī)端直接切到后臺(tái)并關(guān)閉瀏覽器應(yīng)用,則無法觸發(fā)事件...
    李霖弢閱讀 1,413評(píng)論 0 5
  • 有時(shí)候我們需要在用戶離開頁(yè)面的時(shí)候怀大,做一些上報(bào)來記錄用戶行為纱兑。又或者是發(fā)送服務(wù)器ajax請(qǐng)求,通知服務(wù)器用戶已經(jīng)離...
    六月繁花開閱讀 1,097評(píng)論 1 3
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者化借,不喜歡去冒險(xiǎn)潜慎,但是人生放棄了冒險(xiǎn),也就放棄了無數(shù)的可能蓖康。 ...
    yichen大刀閱讀 6,052評(píng)論 0 4