js的sendBeacon方法介绍
js的sendBeacon方法介绍
Beacon API
是一种轻量级且有效的将网页活动记录到服务器的方法。它是一个 JavaScript API
,可帮助开发人员将少量数据(例如分析或跟踪信息、调试或诊断数据)从浏览器发送到服务器。
在本文中,我们将介绍Beacon API
的相关知识。
什么是sendBeacon
从W3C 的sendBeacon规范来看,Beacon
是:
Web
开发人员可以使用一个接口来安排异步和非阻塞的数据传输,从而最大限度地减少与其他时间关键操作的资源争用,同时确保此类请求仍然得到处理并传输到目的地。
有一些来自浏览器的 HTTP
请求不需要读取甚至等待服务器响应,通常是事件跟踪、状态更新和分析数据。此类请求的特点是:
- 无需访问
HTTP
响应 - 发送后就忘记 - 轻量级 - 不应影响用户体验或占用太多网络带宽
- 发生在后台,无需用户交互
- 关闭页面(又称为页面卸载)时需要可靠发送
Beacon API
的明确目标是为 Web
开发人员提供一个最小的接口来指定数据和端点,然后让浏览器合并请求。
sendBeacon
请求包含了以下几个特点:
- 信标请求不需要响应。这与客户端(浏览器)期望服务器响应的常规
XHR
请求或fetch
请求有很大的不同。 - 即使关闭浏览器,
sendBeacon
请求也保证在页面卸载之前启动。 sendBeacon
请求无需阻塞请求(例如XHR
)即可完成(注意,sendBeacon
请求不是XHR
请求)。- 请求按优先级排列,以避免与时间关键的操作和更高优先级的网络请求竞争。
- 使用
HTTP POST
方法。
sendBeacon的使用
虽然sendBeacon
具有广泛的浏览器支持,但是为了安全起见,我们可以使用下面的代码进行简单的检查简单来测试浏览器支持:
if (navigator.sendBeacon) {navigator.sendBeacon('/log-tracking', data);
} else {// 备选方案
}
sendBeacon
方法采用两个参数:服务器的 URL
和数据。sendBeacon()
方法返回一个布尔值。当请求正确放入队列时它返回true
,否则返回false
。
sendBeacon()
的data
是可选的,并且其类型可以为ArrayBufferView
、Blob
、DOMString
或FormData
。
function sendAnalytics(msg) {if (navigator.sendBeacon) {let data = new FormData();data.append('start', startTime);data.append('end', performance.now());data.append('msg', msg);navigator.sendBeacon('/log-tracking', data);} else {// 备选方案}
}
在上面的示例中,我们发送用户在启动应用程序上花费的时间和时间。我们还发送一个跟踪msg
,捕获用户将执行的活动(例如,单击按钮、滚动到页面部分等)
备选方案
通过使用XMLHttpRequest
或fetch
,我们可以在后台定期发布数据,并且不读取响应也完全可以。
另一种方法是创建一个img元素并利用它向服务器发出 GET
请求的原理实现数据的上传
const img = new Image();
img.src = `http://xxx?${JSON.stringify(data)}`;
问题是当用户关闭页面时,最后一个请求被终止并且无法恢复。换句话说,大量分析数据丢失并导致数据失真。
为了避免关闭页面问题,一个解决方案是在关闭页面(beforeunload
和unload
监听)之前创建一个同步的请求 ,这对用户体验非常不利,因为它会阻止页面卸载(想象一下用户必须等待相当长的时间才能关闭浏览器选项卡)。
注意事项
navigator.sendBeacon()
方法通过HTTP
将少量数据异步发送到 Web
服务器。它旨在与visibilitychange
事件结合使用(但不能与beforeunload
和unload
事件结合使用)。
除了阻止页面卸载之外,浏览器不会像我们期望的那样可靠地触发beforeunload
和unload
这两个事件。
许多开发人员将
unload
事件视为有保证的回调,并将其用作会话结束信号来保存状态并发送分析数据,但这样做非常不可靠,尤其是在移动设备上!在许多典型的卸载情况下,unload
事件不会触发,包括从移动设备上的选项卡切换器关闭选项卡或从应用程序切换器关闭浏览器应用程序。sendBeacon
请求保证在页面卸载之前启动,并且允许运行完成,而无需阻止请求或阻止处理用户交互事件的其他技术。
与其他请求方式不同,sendBeacon
可以由浏览器调度和合并。这就导致 HTTP
请求时间可能会延迟(可以在请求有效负载中包含时间戳数据来解决)。
使用场景
有两个主要场景可以使用Beacon API
:
用户活动跟踪和分析
当我们想要捕获并发送用户活动和行为的分析报告。这些活动可能包括,
- 用户在会话中停留了多长时间?
- 用户使用哪些用户界面控件?
- 要捕获的任何其他类型的信息(比如说
js
的错误)
调试和诊断
我们可能会遇到某个功能可以在本地(开发模式)运行,但在客户环境(生产模式)中无法按预期运行的情况,在这种情况下可以逻辑地发送这些轻量级信标请求来记录有用的跟踪路径信息并根据需要进行调试、排查错误。
sendBeacon 的数据限制
浏览器对sendBeacon
发送的数据大小都是由一定的限制的,以确保请求能够快速、及时地完成。这里没有具体说明限制的数值是因为不同的浏览器供应商的实际实现可以有所不同(不过在w3c的beacon相关的issue中提到了限制大小为64kb
,当然这是非标准的)。
相关文章:
js的sendBeacon方法介绍
js的sendBeacon方法介绍 Beacon API是一种轻量级且有效的将网页活动记录到服务器的方法。它是一个 JavaScript API,可帮助开发人员将少量数据(例如分析或跟踪信息、调试或诊断数据)从浏览器发送到服务器。 在本文中,我们将介绍B…...

【Tomcat---1】IDEA控制台tomcat日志输出乱码解决
一、修改IDEA的文件编码配置为UTF-8 二、修改IDEA的vmoptions文件,添加-Dfile.encodingUTF-8 到Tomcat目录/conf文件夹修改logging.properties 重启idea即可。采用统一的编码...
Redis学习路线(2)—— Redis的数据结构
一、Redis的数据结构 Redis是一个Key-Value的数据库,key一般是String类型,不过Value的类型却有很多: String: Hello WorldHash: {name: "jack", age: 21}List: [A -> B -> C -> C]Set…...

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析) Redis提供的持久化机制Redis持久化如何工作Redis持久化的故障分析持久化频率操作分析数据库多久调用一次write,将数据写入内核缓冲区?内核多久将系统缓冲…...
IT管理者年过50后何去何从
最近面试了一位前职为IT技术及管理专家,知名院校硕士毕业,唯一不同的是,他是一名已过50岁的IT技术及管理者。一直知道过了50岁,我们估计会有很大的坎,但是那时候从未曾想过连我们保险公司都会因为年龄而拒绝这样优秀的…...
C++字符串题基础(进阶请看下一个文章)
打印小写字母表 #include<iostream> #include<string.h> #include<iomanip> #include<stdio.h> #include<cmath> using namespace std; int main() {char na;for(int i1;i<13;i){cout<<n;n;}cout<<endl;for(int i1;i<13;i){c…...
webpack如何实现热更新?
webpack如何实现热更新? 要使用 Webpack 实现热更新,可以按照以下步骤进行配置: 1.在项目中安装 Webpack 和相关的开发依赖: npm install webpack webpack-cli webpack-dev-server --save-dev2.创建一个名为 webpack.dev.js 的…...

REST API的基础:HTTP
在本文中,我们将深入探讨万维网数据通信的基础 - HTTP。 什么是超文本? HTTP(超文本传输协议)的命名源于“超文本”。 那么,什么是超文本? 想象一下由超链接组成的文本、图像和视频的混合物。这些链接充当我…...

基于Docker-compose创建LNMP环境并运行Wordpress网站平台
基于Docker-compose创建LNMP环境并运行Wordpress网站平台 1.Docker-Compose概述2.YAML文件格式及编写注意事项3.Docker-Compose配置常用字段4.Docker Compose常用命令5.使用Docker-compose创建LNMP环境,并运行Wordpress网站平台1. Docker Compose 环境安装下载安装查…...

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境3
4、下载MaixPy IDE,MaixPy 使用Micropython 脚本语法,所以不像 C语言 一样需要编译,要使用MaixPy IDE , 开发板固件必须是V0.3.1 版本以上(这里使用V0.5.0), 否则MaixPy IDE上会连接不上, 使用前尽量检查固…...

Java语言跨平台执行的核心JVM
本文重点 在前面的课程中,我们介绍了java中的三层JDK->JRE->JVM,其中JVM称为Java的虚拟机,只是用来执行的,JRE是运行环境,要想在操作系统中运行,除了JVM还需要类库,JDK=JRE+开发的包和工具。本文就将介绍一下JVM究竟为何物? JVM 有的人会认为JVM是java中的东西…...

家政服务小程序制作攻略揭秘
想要打造一个家政服务小程序,但是又不懂编程和设计?不用担心!下面将为你详细介绍如何利用第三方平台,从零开始打造一个家政服务小程序。 首先,你需要找到一个适合的第三方平台,例如乔拓云网。在乔拓云网的【…...
2023-07-29力扣每日一题
链接: 141. 环形链表 题意: 求链表是否有环 解: 刚好昨天做完的初级算法链表题,翻转和暴力 实际代码: #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode() : …...

Dual pyramid GAN for semantic image synthesis
为了解决在图像合成时候小物体容易消失,大物体经常作为块的拼接来生成的。本文提出DP-GAN在所有尺度下共同学习空间自适应归一化模块的条件。这样尺度信息就会被双向使用,他统一了不同尺度的监督。(重点看图和代码) SPADE模块解释 GAN在生成包含许多不同…...

【Linux】更换jdk版本
目录 一、前言二、查看jdk版本号1、项目中的版本号(pom.xml)2、服务器中的版本号 三、更换jdk版本1、创建java文件夹2、下载并解压JDK安装包①、下载jdk安装包②、移动到创建好的/usr/local/java路径下③、解压jdk安装包 四、删除原来的jdk版本1、删除原…...

web-暴力破解密码
Burte Force(暴力破解)概述 暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率&…...

基础实验篇 | CopterSim中回传提示消息实验
基础实验篇|CopterSim中回传提示消息实验 01实验名称及目的 回传提示消息实验:在飞控中,我们时常需要向外发布一些文字消息,来反映系统当前的运行状态,这个功能可以通过发送“mavlink_log”的uORB消息来实现。 02实验效果 在Cop…...
vue基础-动态style
vue基础-动态style 1、目标2、语法 1、目标 给标签动态设置style值 2、语法 :style"{style属性名:值}"示例: <template><div id"app"><div><p :style"{backgroundColor:color}">动态styleclass</p>…...
vue3使用响应式数据 + v-model导致响应式失效el-form表单无法输入的问题
文章目录 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 参考文章 重构vue2项目时发现的问题,原始项目使用的是Element-ui。 其实vue3可以使用适配的Element-plus 问…...

线段树详解 原理解释 + 构建步骤 + 代码(带模板)
目录 介绍: 定义: 以具体一个题目为例: 树的表示方法: 实现步骤: 构建结点属性: pushup函数: build函数: pushdown函数: modify函数: query…...

佰力博科技与您探讨材料介电性能测试的影响因素
1、频率依赖性 材料的介电性能通常具有显著的频率依赖性。在低频下,偶极子的取向极化占主导,介电常数较高;而在高频下,偶极子的取向极化滞后,导致介电常数下降,同时介电损耗增加。例如,VHB4910…...
嵌入式面试提纲
一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责把数据帧(Frame)在相邻节点间传输。 网络层(Internet Layer) 最典型的是 IP 协议 (IPv4/IPv6)。负责 路由选路、分片与重组。 其他:ICMP(Ping、目的不可达等)…...

Cad 反应器 cad c#二次开发
在 AutoCAD C# 二次开发中,DocumentCollectionEventHandler 是一个委托(delegate),用于处理与 AutoCAD 文档集合(DocumentCollection)相关的事件。它属于 AutoCAD .NET API 的事件处理机制,本质…...
android 之 MediaExtractor
MediaExtractor 是Android多媒体处理的基础组件,解封装是其核心价值。 一、功能与定位 MediaExtractor 是Android多媒体框架中的媒体解封装工具,主要作用是从媒体文件(如MP4、MKV、MP3)中分离音视频轨道数据,为后续解…...

Rust学习(1)
声明:学习来源于 《Rust 圣经》 变量的绑定和解构 变量绑定 let a "hello world":这个过程称之为变量绑定。绑定就是把这个对象绑定给一个变量,让这个变量成为它的主人。 变量可变性 Rust 变量默认情况下不可变,可以通过 mut …...
解决transformers.adapters import AdapterConfig 报错的问题
需要安装 Adapter-Hub 的 transformers 分支,不是官方 transformers 库! pip install githttps://github.com/Adapter-Hub/transformers.git✅ 注意:这个命令会从 GitHub 下载源码并安装。你需要确保你的网络可以访问 GitHub,并且…...
Flink 失败重试策略 :restart-strategy.type
在 Apache Flink 中,restart-strategy.type 用于指定作业的重启策略(Restart Strategy),它决定了作业在失败后如何恢复。 Flink 提供了 4 种内置重启策略,可以通过 flink-conf.yaml 或代码动态配置。 1. 可配置的 rest…...
【评测】Qwen3-Embedding模型初体验
每一篇文章前后都增加返回目录 回到目录 【评测】Qwen3-Embedding模型初体验 模型的介绍页面 本机配置:八代i5-8265U,16G内存,无GPU核显运行,win10操作系统 ollama可以通过下面命令拉取模型: ollama pull modelscope…...

【大模型】【推荐系统】LLM在推荐系统中的应用价值
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点B.4 两大推荐方法 C 模型结构C.1 知识蒸馏(训练过程)C.2 轻量推理(部署过程) D 实验设计E 个人总结 A 论文出处 论文题目:SLMRec:Distilling…...
mybatis的if判断==‘1‘不生效,改成‘1‘.toString()才生效的原因
mybatis的xml文件中的if判断‘1’不生效,改成’1’.toString()才生效 Mapper接口传入的参数 List<Table> queryList(Param("state") String state);xml内容 <where><if test"state ! null and state 1">AND EXISTS(select…...