精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在關(guān)閉瀏覽器標簽前,可靠地發(fā)送 HTTP 請求?

開發(fā)
如果我們的需求是發(fā)送簡單的分析或日志數(shù)據(jù),navigator.sendBeacon() 是最直接、最符合語義的選擇。而如果我們需要更大的靈活性,比如使用 PUT 方法更新資源或需要設(shè)置特定的請求頭,fetch({ keepalive: true }) 是更好的選擇。

我們經(jīng)常遇到一個經(jīng)典場景:用戶即將關(guān)閉頁面或瀏覽器標簽,而我們需要在此刻抓住最后的機會,向服務(wù)器發(fā)送一些重要信息。

然而,這看似簡單的需求,在實踐中卻充滿了挑戰(zhàn)。傳統(tǒng)的異步請求(如 fetch 或 XMLHttpRequest)在頁面卸載事件中極有可能被瀏覽器中斷,導致請求失敗。

問題的根源:為什么常規(guī)請求會失敗?

當用戶關(guān)閉一個標簽頁時,瀏覽器會觸發(fā)一系列頁面卸載(Unload)事件,如 pagehide 和 unload。

在這個過程中,任何在 unload 事件處理器中發(fā)起的標準異步 fetch 或 XMLHttpRequest 請求都會面臨一個問題:請求剛剛發(fā)出,頁面就已經(jīng)被銷毀了。

由于頁面的 JavaScript 執(zhí)行環(huán)境已不復(fù)存在,瀏覽器沒有義務(wù)繼續(xù)完成這個請求,因此會主動取消它。

過去,開發(fā)者為了解決這個問題,會使用同步的 XMLHttpRequest。它會強制阻塞主線程,直到請求完成。這種方法雖然“有效”,但對用戶體驗是毀滅性的——它會導致瀏覽器 UI 卡死,頁面無法響應(yīng),直到網(wǎng)絡(luò)請求結(jié)束。

那么,我們該如何在不破壞用戶體驗的前提下,可靠地發(fā)送這“最后一封信”呢?

現(xiàn)代解決方案一:navigator.sendBeacon()

navigator.sendBeacon() 是 W3C 專門為解決此類問題而設(shè)計的 API。它的核心使命就是:以異步、非阻塞的方式,可靠地將少量數(shù)據(jù)發(fā)送到服務(wù)器。

(1) 工作原理

當我們調(diào)用 sendBeacon() 時,瀏覽器會將這個請求添加到一個內(nèi)部隊列中,然后立即返回,不會阻塞頁面卸載。瀏覽器會保證在合適的時機(例如在后臺)發(fā)送這個請求,即使發(fā)起請求的頁面已經(jīng)關(guān)閉。

(2) 特點

  • 可靠性高:由瀏覽器保證發(fā)送,不受頁面卸載影響
  • 異步非阻塞:不影響用戶關(guān)閉頁面的速度和體驗
  • 使用簡單:API 非常直觀
  • 數(shù)據(jù)有限制:只能單向發(fā)送 POST 請求,且無法自定義請求頭(Headers)

(3) 代碼示例

假設(shè)我們需要在用戶離開頁面時,發(fā)送一條包含頁面停留時間的分析日志。

// 推薦使用 'pagehide' 事件,它比 'unload' 更可靠
window.addEventListener('pagehide', (event) => {
 // event.persisted 為 true 表示頁面進入了往返緩存 (bfcache),并未真正卸載
 // 這種情況下我們通常不發(fā)送信標
 if (event.persisted) {
    return;
  }

 const analyticsData = {
    timeOnPage: Math.round(performance.now()),
    lastAction: 'close_tab',
  };

 // 將數(shù)據(jù)轉(zhuǎn)換為 Blob,這是 sendBeacon 支持的格式之一
 const blob = new Blob([JSON.stringify(analyticsData)], {
    type: 'application/json; charset=UTF-8',
  });

 // 使用 sendBeacon 發(fā)送數(shù)據(jù)
 // 該方法會返回 true (成功加入隊列) 或 false (數(shù)據(jù)過大或格式錯誤)
 const success = navigator.sendBeacon('/log-analytics', blob);

 if (success) {
    console.log('分析日志已成功加入發(fā)送隊列。');
  } else {
    console.error('無法發(fā)送分析日志。');
  }
});

現(xiàn)代解決方案二:fetch() 與 keepalive: true

fetch API 作為現(xiàn)代網(wǎng)絡(luò)請求的基石,也提供了一種優(yōu)雅的解決方案。通過在 fetch 的 init 對象中設(shè)置 keepalive: true,我們可以告訴瀏覽器:“這個請求很重要,請在頁面卸載后繼續(xù)完成它。”

(1) 工作原理

fetch({ keepalive: true }) 的工作方式與 sendBeacon 類似。它將一個 fetch 請求標記為“持續(xù)活動”,使其生命周期可以超越當前頁面。瀏覽器會像處理 sendBeacon 請求一樣,在后臺處理它。

(2) 特點

  • 靈活性高:相比 sendBeacon,它支持更多的 HTTP 方法(如 POST, PUT 等),并允許有限的請求頭自定義
  • API 統(tǒng)一:如果我們項目中已經(jīng)大量使用 fetch,使用 keepalive 可以保持代碼風格一致
  • 同樣無法處理響應(yīng):和 sendBeacon 一樣,由于頁面已經(jīng)關(guān)閉,我們無法在前端讀取或處理服務(wù)器返回的響應(yīng)

(3) 代碼示例

假設(shè)我們需要在用戶關(guān)閉頁面時,自動保存文本編輯器中的草稿。使用 PUT 請求可能更符合 RESTful 風格。

window.addEventListener('pagehide', (event) => {
 if (event.persisted) {
    return;
  }

 const draftContent = document.getElementById('editor').value;
 if (!draftContent) return;

 const draftData = {
    content: draftContent,
    timestamp: Date.now(),
  };

 // 使用 fetch 和 keepalive: true
 // 注意:即使請求成功,這里的 .then 和 .catch 也可能不會執(zhí)行,因為頁面正在卸載
 try {
    fetch('/api/drafts/save', {
      method: 'PUT',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(draftData),
      // 這是關(guān)鍵!
      keepalive: true,
    });
    console.log('保存草稿的請求已提交。');
  } catch (e) {
    // 這個 catch 塊很可能不會捕獲到網(wǎng)絡(luò)錯誤
    console.error('提交保存草稿請求時發(fā)生錯誤:', e);
  }
});

如何選擇?

如果我們的需求是發(fā)送簡單的分析或日志數(shù)據(jù),navigator.sendBeacon() 是最直接、最符合語義的選擇。而如果我們需要更大的靈活性,比如使用 PUT 方法更新資源或需要設(shè)置特定的請求頭,fetch({ keepalive: true }) 是更好的選擇。

這兩個現(xiàn)代 API,我們可以在不犧牲用戶體驗的前提下,確保關(guān)鍵數(shù)據(jù)的成功送達。

責任編輯:趙寧寧 來源: JavaScript
相關(guān)推薦

2022-07-03 17:55:53

HTTP頁面瀏覽器

2022-03-24 14:49:57

HTTP前端

2023-10-11 17:58:22

2021-03-09 14:56:25

Safari瀏覽器蘋果

2009-11-09 09:11:17

2020-09-09 07:00:00

TensorFlow神經(jīng)網(wǎng)絡(luò)人工智能

2018-05-17 16:25:27

2022-07-07 07:22:01

瀏覽器JavaScript工具

2021-10-13 14:53:50

UbuntuVivaldi瀏覽器

2016-08-03 15:21:03

UbuntuLinux易用性

2022-09-16 07:33:52

瀏覽器深色模式Firefox

2009-03-05 09:37:19

2021-08-02 13:05:49

瀏覽器HTTP前端

2019-11-18 15:50:11

AjaxJavascript前端

2020-11-25 09:47:11

FedoraGoogle Chro瀏覽器

2022-11-08 11:39:34

Web瀏覽器深色模式

2021-11-29 14:38:45

FedoraLinuxBrave瀏覽器

2021-07-07 07:47:10

瀏覽器CSS兼容

2018-11-19 16:10:30

瀏覽器urlhttp

2021-03-10 13:19:09

LinuxCPU程序
點贊
收藏

51CTO技術(shù)棧公眾號

国产中文字幕二区| 成人黄色短视频在线观看| 久久人妻少妇嫩草av无码专区 | 综合网中文字幕| 91欧美视频在线| 超碰在线caoporn| 精品一区二区三区欧美| 欧美日韩国产成人在线| 美女久久久久久久久| 625成人欧美午夜电影| 国产亚洲va综合人人澡精品| 国产欧美精品va在线观看| 网爆门在线观看| 一区二区在线视频观看| 狠狠做深爱婷婷久久综合一区| 日本欧美色综合网站免费| 国产精品久久久国产盗摄| 国产精品mm| 一区二区三区天堂av| 亚洲精品乱码久久久久久9色| av电影免费在线看| 国产欧美日韩一区二区三区在线观看| 成人高清视频观看www| 久久人妻无码aⅴ毛片a片app | 天堂视频免费看| 久久一卡二卡| 国产农村妇女精品| 国产女主播一区二区| 糖心vlog精品一区二区| 国产精品videossex久久发布| 亚洲精品中文字幕有码专区| 国产永久免费网站| 免费看av不卡| 一区二区三区欧美激情| 日本欧洲国产一区二区| 亚洲爱情岛论坛永久| 久久三级视频| 久久全球大尺度高清视频| 国产黄色三级网站| 国产在线视频欧美一区| 色哟哟精品一区| 青草网在线观看| 在线毛片网站| 天堂在线视频免费观看| 欧美亚洲丝袜| 中文字幕日韩三级片| 国产经典一区| 亚洲高清免费在线| 欧美xxxx吸乳| 香蕉av一区二区三区| 精品在线一区二区三区| 91av在线视频观看| 欧美黄色免费观看| 97精品国产| 亚洲天堂av图片| 成人在线电影网站| 欧美电影在线观看一区| 欧美在线看片a免费观看| 久久久999免费视频| 蜜臀av在线播放| 国产清纯白嫩初高生在线观看91 | 日韩电影一区二区三区四区| 久久久精品久久久久| 男人的天堂官网 | 日韩欧美成人午夜| 搡的我好爽在线观看免费视频| 国产情侣一区二区三区| 欧美调教femdomvk| 男女啪啪网站视频| 国产免费不卡| 色综合久久六月婷婷中文字幕| 欧美午夜性视频| 丁香花在线观看完整版电影| 亚洲自拍偷拍麻豆| www.夜夜爱| 麻豆影院在线观看| 最新国产の精品合集bt伙计| 少妇熟女一区二区| caopon在线免费视频| 亚洲品质自拍视频网站| 青少年xxxxx性开放hg| 午夜在线小视频| 综合激情成人伊人| eeuss中文| 蜜桃成人365av| 亚洲国产日韩一级| 99久久久无码国产精品6| 欧美magnet| 欧美午夜精品一区二区蜜桃| 国模私拍视频在线观看| 国产一区一区| 亚洲大胆美女视频| 久久久无码人妻精品一区| 国产精品欧美日韩一区| www.精品av.com| 免费无码毛片一区二区app| 亚洲黄色在线| 日韩暖暖在线视频| 欧美人一级淫片a免费播放| 天堂在线一区二区| 成人黄色激情网| av官网在线观看| www.色精品| 日韩尤物视频| 国产在线一区二区视频| 亚洲国产精品久久久久秋霞影院| 国产亚洲欧美在线视频| 欧美黄页免费| 精品国产91久久久久久久妲己| 亚洲一区二区观看| 国产精品伦理久久久久久| 欧美精品在线免费观看| 国产三级av片| 韩国精品在线观看| 精品不卡在线| 精品无码人妻一区二区三区| 黑森林av导航| 超碰中文在线| 一本到高清视频免费精品| 欧美男女交配视频| 视频一区日韩精品| 亚洲色图狂野欧美| 久久久久成人片免费观看蜜芽| 久久久精品性| 福利精品视频| 欧美videos极品另类| 亚洲一区中文日韩| 亚洲一级片免费| 精品精品国产三级a∨在线| 中文字幕亚洲一区| 国产成人亚洲精品自产在线| 久久激情一区| 国内精品久久国产| 成人ww免费完整版在线观看| 欧美日韩亚洲视频| 亚洲丝袜在线观看| 第四色成人网| 热久久免费视频精品| 性做久久久久久久久久| 99精品视频一区| 国产精品久久久影院| 日日夜夜综合| 在线电影av不卡网址| 天天综合网久久综合网| 国产激情一区二区三区四区| 亚洲成色www久久网站| 亚洲日本天堂| 精品国产伦一区二区三区观看体验 | 国产精品稀缺呦系列在线| 亚洲h视频在线观看| 亚洲天堂网中文字| 久久黄色片网站| 精品免费av| 97色在线播放视频| 性欧美一区二区三区| 中文字幕一区在线观看视频| 中文字幕第36页| 国产一区网站| 日韩美女视频中文字幕| 日韩有码电影| 欧美天天综合色影久久精品| 国产日韩视频一区| 欧美视频久久| www.久久草| av2020不卡| 亚洲韩国日本中文字幕| 日本熟伦人妇xxxx| 北条麻妃国产九九精品视频| 国产人妻人伦精品| 大香伊人久久精品一区二区| 欧美日韩爱爱视频| 丁香花免费高清完整在线播放 | 日本成人三级| 亚洲精品一区| 一区二区三区四区视频| 国产精华7777777| 国产欧美一区二区三区网站| 自拍偷拍 国产| 成人嘿咻视频免费看| 国产日韩在线播放| 成人午夜在线影视| 精品国产一区二区三区久久久蜜月 | 99国产精品视频免费观看| 亚洲中文字幕无码不卡电影| 色综合咪咪久久网| 国产伦精品一区二区三区视频孕妇| 涩涩视频在线播放| www.美女亚洲精品| 日韩一级片免费观看| 欧美丝袜自拍制服另类| 黄色一级片中国| 久久久99精品免费观看不卡| 中文字幕一区久久| 国产日韩1区| 椎名由奈jux491在线播放| 欧美大胆a级| 成人午夜小视频| 玖玖在线播放| 欧美刺激性大交免费视频| 男女视频在线观看| 日韩欧美另类在线| 中文字幕免费观看视频| 亚洲mv在线观看| 久久国产高清视频| 久久综合九色综合欧美98| 中文字幕人妻无码系列第三区| 免费在线亚洲欧美| 国产精品一二三在线观看| 欧美在线免费看视频| 国产一区免费在线| 国产日韩在线观看视频| 日韩av123| 草美女在线观看| 久久精彩免费视频| 国产高清视频在线观看| 亚洲精品在线电影| 国产乱码久久久久| 欧美中文字幕一二三区视频| 97人人澡人人爽人人模亚洲| 一级做a爱片久久| 99久久久免费精品| 中文天堂在线一区| 精品无人区无码乱码毛片国产| 成人av电影免费在线播放| av在线网站免费观看| 久久精品国产精品亚洲综合| 亚洲成熟丰满熟妇高潮xxxxx| 极品中文字幕一区| 欧美久久久久久久久久久久久久| 天天射—综合中文网| 艳色歌舞团一区二区三区| 精品美女久久| 三区精品视频| 欧美在线电影| 亚洲二区三区四区| 精品一级毛片| 日韩av不卡播放| 精品久久中文| 亚洲精品中文字幕在线| 精品一区二区三| 亚洲国产精品久久久久久女王| 中文有码一区| 欧美日韩一区在线视频| 亚洲宅男网av| 视频一区三区| 99精品在线观看| 欧美性视频在线播放| 国产精品黑丝在线播放| 中文字幕在线观看一区二区三区| 婷婷综合在线| 成年丰满熟妇午夜免费视频| 欧美+亚洲+精品+三区| 台湾无码一区二区| 激情综合久久| 久久黄色片视频| 久久午夜电影| 国产小视频精品| 激情综合色播激情啊| 91丨porny丨九色| 成人美女视频在线看| 丰满少妇一区二区三区| 久久九九影视网| 在线观看天堂av| 亚洲精品视频观看| 国产精选第一页| 色婷婷国产精品久久包臀| 日韩一级片中文字幕| 欧美喷潮久久久xxxxx| 国产成人精品一区二三区四区五区| 日韩色在线观看| 亚洲 小说区 图片区 都市| 亚洲欧美日韩在线一区| 丝袜美腿美女被狂躁在线观看| 欧美精品在线看| 欧美片第一页| 91夜夜揉人人捏人人添红杏| 盗摄系列偷拍视频精品tp| 欧美一区1区三区3区公司| 91视频久久| 国产资源在线视频| 蜜臀av性久久久久蜜臀av麻豆| 日韩欧美中文在线视频| 久久久综合网站| 日韩激情综合网| 欧美色另类天堂2015| 亚洲视频久久久| 亚洲国产精品成人va在线观看| 大地资源中文在线观看免费版| 欧美成人在线免费| 久久青青视频| 91亚洲va在线va天堂va国| 啪啪国产精品| 欧美日韩在线免费观看视频| 99视频+国产日韩欧美| 亚洲国产高清av| a亚洲天堂av| 日韩一卡二卡在线观看| 亚洲成人动漫在线观看| 一本到在线视频| 亚洲欧美日韩高清| 性欧美videoshd高清| 国产精品久久久久久久电影| 亚洲高清999| 亚洲精美视频| 老鸭窝91久久精品色噜噜导演| 亚洲一二区在线观看| 久久久久国产精品厨房| 久久一级黄色片| 91麻豆精品国产综合久久久久久| 日本护士...精品国| 久久琪琪电影院| 青草伊人久久| 在线不卡视频一区二区| 日本午夜精品视频在线观看 | 好吊妞国产欧美日韩免费观看网站| 视频在线观看成人| 久久久精品网| 人妻少妇精品视频一区二区三区| 亚洲最快最全在线视频| 91片黄在线观看喷潮| 亚洲日本欧美中文幕| 日韩精品美女| 色一情一乱一乱一91av| 亚洲综合自拍一区| 成人在线一级片| 男女视频在线| 日本sm残虐另类| 亚洲午夜国产成人av电影男同| 亚洲av无码一区二区三区人| 亚洲精品视频在线观看网站| 一区二区自拍偷拍| 懂色av一区二区夜夜嗨| 中文字幕 亚洲一区| 又紧又大又爽精品一区二区| 亚洲一卡二卡在线观看| 国产一区二区成人| 国产高清不卡| 久久riav二区三区| 久久亚洲精品中文字幕蜜潮电影| 欧美一级高清大全免费观看| www.-级毛片线天内射视视| 日韩精品中文字幕第1页| 日本黄色三级大片| www激情久久| 久久国产视频精品| 精品亚洲一区二区三区| 极品视频在线| 国产欧美韩日| 伊人成人在线| japanese在线观看| 午夜精品福利一区二区三区蜜桃| 人妻无码中文字幕| 国内精品伊人久久| 中文字幕中文字幕精品| 久久九九国产视频| 国产欧美va欧美不卡在线| 成人免费一区二区三区| 久久精品91久久久久久再现| 天堂va欧美ⅴa亚洲va一国产| 日本aa在线观看| 99国产一区二区三精品乱码| 色屁屁影院www国产高清麻豆| 日韩精品在线观看一区| 国产精品第72页| heyzo久久| 久久久人成影片一区二区三区观看 | 最近中文字幕av| 亚洲爱爱爱爱爱| 在线观看欧美日韩电影| 日韩国产精品一区二区| 久久精品久久精品| 国产在线观看你懂的| 日韩电影大片中文字幕| 性欧美18一19sex性欧美| 亚洲第一精品区| 不卡电影免费在线播放一区| 手机av免费观看| 精品国产网站地址| 第一区第二区在线| 手机看片福利日韩| 亚洲日本护士毛茸茸| 亚洲 欧美 激情 另类| 国产在线播放91| 亚洲二区在线| 在线观看亚洲大片短视频| 日韩西西人体444www| 欧美人体一区二区三区| 成人区一区二区| 国产丝袜欧美中文另类| 99在线精品视频免费观看20| 51精品国产黑色丝袜高跟鞋| 99精品一区| 美女100%无挡| 精品黑人一区二区三区久久| 日韩免费小视频| 亚洲人成无码网站久久99热国产| 国产精品乱码人人做人人爱| 色丁香婷婷综合久久| 91亚洲va在线va天堂va国| 久久狠狠婷婷|