JS Navigator.sendBeacon 可靠的、异步地向服务器发送数据

JS Navigator.sendBeacon 可靠的、异步地向服务器发送数据

前言

我们在上一篇页面访问&页面关闭数据上报的文章中使用了 sendBeacon 方法用来发送数据,上篇文章是简单使用,那本篇文章我们就详细了解下这个东西。

一、Navigator.sendBeacon 是什么&能做什么?

Navigator.sendBeacon 是一个用于发送少量数据到服务器的 API,尤其适用于在页面即将卸载时发送数据,如日志记录、用户行为分析等。

与传统的 AJAX 请求不同,sendBeacon 方法的设计目标是确保数据在页面卸载(例如用户关闭标签页或导航到新页面)时能够可靠地发送。

Navigator.sendBeacon 方法可用于通过 HTTP POST 将少量数据异步传输到 Web 服务器。

它主要用于将统计数据发送到 Web 服务器,同时避免了用传统技术(如:XMLHttpRequest)发送分析数据的一些问题。

所以上篇文章在页面关闭进行数据上报的时候,我们就选择了 navigator.sendBeacon 方法。

二、Navigator.sendBeacon 详细介绍

1、使用场景

  1. 页面卸载时的日志记录:在用户离开页面时记录行为数据,如页面停留时间、点击行为等。

  2. 分析和监控:发送用户行为数据到分析服务器,用于网站性能监控和用户行为分析。

  3. 状态报告:向服务器报告应用程序状态或错误信息。

2、不使用 Navigator.sendBeacon 时,如何处理?

  1. 发起一个同步 XMLHttpRequest 来发送数据(open() 方法的第三个参数为 false)。

  2. 创建一个 <img> 元素并设置 src,大部分用户代理会延迟卸载(unload)文档以加载图像。

  3. 创建一个几秒的 no-op 循环。

3、不使用 Navigator.sendBeacon 可能会带来哪些问题?

3.1. 同步 XHR
  1. 同步请求会阻塞浏览器的主线程,导致页面在请求完成之前无法响应用户操作。这会严重影响用户体验,尤其是在请求需要较长时间才能完成时。

  2. 许多现代浏览器会对同步请求发出警告,提示开发者这种方法可能会导致性能问题,并建议改用异步请求。

3.2. 创建 img 元素
  1. 页面卸载流程被阻塞。

  2. 后面页面的加载时机被延迟,用户体验不好。

3.3. 创建循环
  1. 页面卸载流程被阻塞。

  2. 后面页面的加载时机被延迟,用户体验不好。

4、Navigator.sendBeacon 的优点

  1. 可靠性:sendBeacon 的主要设计目标是确保数据在页面卸载时能够可靠地发送。浏览器会在后台继续尝试发送数据,即使页面已经关闭或正在导航到新页面。

  2. 非阻塞:sendBeacon 方法是非阻塞的,不会阻碍页面的卸载过程。相比于传统的同步 AJAX 请求,不会影响用户体验或导致页面卸载延迟。

  3. 简单性:接口简单,只需提供目标 URL 和数据,无需处理响应。适用于只需要发送数据而不需要从服务器获取数据的场景。

  4. 安全性:与其他 AJAX 请求方法一样,sendBeacon 遵循同源策略,不能发送跨域请求,除非服务器设置了适当的 CORS 头。

5、使用限制

  1. 数据大小限制(通常为几十 KB),适用于发送少量数据。

  2. 因为数据大小有限,sendBeacon 不适合用于发送大量或大文件的数据。

  3. sendBeacon 方法始终使用 HTTP POST 请求。

  4. 不返回响应,不提供处理服务器响应的机制,无法检查请求是否成功以及服务器的返回结果。

6、浏览器兼容性

Navigator.sendBeacon 支持主流的现代浏览器,包括 ChromeFirefoxSafariEdge 等,但不支持较老的浏览器(如 IE 11 及更早版本)。

image

三、Navigator.sendBeacon 如何使用

1、语法

navigator.sendBeacon(url);
navigator.sendBeacon(url, data);

2、参数

2.1. url

url 参数表明 data 将要被发送到的网络地址。

2.2. data 可选

data 参数是将要发送的 ArrayBufferArrayBufferViewBlobDOMStringFormDataURLSearchParams 类型的数据。

3、返回值

类型:boolean

当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false

4、Navigator.sendBeacon 使用举例

4.1. 参数格式为 ArrayBuffer

适用于传递二进制数据,如文件或图像片段。

const buffer = new ArrayBuffer(8);
navigator.sendBeacon('/log', buffer);
4.2. 参数格式为 ArrayBufferView

ArrayBufferView 是一种表示二进制数据视图的类型。常见的 ArrayBufferView 类型包括 Uint8Array, Int8Array, Uint16Array, Int16Array, Uint32Array, Int32Array, Float32Array, Float64Array 等等。

// 创建一个包含字符串的 Uint8Array
const text = 'Hello, world!';
const textEncoder = new TextEncoder();
const textArray = textEncoder.encode(text); // 将字符串编码为 Uint8Array
// 创建一个包含其他二进制数据的 Uint8Array
const binaryData = new Uint8Array([1, 2, 3, 4, 5]);
// 将两部分数据合并到一个大的 Uint8Array
const combinedArray = new Uint8Array(textArray.length + binaryData.length);
combinedArray.set(textArray, 0);
combinedArray.set(binaryData, textArray.length);
// 发送合并后的 Uint8Array
navigator.sendBeacon('xxx/xxx', combinedArray);
4.3. 参数格式为 Blob

适用于传递文件或其他大块的二进制数据。

const blob = new Blob(['user=gqk'], { type: 'text/plain' });
navigator.sendBeacon('xxx/xxx', blob);
4.4. 参数格式为 DOMString

适用于简单的文本数据。

navigator.sendBeacon('xxx/xxx', 'this is sendBeacon case');
4.5. 参数格式为 FormData

适用于发送表单内容或复杂的键值对数据。

const formData = new FormData();
formData.append('user', 'gqk');
navigator.sendBeacon('xxx/xxx', formData);
4.6. 参数格式为 URLSearchParams

适用于发送 URL 编码的查询参数。

const params = new URLSearchParams();
params.append('user', 'gqk');
navigator.sendBeacon('xxx/xxx', params);

四、Navigator.sendBeacon 和 XHR、fetch 有什么异同点

1、相同点

  1. 发送网络请求:所有这三种方法都用于从客户端向服务器发送数据。

  2. 支持多种数据格式:它们都可以发送字符串、JSON、二进制数据等多种格式的数据。

2、不同点

2.1. Navigator.sendBeacon
  1. 用于在页面卸载时发送少量数据,适合日志、分析数据等用途。

  2. 发送数据是异步的,但不返回任何信息给调用者,无法处理服务器的响应。

  3. 设计为在页面卸载时保证数据发送,即使在浏览器关闭或页面跳转时。

  4. 始终使用 HTTP POST 请求。

  5. 不需要处理响应,使用简单。

2.2. XMLHttpRequest
  1. 用于更复杂的、需要处理响应的 AJAX 请求。

  2. 可以进行同步或异步请求。

  3. 可以处理服务器的响应,并进行进一步处理(如解析 JSON、处理状态码等)。

  4. 提供丰富的事件(如 onloadonerroronprogress 等),可以监控请求的各个阶段。

  5. 在所有主流浏览器中都得到了广泛支持,包括一些较老的浏览器。

  6. 使用较复杂,需要处理请求的各个阶段和状态。

2.3. Fetch
  1. 现代化的请求接口,用于替代 XMLHttpRequest,支持更简单和更灵活的请求和响应处理。
  2. 始终进行异步请求,返回 Promise 对象。
  3. 支持链式处理响应,可以轻松解析 JSON、处理状态码等。
  4. 支持 async/await 语法,更符合现代 JavaScript 开发习惯。
  5. 更好地支持跨域请求和 CORS(跨域资源共享)。
  6. 允许在请求中添加更多的选项(如自定义头部、请求方法等)。

3、三者使用场景

  • Navigator.sendBeacon:简单、适合在页面卸载时发送少量数据,不处理响应。

  • XHR:功能全面、适合复杂的 AJAX 请求,但使用较复杂。

  • Fetch:现代化接口,简洁灵活,适合处理复杂请求和响应。

五、总结

  1. Navigator.sendBeacon 是一个专为可靠性设计的 API,特别适用于在页面卸载时发送少量数据。

  2. 它具有简单、非阻塞、可靠等优点,特别适合日志记录和用户行为分析等场景。

  3. 发出的是异步请求,并且是 POST 请求。

  4. 只能判断出是否放入浏览器任务队列,不能判断是否发送成功。

  5. 无需处理返回值。

  6. 需要注意浏览器兼容问题。

引用

  • 【sendBeacon】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法2:滑动窗口(上)

文章目录 长度最小子数组无重复字符的最长子串[最大连续 1 的个数III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)将x减到0的最小操作数 长度最小子数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {in…

SAP---成本中心采购跟消耗性采购的区别

1.常规库存采购业务的说明&#xff1a; 1.从业务层面分析&#xff0c;企业的常规库存物料采购是&#xff1a; 采购部门下采购订单后&#xff0c;供应商送货&#xff0c;当货物到厂后&#xff0c;由库管员执行收货操作&#xff0c;先将货物收到仓库中&#xff0c;再由各个需求…

APP广告变现,开启你的APP盈利新纪元

随着科技的飞速发展&#xff0c;智能手机已经成为了我们生活中不可或缺的一部分。而在这个数字化时代&#xff0c;APP应用更是如雨后春笋般层出不穷&#xff0c;为我们的生活带来了极大的便利。然而&#xff0c;对于APP开发者来说&#xff0c;如何在激烈的市场竞争中脱颖而出&a…

智能的PHP开发工具PhpStorm v2024.1全新发布——支持PHPUnit 11.0

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…

Docker Portainer使用

Portainer是什么 Docker Portainer是一个轻量级的 Web UI 管理界面,可以用来管理Docker环境。它提供了一个直观的控制台,用户可以通过它来管理Docker主机、容器、网络、卷等Docker资源。 Portainer的主要功能和特点包括: 容器管理:可以查看、启动、停止、删除容器,以及查看容器…

SpringBoot中使用AOP实现日志记录功能

目录 一、SpringBoot框架介绍 二、什么是 AOP 三、日志记录的必要性 四、SpringBoot中如何使用AOP实现日志记录功能 一、SpringBoot框架介绍 SpringBoot是一个开源的Java开发框架&#xff0c;旨在简化基于Spring框架的应用程序的开发。它提供了一套开箱即用的工具&#xf…

WebGL的医学培训软件开发

开发基于WebGL的医学培训软件是一项复杂且技术性强的任务&#xff0c;需要结合医学专业知识和计算机图形学技术。以下是详细的开发流程和关键步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析与定义 目标用户&#xf…

【C语言】——函数栈帧的创建与销毁

函数栈帧的创建与销毁 本文主要讲解了函数调用过程中其栈帧的创建与销毁&#xff0c;内容干货较多&#xff0c;希望大家认真品味。 使用C语言进行函数调用时&#xff0c;是否会有很多疑问&#xff1a; 1.局部变量是如何创建的&#xff1f; 2.局部变量在未初始化的情况下&#x…

从ES5迈向ES6:探索 JavaScript 新增声明命令与解构赋值的魅力

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…

代码生成器(一)---项目概述以及项目初始化

目录 一、项目概述 1.代码生成器解决的问题 2.代码生成器的实际应用 3.本地代码生成器的业务流程 4.实现思路 二、项目初始化 项目Gitee地址&#xff1a;Code-Generator: 代码生成器&#xff01;&#xff01;&#xff01; 一、项目概述 1.代码生成器解决的问题 代码生成器本…

使用vue和element_ui搭建后端页面

使用vue和element_ui搭建后台管理页面 效果顶部和左侧内容固定&#xff0c;中间内容滚动 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

地理信息系统(GIS)软件开发

地理信息系统&#xff08;GIS&#xff09;软件开发是一项复杂且系统性很强的工程&#xff0c;涉及空间数据的采集、管理、分析和展示。以下是一个典型的GIS软件开发流程&#xff0c;包括各个步骤的详细说明。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

2024电工杯B题食谱评价与优化模型思路代码论文分析

2024年电工杯数学建模竞赛B题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型…

【STL专题】深入探索C++之std::string:不止于字符串【万字详解】

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;深入探索C之std::string&#xff1a;不止于字符串 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &#x1f3…

Nginx - 一键实现Nginx的快速安装和优化配置

文章目录 思路实现二次优化 思路 初始化下载工具目录并下载依赖&#xff1a; 创建临时目录 /tmp/tools。下载 OpenSSL、PCRE 和 Zlib 的压缩包。解压这些依赖包到指定目录。 设置NGINX的用户和脚本&#xff1a; 添加 nginx 用户。创建目录和启动、停止、重载NGINX的脚本。 安装…

如何异地组网添加摄像机?

本文将介绍如何使用天联技术实现异地组网添加摄像机&#xff0c;并保障数据的安全性。 安防摄像机的应用愈发广泛&#xff0c;无论是家庭安防还是企业监控&#xff0c;摄像机都扮演着重要角色。在一些特殊场合或者特殊需求下&#xff0c;我们需要将摄像机添加到异地网络中进行监…

Web开发——HTMLCSS

1、概述 Web开发分前端开发和后端开发&#xff0c;前端开发负责展示数据&#xff0c;后端开发负责处理数据。 HTML&CSS是浏览器数据展示相关的内容。 1&#xff09;网页的组成部分 文字、图片、音频、视频、超链接、表格等等 2&#xff09;网页背后的本质 程序员写的前端…

神经网络基础结构

1. 神经网络 在神经网络中&#xff0c;每个神经元都有一个与之关联的权重和偏置&#xff0c;它们用于计算神经元的输出值。神经元接收来自上一层神经元的输入&#xff0c;并将这些输入与权重相乘并加上偏置&#xff0c;然后通过激活函数进行非线性处理&#xff0c;最终产生输出…

Qt案例练习(有源码)

项目源码和资源&#xff1a;Qt案例练习: qt各种小案例练习,有完整资源和完整代码 1.案例1 项目需求&#xff1a;中间为文本框&#xff0c;当点击上面的复选框和单选按钮时&#xff0c;文本框内的文本会进行相应的变化。 代码如下&#xff1a; #include "dialog.h" …

【全开源】智能名片系统源码(Fastadmin+ThinkPHP和Uniapp)

数字时代的新名片&#xff0c;连接未来的桥梁 引言 在数字化浪潮的推动下&#xff0c;传统名片已经逐渐淡出人们的视线。取而代之的是智能名片系统&#xff0c;它以其高效、便捷和智能化的特点&#xff0c;成为了商务交流的新宠。而智能名片系统源码&#xff0c;作为其核心驱…