<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近在需求中有一個這樣的場景:
需要在頁面關閉的時候,使用者不需要操作,主動關閉當前訂單
當時考慮的方案:在頁面關閉的時候,向後端傳送一個請求,將這個資源釋放掉;
定下方案時,覺得也不是什麼難事,覺得谷歌瀏覽器應該會提供頁面關閉的 API 供開發者使用。
經過查詢,找到了這麼兩個 API :beforeunload 和 unload
當瀏覽器視窗關閉或者重新整理時,會觸發 beforeunload 事件。當前頁面不會直接關閉,可以點選確定按鈕關閉或重新整理,也可以取消關閉或重新整理。
window.addEventListener('beforeunload', function (event) { // Cancel the event as stated by the standard. event.preventDefault(); // Chrome requires returnValue to be set. event.returnValue = ''; });
該事件會使網頁在離開或者重新整理的時候彈出一個對話方塊,給使用者一個提示。在這個彈框出現時,該頁面是做不了任何操作的,除非把這個彈框關閉。其他頁面也只能進行簡單的點選瀏覽操作,鍵盤是操作不了的。
這個不符合使用者無感知的條件
當檔案或一個子資源正在被解除安裝時, 觸發 unload 事件。
unload 事件在 beforeunload 事件後觸發,這時候檔案處於一個什麼狀態呢?
所有資源都存在,像圖片,iframe的等,但是這些資源對於使用者來說均不可見,介面上的互動也是無效的.
使用方式和 beforeunload 相同,但是 unload 事件中不能使用確認框,畢竟都已經在解除安裝了
window.addEventListener('unload', function(event) { console.log('unload'); });
window.addEventListener('unload', function (event) { let xhr = new XMLHttpRequest(); xhr.open('post', '/log', false); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('foo=bar'); });
但是谷歌瀏覽器已經不允許頁面關閉期間進行同步的 XMLHTTPRequest(),這條規則適用於 beforeunload、unload、pagehide和visibilitychange這些 API;
為了確保頁面在解除安裝時講資料傳送到伺服器,官方建議使用 sendBeacon()或者 Fetch keep-alive
官方連結 https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/sendBeacon
這個方法主要用於滿足統計和診斷程式碼的需要,這些程式碼通常嘗試在解除安裝(unload)檔案之前向web伺服器傳送資料。
Beacon API 有以下這樣幾個特點:
用法如下:
navigator.sendBeacon(url, data);
url 就是上報地址,data 可以是 ArrayBufferView,Blob,DOMString 或 Formdata,根據官方規範,需要 request header 為 CORS-safelisted-request-header,在這裡則需要保證 Content-Type 為以下三種之一:
application/x-www-form-urlencoded
multipart/form-data
text/plain
我們一般會用到 DOMString , Blob 和 Formdata 這三種物件作為資料傳送到後端,下面以這三種方式為例進行說明。
DOMString
如果資料型別是 string,則可以直接上報,此時該請求會自動設定請求頭的 Content-Type 為 text/plain。
const reportData = (url, data) => { navigator.sendBeacon(url, data); };
Blob
如果用 Blob 傳送資料,這時需要我們手動設定 Blob 的 MIME type,一般設定為 application/x-www-form-urlencoded。
const reportData = (url, data) => { const blob = new Blob([JSON.stringify(data), { type: 'application/x-www-form-urlencoded', }]); navigator.sendBeacon(url, blob); };
Formdata
可以直接建立一個新的 Formdata,此時該請求會自動設定請求頭的 Content-Type 為 multipart/form-data。
const reportData = (url, data) => { const formData = new FormData(); Object.keys(data).forEach((key) => { let value = data[key]; if (typeof value !== 'string') { // formData只能append string 或 Blob value = JSON.stringify(value); } formData.append(key, value); }); navigator.sendBeacon(url, formData); };
注意這裡的 JSON.stringify 操作,伺服器端需要將資料進行 parse 才能得到正確的資料。
當使用fetch() 方法時,如果把keeplive 設定為true,即便頁面被終止請求也會保持連線。
window.onunload = function() { fetch('/analytics', { method: 'POST', body: "statistics", keepalive: true }); };
以上就是Navigator sendBeacon頁面關閉也能傳送請求方法範例的詳細內容,更多關於Navigator sendBeacon請求傳送的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45