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

如何在用戶離開頁面時可靠地發送 HTTP 請求

網絡 通信技術
您可能希望該請求的分派是同步的,之后我們將繼續導航離開頁面,而其他服務器成功地處理該請求。但事實證明,情況并非總是如此。

有幾次,當用戶執行導航到不同頁面或提交表單等操作時,我需要發送帶有一些數據的 HTTP 請求以進行記錄??紤]這個在點擊鏈接時向外部服務發送一些信息的人為示例:

<a href="/some-other-page" id="link">Go to Page</a>

<script>
document.getElementById('link').addEventListener('click', (e) => {
fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
some: "data"
})
});
});
</script>

這里沒有什么非常復雜的事情發生。該鏈接可以正常運行(我沒有使 e.preventDefault()),但在該行為發生之前,會在單擊時觸發 POST 請求。無需等待任何形式的響應。我只是希望它被發送到我正在訪問的任何服務。

乍一看,您可能希望該請求的分派是同步的,之后我們將繼續導航離開頁面,而其他服務器成功地處理該請求。但事實證明,情況并非總是如此。

瀏覽器不保證保留打開的HTTP請求

當瀏覽器中發生終止頁面的情況時,并不能保證進程內的HTTP請求會成功(參見更多關于“終止”和頁面生命周期的其他狀態)。這些請求的可靠性可能取決于幾個方面——網絡連接、應用程序性能,甚至外部服務本身的配置。因此,在這些時刻發送數據可能是不可靠的,如果您依賴這些日志來做出數據敏感的業務決策,那么這可能會帶來一個潛在的重大問題。為了幫助說明這種不可靠性,我使用上面包含的代碼設置了一個帶有頁面的小型 Express 應用程序。單擊鏈接時,瀏覽器會導航到 /other,但在此之前,會觸發 POST 請求。當一切都發生時,我打開了瀏覽器的網絡選項卡,并且我使用的是“慢 3G”連接速度。一旦頁面加載并且我已經清除了日志,事情看起來很安靜:

圖片

1.webp

但是一旦鏈接被點擊,事情就會出錯,當導航發生時,請求被取消。

圖片

2.webp

這使得我們對外部服務是否能夠處理請求缺乏信心。為了驗證這種行為,當我們使用window.location以編程方式導航時也會發生這種情況:

document.getElementById('link').addEventListener('click', (e) => {
+ e.preventDefault();

// Request is queued, but cancelled as soon as navigation occurs.
fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
some: 'data'
}),
});

+ window.location = e.target.href;
});

無論導航以何種方式或何時發生,以及活動頁面何時終止,那些未完成的請求都有被放棄的風險。

但是為什么被取消了呢?

問題的根源在于,默認情況下,XHR 請求(通過 fetch 或 XMLHttpRequest)是異步且非阻塞的。一旦請求被排隊,請求的實際工作就會被移交給幕后的瀏覽器級 API。由于它與性能有關,這很好——你不希望請求占用主線程。但這也意味著當頁面進入“終止”狀態時,它們有被遺棄的風險,無法保證任何幕后工作都能完成。以下是 Google 對特定生命周期狀態的總結:

一旦頁面開始被瀏覽器卸載并從內存中清除,頁面就處于終止狀態。在這種狀態下沒有新的任務可以啟動,并且正在進行的任務如果運行時間過長可能會被殺死。

簡而言之,瀏覽器的設計假設當一個頁面被關閉時,沒有必要繼續處理它排隊的任何后臺進程。

那么,我們有哪些選擇呢?

避免這個問題最明顯的方法可能是,盡可能地延遲用戶操作,直到請求返回響應。在過去,通過使用XMLHttpRequest中支持的同步標志來實現這一點是錯誤的。使用它會完全阻塞主線程,導致大量的性能問題——我在過去寫過一些這方面的文章——所以這個想法甚至不應該被接受。事實上,它正在退出平臺(Chrome v80+已經刪除了它)。相反,如果您打算采用這種類型的方法,那么最好在響應返回時等待Promise解析。在它回來之后,您可以安全地執行該行為。使用我們之前的代碼片段,它可能看起來像這樣:

document.getElementById('link').addEventListener('click', async (e) => {
e.preventDefault();

// Wait for response to come back...
await fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
some: 'data'
}),
});

// ...and THEN navigate away.
window.location = e.target.href;
});

這可以完成工作,但也有一些不小的缺點。首先,它會延遲所需行為的發生,從而損害用戶體驗。收集分析數據肯定會給業務(以及未來的用戶)帶來好處,但讓當前用戶為實現這些好處而支付成本并不理想。更不用說,作為一個外部依賴項,服務本身的任何延遲或其他性能問題都會暴露給用戶。如果分析服務的暫停導致客戶無法完成一項高價值的行動,那么所有人都是輸家。其次,這種方法并不像它最初聽起來那么可靠,因為一些終止行為無法通過編程延遲。例如, e.preventDefault() 無法延遲某人關閉瀏覽器選項卡。因此,它充其量只能涵蓋為某些用戶操作收集數據,但不足以全面信任它。

指示瀏覽器保留未完成的請求

值得慶幸的是,有一些選項可以保留絕大多數瀏覽器中內置的未完成的 HTTP 請求,并且不需要損害用戶體驗。

使用Fetch的keepalive標志

如果在使用fetch()時將keepalive標志設置為true,那么相應的請求將保持打開狀態,即使發起該請求的頁面被終止。使用我們最初的例子,它的實現如下所示:

<a href="/some-other-page" id="link">Go to Page</a>

<script>
document.getElementById('link').addEventListener('click', (e) => {
fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
some: "data"
}),
keepalive: true
});
});
</script>

當點擊該鏈接并進行頁面導航時,不會發生請求取消:

圖片

3.webp

相反,我們得到的是一個(未知)狀態,原因很簡單,活動頁面從來沒有等待接收任何響應。像這樣的一行程序很容易修復,特別是當它是常用瀏覽器API的一部分時。但是,如果您正在尋找一種功能更集中、界面更簡單的選擇,那么還有另一種方法,它實際上具有相同的瀏覽器支持。

使用 Navigator.sendBeacon()

Navigator.sendBeacon() 函數專門用于發送單向請求(beacon)。一個基本的實現看起來像這樣,發送一個帶有字符串化 JSON 和“text/plain” Content-Type 的 POST:

navigator.sendBeacon('/log', JSON.stringify({
some: "data"
}));

但是此 API 不允許您發送自定義標頭。因此,為了讓我們以“application/json”的形式發送數據,我們需要做一些小調整并使用 Blob:

<a href="/some-other-page" id="link">Go to Page</a>

<script>
document.getElementById('link').addEventListener('click', (e) => {
const blob = new Blob([JSON.stringify({ some: "data" })], { type: 'application/json; charset=UTF-8' });
navigator.sendBeacon('/log', blob));
});
</script>

最后,我們得到了相同的結果——即使在頁面導航之后也允許完成的請求。但是還有一些事情可能使它比 fetch() 更有優勢:beacon以低優先級發送。為了演示,當同時使用帶有 keepalive 的 fetch() 和 sendBeacon() 時,Network 選項卡中顯示的內容如下:

圖片

4.webp

默認情況下,fetch() 獲得“高”優先級,而beacon(上面稱為“ping”類型)具有“最低”優先級。對于對頁面功能不重要的請求,這是一件好事。直接取自 Beacon 規范:

該規范定義了一個接口,[…]最大限度地減少與其他時間關鍵操作的資源爭用,同時確保此類請求仍然被處理并交付到目的地。

換句話說,sendBeacon() 確保它的請求不會妨礙那些對您的應用程序和用戶體驗真正重要的請求。

因為ping屬性而被光榮提及

值得一提的是,越來越多的瀏覽器支持 ping 屬性。當附加到鏈接時,它會觸發一個小的 POST 請求:

<a href="http://localhost:3000/other" ping="http://localhost:3000/log">
Go to Other Page
</a>

這些請求標頭將包含單擊鏈接的頁面(ping-from),以及該鏈接的 href 值(ping-to):

headers: {
'ping-from': 'http://localhost:3000/',
'ping-to': 'http://localhost:3000/other'
'content-type': 'text/ping'
// ...other headers
},

它在技術上類似于發送beacon,但有一些明顯的限制:

它嚴格限制在鏈接上的使用,如果您需要跟蹤與其他交互相關的數據,例如按鈕點擊或表單提交,這將使其無法啟動。

瀏覽器支持很好,但不是很好。在撰寫本文時,Firefox 特別沒有默認啟用它。

您無法隨請求一起發送任何自定義數據。正如前面提到的,您最多只能得到幾個 ping-*頭文件,以及隨程序一起出現的任何其他頭文件。

綜合考慮,如果您可以發送簡單的請求并且不想編寫任何自定義 JavaScript,那么 ping 是一個很好的工具。但是,如果您需要發送更多實質內容,則可能不是最好的選擇。

那么,我應該選擇哪一個呢?

使用 fetch 和 keepalive 或 sendBeacon() 發送您的最后一秒請求肯定存在權衡。為了幫助辨別哪種方法最適合不同的情況,需要考慮以下幾點:

如果出現以下情況,您可能會使用 fetch() + keepalive:

  • 您需要輕松地隨請求傳遞自定義標頭。
  • 您想向服務發出 GET 請求,而不是 POST。
  • 您正在支持較舊的瀏覽器(如 IE)并且已經加載了 fetch polyfill。

但在以下情況下 sendBeacon() 可能是更好的選擇:

  • 您正在進行簡單的服務請求,不需要進行太多定制。
  • 您更喜歡更簡潔、更優雅的 API。
  • 您希望確保您的請求不會與應用程序中發送的其他高優先級請求競爭。

原文:https://css-tricks.com/send-an-http-request-on-page-exit/作者:Alex MacArthur

責任編輯:武曉燕 來源: 前端全棧開發者
相關推薦

2022-03-24 14:49:57

HTTP前端

2025-07-21 06:10:00

瀏覽器HTTPJavaScript

2009-11-09 09:11:17

2023-10-11 17:58:22

2019-11-18 15:50:11

AjaxJavascript前端

2018-05-17 16:25:27

2021-03-10 13:19:09

LinuxCPU程序

2020-06-17 14:40:49

用戶頁面前端

2025-09-25 13:51:13

2025-06-30 07:20:00

Web開發API

2025-02-04 09:58:08

2025-07-15 09:08:36

2025-02-06 08:09:20

POSTGET數據

2018-01-30 17:00:10

Linuxscp命令排除文件

2025-11-18 02:00:11

2021-06-02 15:30:44

智能安防物聯網智能建筑

2020-03-27 15:10:23

SpringJava框架

2017-04-28 09:04:32

移動應用開發反饋

2021-08-26 06:58:14

Http請求url

2023-07-18 12:50:48

C 語言用戶輸入
點贊
收藏

51CTO技術棧公眾號

北条麻妃av高潮尖叫在线观看| 91情侣偷在线精品国产| 午夜一区二区三区免费| 人人鲁人人莫人人爱精品| 国产午夜精品在线观看| 国产精品入口尤物| 看片网站在线观看| 日韩影视高清在线观看| 欧美日韩国产免费一区二区 | 久久久精品国产一区二区| 国产xxxxhd| 天天综合av| 国产精品每日更新在线播放网址| 亚洲aⅴ男人的天堂在线观看 | 在线看一区二区| av磁力番号网| 日韩av地址| 精品一区二区在线看| 国内精品400部情侣激情| www亚洲色图| 91亚洲无吗| 欧美午夜视频网站| 麻豆tv在线播放| 欧美成年黄网站色视频| 成人激情小说乱人伦| 国产精品第一第二| 日韩免费不卡视频| 在线国产一区二区| 亚洲欧美制服第一页| 韩国一区二区三区四区| 精品三区视频| 第一福利永久视频精品| 91成人在线视频观看| 国产有码在线| 99久久99久久免费精品蜜臀| 亚洲a级在线观看| 91青青草视频| 国产精品一二| 欧美极品第一页| www.毛片com| 菠萝蜜一区二区| 亚洲欧美日韩一区二区在线 | 9i在线看片成人免费| 成人精品一区二区三区电影黑人| 欧美一级淫片免费视频黄| 亚洲性图久久| 欧美大尺度激情区在线播放| 久久久99999| 欧美日韩伦理| 精品一区二区三区四区| 欧美日韩在线精品一区二区三区激情 | 亚洲区 欧美区| 日韩成人一区| 欧美午夜精品久久久| 成人免费在线小视频| www.youjizz.com在线| 亚洲黄色在线视频| 国产美女视频免费| 免费在线观看av片| 国产精品护士白丝一区av| 色狠狠久久av五月综合| 国产香蕉在线| 欧美经典三级视频一区二区三区| 女同一区二区| 你懂的视频在线| 久久久久久麻豆| 鲁丝一区二区三区免费| 欧美成人片在线| 久久精品一区八戒影视| 日韩女优中文字幕| 午夜免费福利在线观看| 中文字幕亚洲精品在线观看| 亚洲日本精品| 99视频免费在线观看| 亚洲最新视频在线观看| 美女黄色免费看| 岛国av在线播放| 欧美性猛交xxxx偷拍洗澡| 91av在线免费播放| 六九午夜精品视频| 日韩美一区二区三区| 稀缺呦国内精品呦| 亚洲欧洲美洲国产香蕉| 国产午夜一区二区| 国产视频精品免费| 国内成人在线| 91av视频在线播放| 亚洲免费视频二区| 精品一区二区三区在线播放| 5566中文字幕一区二区| 黄色一级大片在线免费看国产一| 99久久国产综合精品麻豆| 日本精品国语自产拍在线观看| 免费在线看a| 亚洲国产精品尤物yw在线观看| 黑人糟蹋人妻hd中文字幕| 福利一区在线| 精品日韩成人av| 51妺嘿嘿午夜福利| 欧美1区视频| 日韩av电影国产| 国产精品久久婷婷| 91丨九色丨蝌蚪丨老版| 波多野结衣三级在线| 2021天堂中文幕一二区在线观| 色欧美片视频在线观看在线视频| 久久久久久久久久一区| 精品午夜电影| 精品国偷自产在线视频99| 日韩成人av毛片| 久久激五月天综合精品| 精品国产免费一区二区三区| 欧美性videos| 欧美日韩裸体免费视频| 激情在线观看视频| 亚洲人成亚洲精品| 欧美激情图片区| 亚洲精品国产精品国自产网站按摩| 高清国产一区二区三区| 五月天亚洲综合小说网| 免费h在线看| 欧美一级高清片在线观看| 免费看污片的网站| aa亚洲婷婷| 亚洲最大福利视频网| 成人福利在线| 精品久久久久久久久久久久| 国产高清av片| 久久国产小视频| 日韩av成人在线观看| 人妻偷人精品一区二区三区| 亚洲视频一区二区免费在线观看 | 男人的j进女人的j一区| 久久国产精品久久| 欧美xxxx做受欧美88bbw| 欧美日韩aaaaaa| 最近中文字幕在线mv视频在线| 好吊一区二区三区| 96精品久久久久中文字幕| 成人精品一区二区| 色呦呦一区二区三区| 97香蕉碰碰人妻国产欧美| 欧美另类女人| 91国产在线免费观看| 蜜桃视频网站在线观看| 欧美日韩一本到| www色com| 日韩精品一级中文字幕精品视频免费观看 | 国产大尺度在线观看| 免费成人高清在线视频| 一区二区欧美亚洲| 在线免费一区二区| 中文字幕巨乱亚洲| 妺妺窝人体色www在线观看| 免费成人网www| 欧美又大又粗又长| 青青色在线视频| 日韩欧美一区二区三区| 黑人巨大精品欧美| 蜜桃av一区| 日本在线视频一区| 欧美日韩尤物久久| 国产午夜精品一区理论片飘花| www.久久网| 国产精品欧美综合在线| 国产精品v日韩精品v在线观看| 欧美肉体xxxx裸体137大胆| 国产精品丝袜久久久久久不卡| 成年人在线观看网站| 欧美日韩精品福利| √天堂中文官网8在线| 国产成人精品免费一区二区| avav在线播放| 久久超级碰碰| 国产精品白嫩美女在线观看| av天在线观看| 欧美一二三区在线| 国产精品自拍视频一区| 91蜜桃网址入口| 亚洲综合欧美在线| 美洲精品一卡2卡三卡4卡四卡| 性高湖久久久久久久久| 欧美日韩最好看的视频| 四虎国产精品免费久久5151| 久久69精品久久久久久国产越南| 涩涩视频免费看| 欧美亚洲综合色| 欧美日韩在线观看成人| 久久网站最新地址| 911av视频| 亚洲欧美日韩国产综合精品二区| 亚洲v国产v在线观看| 在线观看视频一区二区三区| 国产不卡一区二区在线播放| 国产激情视频在线| 亚洲女人天堂视频| 国产精品爽爽久久久久久| 婷婷亚洲久悠悠色悠在线播放| 中文字幕丰满孑伦无码专区| 国产中文字幕精品| 欧美性久久久久| 亚洲一区二区日韩| 久久久综合亚洲91久久98| 9999精品免费视频| 日韩美女写真福利在线观看| 天堂va在线| 亚洲天堂日韩电影| 天天综合在线视频| 欧美一区二区女人| 国产精品高清无码| 亚洲成人一二三| 国产乱子轮xxx农村| 波多野结衣在线aⅴ中文字幕不卡| 虎白女粉嫩尤物福利视频| 国产精品草草| 亚洲国产精品123| 97久久亚洲| 成人国产精品久久久| 成人一级福利| 久久成人亚洲精品| 免费在线视频一级不卡| 亚洲а∨天堂久久精品9966 | 欧美女优在线观看| 欧美高清性hdvideosex| 欧美三级午夜理伦| 久久久久久久综合日本| www.17c.com喷水少妇| 麻豆精品在线视频| 丁香六月激情婷婷| 色小子综合网| 久久riav二区三区| 日本高清精品| 国产精品午夜一区二区欲梦| 成人免费看视频网站| 久久91亚洲人成电影网站| 国模精品一区二区| 亚洲第一页在线| 丰满人妻一区二区| 欧美久久久久久久久中文字幕| 久久久午夜影院| 亚洲精品国产a| 久久人妻无码aⅴ毛片a片app| 久久久五月婷婷| 男女性杂交内射妇女bbwxz| 日本在线不卡一区| www.国产区| 中文亚洲免费| 精品少妇在线视频| 狠色狠色综合久久| 大地资源网在线观看免费官网| 欧美韩日一区| 亚洲v日韩v欧美v综合| 亚洲欧美日本伦理| 久久国产精品一区二区三区四区| 国产三级精品三级在线观看国产| 亚洲aa在线观看| av成人在线网站| 日韩美女视频免费看| 2019年精品视频自拍| 欧美一级大片在线观看| 国产高潮在线| 全球成人中文在线| 亚洲十八**毛片| 91黄色8090| 二吊插入一穴一区二区| 国产www精品| 国产精品av一区二区三区| 97视频在线观看播放| 精品91久久| 国产精品91一区| 素人一区二区三区| 亚洲iv一区二区三区| 精品一区二区三区中文字幕视频| 91精品视频在线播放| 精品三级国产| 999国产在线| 6080亚洲理论片在线观看| 成人免费xxxxx在线观看| 日韩欧美一级| 国产伦精品一区二区三区照片| av日韩精品| 日本在线播放一区| 色999日韩| 亚洲成人动漫在线| 国产偷自视频区视频一区二区| 九色在线视频观看| 日韩高清在线一区| 日韩一级在线免费观看| 国内一区二区视频| 99久久久无码国产精品性波多| 成人免费毛片a| 摸摸摸bbb毛毛毛片| 国产精品高潮久久久久无| 国产探花在线播放| 91久久奴性调教| 一级片在线免费观看视频| 日韩免费电影网站| 天天摸夜夜添狠狠添婷婷| 亚洲性日韩精品一区二区| 毛片在线不卡| 欧美成年人视频网站| 台湾佬成人网| 成人免费大片黄在线播放| 国产一区二区三区亚洲| 亚洲综合五月天| 国产一区激情| 欧美 激情 在线| 国产高清视频一区| xxx在线播放| 亚洲视频一二三| 中文字幕乱码人妻二区三区| 日韩午夜在线观看| 免费一级在线观看播放网址| 欧美国产日韩中文字幕在线| 不卡福利视频| 3d蒂法精品啪啪一区二区免费| 久久综合社区| 精品一区二区成人免费视频 | 中文字幕亚洲激情| 日本高清在线观看| 成人免费看片视频| 欧美人与牛zoz0性行为| 五月天av影院| 日本不卡123| 波多野结衣影院| 亚洲综合成人网| 亚洲专区在线播放| 国产丝袜一区二区| 182在线视频观看| 国产狼人综合免费视频| 欧美绝顶高潮抽搐喷水合集| 一区二区三区av| 久久国产直播| 亚洲精品久久一区二区三区777| 亚洲国产精品成人综合| www.国产高清| 日韩免费性生活视频播放| 成年人在线免费观看| 奇门遁甲1982国语版免费观看高清 | 久久亚州av| 超碰成人免费在线| 国产一区二区伦理| 91麻豆制片厂| 欧美日韩在线三级| 国产日韩精品在线看| 2024亚洲男人天堂| 日韩欧美在线精品| 色欲色香天天天综合网www| 国产毛片一区二区| 99成人在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 91蜜桃臀久久一区二区| 中文字幕日韩精品一区二区| 日韩中文欧美在线| 色天使在线视频| 五月激情综合色| 空姐吹箫视频大全| 海角国产乱辈乱精品视频| 国产成人久久精品一区二区三区| 日韩精品欧美专区| 久久99久久久欧美国产| av片在线免费看| 欧美日韩精品三区| 午夜av在线免费观看| 91九色国产在线| 91国语精品自产拍| yjizz视频| 午夜日韩在线电影| 亚洲精品国产精| 97成人超碰免| 台湾佬综合网| 无码人妻精品一区二区三区66| 国产午夜精品久久| 嫩草影院一区二区三区| 久久精品国产成人精品| 国产精品国产亚洲精品| 欧洲xxxxx| 96av麻豆蜜桃一区二区| 国产农村妇女aaaaa视频| 日韩电影在线观看永久视频免费网站| 成人一区福利| 一区二区av| 国产乱子伦一区二区三区国色天香| 日韩女优一区二区| 亚洲成人国产精品| 欧美色网在线| 超碰免费在线公开| 国产91精品在线观看| 欧美黄色一级大片| 日韩视频免费在线观看| 日韩专区视频| 奇米精品一区二区三区| 国产亚洲综合在线| 亚洲黄色在线免费观看| 91国内精品久久| 久久蜜桃av| 国产精品第七页| 欧美日韩精品福利| 中文av在线全新| 亚洲一区二区三区精品动漫|