Navigator.sendBeacon()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since â¨2018å¹´4æâ©.
navigator.sendBeacon() æ¹æ³å¯ç¨äºéè¿ HTTP POST å°å°éæ°æ® 弿¥ ä¼ è¾å° Web æå¡å¨ã
å®ä¸»è¦ç¨äºå°ç»è®¡æ°æ®åéå° Web æå¡å¨ï¼åæ¶é¿å
äºç¨ä¼ ç»ææ¯ï¼å¦ï¼XMLHttpRequestï¼åéåææ°æ®çä¸äºé®é¢ã
è¯æ³
navigator.sendBeacon(url);
navigator.sendBeacon(url, data);
åæ°
url-
urlåæ°è¡¨ædataå°è¦è¢«åéå°çç½ç»å°åã dataå¯é-
dataåæ°æ¯å°è¦åéçArrayBufferãArrayBufferViewãBlobãDOMStringãFormDataæURLSearchParamsç±»åçæ°æ®ã
è¿åå¼
å½ç¨æ·ä»£çæåææ°æ®å å
¥ä¼ è¾éåæ¶ï¼sendBeacon() æ¹æ³å°ä¼è¿å trueï¼å¦åè¿å falseã
æè¿°
è¿ä¸ªæ¹æ³ä¸»è¦ç¨äºæ»¡è¶³ç»è®¡åè¯æä»£ç çéè¦ï¼è¿äºä»£ç é常å°è¯å¨å¸è½½ï¼unloadï¼ææ¡£ä¹åå Web æå¡å¨åéæ°æ®ãè¿æ©çåéæ°æ®å¯è½å¯¼è´éè¿æ¶éæ°æ®çæºä¼ãç¶èï¼å¯¹äºå¼åè
æ¥è¯´ä¿è¯å¨ææ¡£å¸è½½æé´åéæ°æ®ä¸ç´æ¯ä¸ä¸ªå°é¾ãå ä¸ºç¨æ·ä»£çé常ä¼å¿½ç¥å¨ unload äºä»¶å¤çå¨ä¸äº§çç弿¥ XMLHttpRequestã
è¿å»ï¼ä¸ºäºè§£å³è¿ä¸ªé®é¢ï¼ç»è®¡åè¯æä»£ç é常è¦å¨
- åèµ·ä¸ä¸ªåæ¥
XMLHttpRequestæ¥åéæ°æ®ã - å建ä¸ä¸ª
<img>å ç´ å¹¶è®¾ç½®srcï¼å¤§é¨åç¨æ·ä»£çä¼å»¶è¿å¸è½½ï¼unloadï¼ææ¡£ä»¥å è½½å¾åã - å建ä¸ä¸ªå ç§ç no-op 循ç¯ã
ä¸è¿°çæææ¹æ³é½ä¼è¿«ä½¿ç¨æ·ä»£çå»¶è¿å¸è½½ææ¡£ï¼å¹¶ä½¿å¾ä¸ä¸ä¸ªå¯¼èªåºç°çæ´æãä¸ä¸ä¸ªé¡µé¢å¯¹äºè¿ç§è¾å·®çè½½å ¥è¡¨ç°æ è½ä¸ºåã
è¿å°±æ¯ sendBeacon() æ¹æ³åå¨çæä¹ãä½¿ç¨ sendBeacon() æ¹æ³ä¼ä½¿ç¨æ·ä»£ç卿æºä¼æ¶å¼æ¥å°åæå¡å¨åéæ°æ®ï¼åæ¶ä¸ä¼å»¶è¿é¡µé¢çå¸è½½æå½±åä¸ä¸å¯¼èªçè½½å
¥æ§è½ï¼è¿æå³çï¼
- æ°æ®å鿝å¯é çã
- æ°æ®å¼æ¥ä¼ è¾ã
- ä¸å½±åä¸ä¸å¯¼èªçè½½å ¥ã
æ°æ®æ¯éè¿ HTTP POST 请æ±åéçã
å¨ä¼è¯ç»ææ¶åéç»è®¡æ°æ®
ç½ç«é叏叿å¨ç¨æ·å®æé¡µé¢æµè§ååæå¡å¨åéåææè¯ææ°æ®ï¼æå¯é çæ¹æ³æ¯å¨ visibilitychange äºä»¶åçæ¶åéæ°æ®ï¼
document.addEventListener("visibilitychange", function logData() {
if (document.visibilityState === "hidden") {
navigator.sendBeacon("/log", analyticsData);
}
});
é¿å ä½¿ç¨ unload å beforeunload
è¿å»ï¼è®¸å¤ç½ç«ä½¿ç¨ unload æ beforeunload äºä»¶ä»¥å¨ä¼è¯ç»ææ¶åéç»è®¡æ°æ®ãç¶èè¿æ¯ä¸å¯é çï¼å¨è®¸å¤æ
åµä¸ï¼å°¤å
¶æ¯ç§»å¨è®¾å¤ï¼æµè§å¨ä¸ä¼äº§ç unloadãbeforeunload æ pagehide äºä»¶ãä¸é¢ååºäºä¸ç§ä¸è§¦åä¸è¿°äºä»¶çæ
åµï¼
- ç¨æ·å è½½äºç½é¡µå¹¶ä¸å ¶äº¤äºã
- 宿æµè§åï¼ç¨æ·åæ¢å°äºå ¶ä»åºç¨ç¨åºï¼è䏿¯å ³éé项å¡ã
- éåï¼ç¨æ·éè¿ææºçåºç¨ç®¡çå¨å ³éäºæµè§å¨åºç¨ã
æ¤å¤ï¼unload äºä»¶ä¸ç°ä»£æµè§å¨å®ç°çå¾è¿ç¼åï¼bfcacheï¼ä¸å
¼å®¹ãå¨é¨åæµè§å¨ï¼å¦ï¼Firefoxï¼éè¿å¨ bfcache 䏿é¤å
å« unload äºä»¶å¤çå¨ç页颿¥è§£å³ä¸å
¼å®¹é®é¢ï¼ä½è¿å卿§è½æå¤±ãå
¶ä»æµè§å¨ï¼ä¾å¦ Safari å Android ä¸ç Chrome æµè§å¨åéåç¨æ·å¨å䏿 ç¾é¡µä¸å¯¼èªè³å
¶ä»é¡µé¢æ¶ä¸è§¦å unload äºä»¶çæ¹æ³æ¥è§£å³ä¸å
¼å®¹é®é¢ã
Firefox ä¹ä¼å¨ bfcache 䏿é¤å
å« beforeunload äºä»¶å¤çå¨ç页é¢ã
ä½¿ç¨ pagehide ä½ä¸ºåé
å¯ä½¿ç¨ pagehide äºä»¶æ¥ä»£æ¿é¨åæµè§å¨æªå®ç°ç visibilitychange äºä»¶ãå beforeunload ä¸ unload äºä»¶ç±»ä¼¼ï¼è¿ä¸äºä»¶ä¸ä¼è¢«å¯é å°è§¦åï¼ç¹å«æ¯å¨ç§»å¨è®¾å¤ä¸ï¼ï¼ä½å®ä¸ bfcache å
¼å®¹ã
示ä¾
示ä¾ä»£ç ä½¿ç¨ visibilitychange äºä»¶æ¥è°ç¨ sendBeacon() 以åéç»è®¡æ°æ®ã
document.addEventListener("visibilitychange", function logData() {
if (document.visibilityState === "hidden") {
navigator.sendBeacon("/log", analyticsData);
}
});
è§è
| Specification |
|---|
| Beacon > # sendbeacon-method > |
æµè§å¨å ¼å®¹æ§
åè§
visibilitychangeäºä»¶ã- Beacon API æ¦è¿°ã
- Don't
lose user and app state, use Page Visibility è§£éäºä¸ºä»ä¹ä½ åºè¯¥ä½¿ç¨
visibilitychangeè䏿¯beforeunload/unloadã - ç½é¡µçå½å¨æ API æä¾äºæå ³å¨ Web åºç¨ç¨åºä¸å¤çç½é¡µçå½å¨æè¡ä¸ºçæä½³å®è·µã
- PageLifecycle.jsï¼å¤çè·¨æµè§å¨ç½é¡µçå½å¨æè¡ä¸ºä¸ä¸è´ç JavaScript åºã
- Back/forward cache è§£éäºä»ä¹æ¯å¾è¿ç¼åï¼ä»¥åå®å¯¹åç§ç½é¡µçå½å¨æäºä»¶çå½±åã