国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何在關閉瀏覽器標簽前,可靠地發送 HTTP 請求?

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

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

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

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

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

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

由于頁面的 JavaScript 執行環境已不復存在,瀏覽器沒有義務繼續完成這個請求,因此會主動取消它。

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

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

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

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

(1) 工作原理

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

(2) 特點

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

(3) 代碼示例

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

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

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

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

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

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

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

fetch API 作為現代網絡請求的基石,也提供了一種優雅的解決方案。通過在 fetch 的 init 對象中設置 keepalive: true,我們可以告訴瀏覽器:“這個請求很重要,請在頁面卸載后繼續完成它。”

(1) 工作原理

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

(2) 特點

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

(3) 代碼示例

假設我們需要在用戶關閉頁面時,自動保存文本編輯器中的草稿。使用 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 也可能不會執行,因為頁面正在卸載
 try {
    fetch('/api/drafts/save', {
      method: 'PUT',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(draftData),
      // 這是關鍵!
      keepalive: true,
    });
    console.log('保存草稿的請求已提交。');
  } catch (e) {
    // 這個 catch 塊很可能不會捕獲到網絡錯誤
    console.error('提交保存草稿請求時發生錯誤:', e);
  }
});

如何選擇?

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

這兩個現代 API,我們可以在不犧牲用戶體驗的前提下,確保關鍵數據的成功送達。

責任編輯:趙寧寧 來源: JavaScript
相關推薦

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

2018-05-17 16:25:27

2020-09-09 07:00:00

TensorFlow神經網絡人工智能

2022-09-16 07:33:52

瀏覽器深色模式Firefox

2021-10-13 14:53:50

UbuntuVivaldi瀏覽器

2022-07-07 07:22:01

瀏覽器JavaScript工具

2016-08-03 15:21:03

UbuntuLinux易用性

2019-11-18 15:50:11

AjaxJavascript前端

2021-08-02 13:05:49

瀏覽器HTTP前端

2020-11-25 09:47:11

FedoraGoogle Chro瀏覽器

2022-11-08 11:39:34

Web瀏覽器深色模式

2021-11-29 14:38:45

FedoraLinuxBrave瀏覽器

2009-03-05 09:37:19

2018-11-19 16:10:30

瀏覽器urlhttp

2021-07-07 07:47:10

瀏覽器CSS兼容

2021-03-10 13:19:09

LinuxCPU程序
點贊
收藏

51CTO技術棧公眾號

久久最新网址| 中文字幕在线观看一区| 国产欧美一区二区三区在线看 | 日本一道高清一区二区三区| 亚洲一区二区美女| 日本一区二区在线| 超碰97国产精品人人cao| 欧美日韩一区二区三区| 美女免费免费看网站| 欧美日韩国产黄| 国产福利第一视频在线播放| 久久久三级国产网站| 高清一区二区三区四区五区| 无线免费在线视频| 成人看片黄a免费看在线| 亚洲xxx自由成熟| 美日韩中文字幕| 欧美资源在线观看| 外国成人直播| 日韩成人激情视频| 羞羞网站在线免费观看| 国产有色视频色综合| 亚洲高清影视| 亚洲精品日韩av| 97超视频免费观看| 国产精品v日韩精品v欧美精品网站| 在线一区二区观看| 伪装者免费全集在线观看| 亚洲精品高清视频在线观看| 又黄又www| 色婷婷av一区二区三区软件| 成人一区二区不卡免费| 欧美精品自拍偷拍动漫精品| 在线网址91| 在线成人中文字幕| 中文字幕一区日韩精品 | 日韩一区二区三区视频在线观看| 免费在线午夜视频| 精品sm捆绑视频| 日本在线精品| 欧美精品九九久久| 欧美aaaa视频| 久久精品国产第一区二区三区最新章节 | 美国成人xxx| 亚洲欧美激情四射在线日| 国产小视频免费在线网址| 精品精品国产毛片在线看| 久久99这里只有精品| 日韩不卡一二区| 91蜜桃传媒精品久久久一区二区| 九七影院97影院理论片免费| 午夜影视日本亚洲欧洲精品| 日本中文在线观看| 深夜福利亚洲导航| 久久亚洲精品中文字幕蜜潮电影| 久久久一本精品99久久精品| 国产99久久久国产精品潘金| 国模大尺度私拍在线视频| 欧美日韩精品三区| 亚洲网站免费| 国产中文字幕日韩| 蜜臀av一区二区三区| 色诱视频在线观看| 欧美性猛交xxxx久久久| 亚洲色图美国十次| 久久久噜噜噜久久久| 亚洲老妇激情| 97超碰在线人人| 亚洲成人免费看| 色综合桃花网| 成人性生交大片免费观看嘿嘿视频| 日本不卡视频一二三区| 国产理论在线播放| 日韩三级视频中文字幕| 国产精品毛片视频| 先锋影音亚洲资源| 亚洲第一精品在线| 久久夜夜久久| 蜜桃视频在线观看91| 亚洲欧美综合色| jizz内谢中国亚洲jizz| 91成人伦理在线电影| 久久天天做天天爱综合色| 毛片在线视频| 国产脚交av在线一区二区| 国产精品一二三区在线| 欧美日韩激情视频一区二区三区| 最新国产精品视频| 亚洲欧洲精品在线 | 欧美最猛黑人xxxx黑人猛叫黄 | 欧美一区中文字幕| 91国产视频在线| 亚洲福利精品| 狠狠狠色丁香婷婷综合久久五月| 欧美 日韩 国产 激情| 91精品国产免费久久综合| 久久爱www成人| 99色精品视频| 亚洲精品视频在线播放| 一区在线视频观看| 美日韩黄色片| 欧美黑人巨大xxx极品| 久久成人羞羞网站| 免费在线毛片网站| 3d蒂法精品啪啪一区二区免费| 国产午夜亚洲精品午夜鲁丝片| 亚洲精品动漫| 亚洲欧美日韩精品久久久| 在线一区二区视频| 日韩成人a**站| 黄a免费视频| 欧美激情久久久久| 国产盗摄女厕一区二区三区| 免费在线看黄网站| 官网99热精品| 精品国产乱码久久久久久天美| 午夜a一级毛片亚洲欧洲| 99视频免费播放| 中文字幕精品av| 国产综合色视频| 秋霞伦理一区| 在线一区高清| 日韩视频免费观看高清完整版在线观看 | 亚洲a∨一区二区三区| 欧美视频中文字幕| 欧美.www| eeuss影院在线观看| 99在线观看| 欧美视频完全免费看| 欧美人成网站| 国产免费av在线| 国产精品国产亚洲精品看不卡15| 亚洲成人av免费| 四虎国产精品免费观看| 日本a级黄色| 激情五月六月婷婷| 国产成人免费观看| 全亚洲最色的网站在线观看| 一区二区三区免费在线观看| 欧美另类亚洲| 黄色精品视频| 成人精品一区| www国产成人免费观看视频 深夜成人网| 亚洲精品三区| 久久精品官网| 国产午夜在线观看| 久久久7777| 精品蜜桃在线看| 国产一区二区在线观看免费 | 日韩av首页| 天天操天天爽天天射| 97国产在线视频| 亚洲一区二区三区在线播放| 亚洲h色精品| 国内高清免费在线视频| 成人免费看片'免费看| 欧美人在线视频| 天天色 色综合| 视频一区二区三区中文字幕| 第四色男人最爱上成人网| 韩国一区二区av| 成人h片在线播放免费网站| 一本一道久久a久久精品综合蜜臀| 亚洲日本激情| 在线男人天堂| 缴情综合网五月天| 国产精品久久亚洲7777| 亚洲精品视频播放| 国产精品看片你懂得| 亚洲视频日本| 日韩欧美少妇| 在线观看国产v片| 伊人久久大香线蕉午夜av| 欧美成人精品不卡视频在线观看| 亚洲一级片在线观看| 性久久久久久| 成人午夜网址| 2024最新电影免费在线观看| 国产高清精品在线观看| 国产精品久久久久久久午夜| 精品国产亚洲一区二区三区在线观看| 91在线观看免费视频| 天天久久综合| 成人亚洲综合| 亚洲有码转帖| 国产精品www在线观看| 国产美女精品视频免费观看| 亚洲成年人在线| 国产精品国产自产拍高清av王其| 婷婷av在线| 九义人在线观看完整免费版电视剧| 国产亚洲一区二区三区不卡| 久久久国产精品| 狠狠干成人综合网| 久久精品72免费观看| 91蜜桃在线观看| 亚洲激情六月丁香| 日本综合视频| 鲁鲁在线中文| 久久免费福利|