首页/文章/http-网络

网络-navigator.sendBeacon前言

2024-08-19
8653 分钟
...

navigator.sendBeacon 是浏览器的 API,用于在浏览器后台发送异步请求,它不会等服务端响应。

它可以用于在页面卸载或关闭的时候,发送数据,以及在不阻塞页面卸载的情况下发送数据。

使用 navigator.sendBeacon 方法发送的请求是异步的,不会阻塞页面的卸载或关闭过程。

这对于需要在用户离开页面之前发送数据的情况非常有用。

优点

  • 不受页面卸载过程的影响,确保数据可靠发送。
  • 普通的http请求如XMLHttpRequestFetch在页面关闭或者刷新、前进、后退等操作时 , 这些请求有可能在页面销毁之前没有完成,导致数据丢失。
  • navigator.sendBeacon的优先级是较低的,XMLHttpRequestfetch这些同步请求,以及其他高优先级任务在它之前,navigator.sendBeacon并不会立即执行,可以说它会在空闲时间发送请求。
  • 能够发送跨域请求
  • navigator.sendBeacon是不受跨域限制的

- 缺点

  • 只能发送POST请求
  • 只能传输少量数据(64 KB以内)
  • 无法自定义请求头
  • 只能传输ArrayBufferArrayBufferViewBlobDOMStringformDataURLSearchParams类型数据
  • 如果处于危险网络环境、开启了广告屏蔽插件 该请求将无效。

发送心跳包

利用navigator.sendBeacon发送心跳包,与服务器保持长连接,避免长时间未请求而断开连接。

function sendHeartbeat() {
  const data = 'heartbeat'; 
  const url = 'http://localhost:3001/api/heartbeat'; 

  navigator.sendBeacon(url, data);
}


setInterval(sendHeartbeat, 5000); 

埋点

可以使用navigator.sendBeacon在页面卸载时记录停留时间,以及pv、uv、错误日志的上报、按钮点击次数等 用户反馈 对于一些小的表单,如:用户反馈、意见和建议等可以使用navigator.sendBeacon进行请求。

基本使用

navigator.sendBeacon(url, data);
  1. url: 是要发送请求的目标地址,可以是相对路径或绝对 URL。
  2. data: 是要发送的数据,可以是字符串、ArrayBuffer 或 Blob。

navigator.sendBeacon 方法发送的请求是 POST 请求,并且请求头中会自动添加 Content-Type: application/x-www-form-urlencoded。

需要发送JSON格式的数据的时候,可以使用Blob进行包装从而发送JSON数据

let data = {name:"smz"}
let blob = new Blob([JSON.stringify(data)],{type:'application/json; charset=UTF-8'})

当打开页面时记录时间,在页面销毁的时候记录时间,这样就得到了用户停留时间,再通过navigator.sendBeacon进行上报用户名、时间、页面等信息完成数据的统计。

前端:

const reportData = () =>{
    
    let startTime = performance.now(); 
    let logVisit = async function() {
        if (!navigator.sendBeacon) return false;

        const endTime = performance.now(); 

        let data = new FormData();
        const reportDataList = {
            name: 'smz',
            page: 'home',
            stayTime: ((endTime - startTime)/60000).toFixed(2) + '分钟' 
        };
        let time = new Blob([JSON.stringify(reportDataList)],{type:'application/json; charset=UTF-8'})
        navigator.sendBeacon("http://localhost:3001/api/b", time);
    };
    window.addEventListener("beforeunload", logVisit);
}
reportData()

后端:这里使用node

const express = require('express')
const app = express()

app.use((req, res, next) => {
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:63342');
    res.setHeader('Access-Control-Allow-Credentials', true);
    res.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE");
    next();
});


app.use(express.text())

app.post('/api/heartbeat',(req,res)=>{
    console.log(req.body)
    res.send('ok')
})


app.use(express.json())


app.post('/api/b',(req,res)=>{
    console.log(req.body)
    res.send('ok')
})

app.listen(3001,()=>{
    console.log('server is running')
})

总结:

总结

总之,navigator.sendBeacon 是一个非常有用的 API,在页面卸载或关闭时发送异步请求,非常适合发送统计数据、日志记录、表单提交等场景。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
http-网络2025-08-06
按下回车后网页是怎么出来的
当你在浏览器中输入一个网址,比如 ,然后按下回车键,几秒钟后页面就完整地呈现在你眼前。这个看似简单的操作,背后其实是一整套精密协作的网络机制在起作用。本文将带你从基础讲起,理解 Web 开发中最重要的网络知识,帮助你搞清楚: 数据是如何从服务器传到你的电脑,并最终变成网页的? 一、互联网通信的分层模型:OSI 七层模型 为了管理复杂的网络通信,工程师们提出了一个通用的参考模型—— OSI 七层模型 。它把整个通信过程划分为七个层次,每一...
学习面试
http-网络2025-03-04
网络代理详解
一、 的基础概念 1\. 什么是代理? 代理是一种通过中间服务器来帮助 访问目标服务器的技术。代理服务器位于客户端与服务器之间,充当两者的中介,从而实现客户端和服务器之间的隔离。用户的所有请求经过代理后,再发往目标服务器,而目标服务器的响应则返回代理,再由代理传递给用户。 2\. 网络代理的工作流程 在基本的网络代理工作流程中, 扮演了“请求转发者”和“响应返回者”的角色: 1. 客户端请求 :客户端将请求发送到代理服务器,而不是直接发...
学习面试
http-网络2024-11-29
没有koa的cors你怎么处理跨域?
关联问题: JSONP有何局限性 CORS如何处理复杂请求 代理在生产环境效果如何 前言 “金九银十”的秋招,就像是落进池塘的羽毛,连点水花都没砸起来。已读不回是常态,能给面试已是情分,能拿offer的更是少之又少。可怜我在寒潮来临的深秋之际,也只得哀叹一句“越来越冷了啊...” 不过人总是要吃饭的,所以再怎么冷,卖炭翁也得卖炭,牛马攻城狮也得“攻城”,既是为了填饱肚子,也是为了“春天”做准备。所以今天为各位前端工程狮细聊一下前端面试中...
学习面试
http-网络2024-09-11
面试常客系列之跨域前言
跨域?什么是跨域呢?我们先来看看一个url的组成, ,这一个url我们可以分成四部分来看 是协议, 是域名, 是端口, 是路径.在浏览器中,我们从一个域名发送请求到另一个域名,如果两个域名的协议,域名,端口三部分只要存在一部分不同就会发生跨域,也就是说只有两个域名的协议,域名,端口都相同才会不会发生跨域,所以我们又如何解决跨域的问题呢?在下文中会给大家介绍几种方法去解决跨域问题. 那么要解决跨域就不得不谈及 ,同源策略是一种安全措施,用...
学习面试
http-网络2024-09-02
HTTP缓存:别傻傻不会回答了
前言 在有大量数据交换的应用程序中,我们会采取一些方式将那些实时性要求不高的数据生成副本,并存储在某个相对来说可以快速到达、访问、获取的仓库,这样在需要这些数据的时候可以直接从这个仓库中获取数据。 缓存的目的: 提升数据交换的性能,提高速度。 缓解服务器或数据库的压力。 HTTP 根据是否要向服务器发送请求将缓存规则分为两类:强缓存和协商缓存。 强缓存 在强缓存中,如果命中缓存,则直接从缓存数据库中取出资源,无需再发送请求到服务器上。...
学习面试
http-网络2024-08-16
前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别在前端开发中,实时数据更
前端项目中的 项目实践 前言 在前端开发中,实时数据更新是提升用户体验的重要因素之一。 是一种高效的技术,允许服务器通过单向连接将实时数据推送到客户端。下面将从 的基本改变,使用场景展开了解,并提供一个实际案例来更好的理解如何在前端项目中应用 。 的主要特点 1. 单项数据流:数据从服务器推送到客户端。 2. 自动重连:在链接丢失时,浏览器会自动尝试重新链接。 3. 简单易用:基于 协议,不需要额外的库或协议。 的使用场景 适用于需要从...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录