当前位置: 首页 > news >正文

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是可选的,并且其类型可以为ArrayBufferViewBlobDOMStringFormData

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,捕获用户将执行的活动(例如,单击按钮、滚动到页面部分等)

备选方案

通过使用XMLHttpRequestfetch,我们可以在后台定期发布数据,并且不读取响应也完全可以。

另一种方法是创建一个img元素并利用它向服务器发出 GET 请求的原理实现数据的上传

const img = new Image();
img.src = `http://xxx?${JSON.stringify(data)}`;

问题是当用户关闭页面时,最后一个请求被终止并且无法恢复。换句话说,大量分析数据丢失并导致数据失真。

为了避免关闭页面问题,一个解决方案是在关闭页面(beforeunloadunload监听)之前创建一个同步的请求 ,这对用户体验非常不利,因为它会阻止页面卸载(想象一下用户必须等待相当长的时间才能关闭浏览器选项卡)。

注意事项

navigator.sendBeacon()方法通过HTTP将少量数据异步发送到 Web 服务器。它旨在与visibilitychange事件结合使用(但不能与beforeunloadunload事件结合使用)。

除了阻止页面卸载之外,浏览器不会像我们期望的那样可靠地触发beforeunloadunload这两个事件。

许多开发人员将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如何实现热更新&#xff1f; 要使用 Webpack 实现热更新&#xff0c;可以按照以下步骤进行配置&#xff1a; 1.在项目中安装 Webpack 和相关的开发依赖&#xff1a; npm install webpack webpack-cli webpack-dev-server --save-dev2.创建一个名为 webpack.dev.js 的…...

REST API的基础:HTTP

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

基于Docker-compose创建LNMP环境并运行Wordpress网站平台

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

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境3

4、下载MaixPy IDE&#xff0c;MaixPy 使用Micropython 脚本语法&#xff0c;所以不像 C语言 一样需要编译&#xff0c;要使用MaixPy IDE , 开发板固件必须是V0.3.1 版本以上&#xff08;这里使用V0.5.0&#xff09;, 否则MaixPy IDE上会连接不上&#xff0c; 使用前尽量检查固…...

Java语言跨平台执行的核心JVM

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

家政服务小程序制作攻略揭秘

想要打造一个家政服务小程序&#xff0c;但是又不懂编程和设计&#xff1f;不用担心&#xff01;下面将为你详细介绍如何利用第三方平台&#xff0c;从零开始打造一个家政服务小程序。 首先&#xff0c;你需要找到一个适合的第三方平台&#xff0c;例如乔拓云网。在乔拓云网的【…...

2023-07-29力扣每日一题

链接&#xff1a; 141. 环形链表 题意&#xff1a; 求链表是否有环 解&#xff1a; 刚好昨天做完的初级算法链表题&#xff0c;翻转和暴力 实际代码&#xff1a; #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode() : …...

Dual pyramid GAN for semantic image synthesis

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

【Linux】更换jdk版本

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

web-暴力破解密码

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

基础实验篇 | CopterSim中回传提示消息实验

基础实验篇|CopterSim中回传提示消息实验 01实验名称及目的 回传提示消息实验&#xff1a;在飞控中&#xff0c;我们时常需要向外发布一些文字消息&#xff0c;来反映系统当前的运行状态&#xff0c;这个功能可以通过发送“mavlink_log”的uORB消息来实现。 02实验效果 在Cop…...

vue基础-动态style

vue基础-动态style 1、目标2、语法 1、目标 给标签动态设置style值 2、语法 :style"{style属性名:值}"示例&#xff1a; <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项目时发现的问题&#xff0c;原始项目使用的是Element-ui。 其实vue3可以使用适配的Element-plus 问…...

线段树详解 原理解释 + 构建步骤 + 代码(带模板)

目录 介绍&#xff1a; 定义&#xff1a; 以具体一个题目为例&#xff1a;​ 树的表示方法&#xff1a; 实现步骤&#xff1a; 构建结点属性&#xff1a; pushup函数&#xff1a; build函数&#xff1a; pushdown函数&#xff1a; modify函数&#xff1a; query…...

Java中Timer的使用

Timer 简述 在Java中&#xff0c;Timer&#xff08;计时器&#xff09;是一个用于安排定时任务的类。它可以实现在指定的时间间隔或指定的时间点执行某项任务或操作。 简单的来说Timer就是在Java中用来实现定时任务的工具。 Timer的API Timer中有两API可以使用分别是schedule…...

关于EJB,这两文把热闹和门道都说清楚了

关于技术的很多概念&#xff0c;如果你是小白&#xff0c;不建议看官网。原因就在于官网描述太抽象&#xff0c;就像八股文&#xff0c;看完感觉好像说了很多&#xff0c;但回过头又感觉似乎啥都没说。太虚、不接地气&#xff0c;是最大毛病。其实这些官网的打太极式的表述&…...

MixFormerV2: Efficient Fully Transformer Tracking

摘要 基于变压器的跟踪器在标准基准测试上取得了很强的精度。然而&#xff0c;它们的效率仍然是在GPU和CPU平台上实际部署的一个障碍。在本文中&#xff0c;为了克服这一问题&#xff0c;我们提出了一个完全变压器跟踪框架&#xff0c;称为MixFormerV2&#xff0c;没有任何密集…...

K8S中网络如何通信

Kubernetes 提出了一个自己的网络模型“IP-per-pod”&#xff0c;能够很好地适应集群系统的网络需求&#xff0c;它有下面的这 4 点基本假设&#xff1a; 集群里的每个 Pod 都会有唯一的一个 IP 地址。Pod 里的所有容器共享这个 IP 地址。集群里的所有 Pod 都属于同一个网段。…...

LangChain Agents深入剖析及源码解密上(三)

AutoGPT案例V1版本 AutoGPT是一个实验性的开源应用程序,展示了GPT-4语言模型的功能,AutoGPT程序由GPT-4驱动,将大语言模型的思考链接在一起,以自主实现设定的任何目标。作为GPT-4完全自主运行的首批例子之一,AutoGPT突破了人工智能的可能性。LangChain框架复现了https://g…...

分布式限流方案及实现

优质博文&#xff1a;IT-BLOG-CN 一、限流的作用和意义 限流是对高并发访问进行限制&#xff0c;限速的过程。通过限流来限制资源&#xff0c;可以提高系统的稳定性和可靠性&#xff0c;控制系统的负载&#xff0c;削峰填谷&#xff0c;保证服务质量。 服务限流后的常见处理…...

vuejs源码阅读之优化器

前面讲过vuejs中解析器是把html模版解析成AST&#xff0c;而优化器的作用是在AST中找到静态子树并打上标记。 静态子树是指的那些在AST中永远不会发生变化的节点。 例如&#xff0c;一个纯文本节点就是静态子树&#xff0c;而带变量的文本节点就不是静态子树&#xff0c;因为…...

【C++】-动态内存管理

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、C内存管理方式1.1 new/delete操作内置类型 总结 前言 今天再讲一个…...

微服务SpringCloud教程——微服务是什么

微服务&#xff08;MicroServices&#xff09;最初是由 Martin Fowler 于 2014 年发表的论文《MicroServices》中提出的名词&#xff0c;它一经提出就成为了技术圈的热门话题。 微服务&#xff0c;我们可以从字面上去理解&#xff0c;即“微小的服务”&#xff0c;下面我们从“…...

RNN架构解析——LSTM模型

目录 LSTMLSTM内部结构图 Bi-LSTM实现 优点和缺点 LSTM LSTM内部结构图 Bi-LSTM 实现 优点和缺点...

wordpress 自定义鼠标/链接是什么意思

创建2张表 一张t_shuiguo 水果表 一张t_supermarket 超市表现在我要查一个超市的各区水果价格的汇总如下: 表A那么首先水果表 是可以动态添加的 所有A表中的列 是动态的 先不考虑先看下静态的 如果就是这么4个水果那么SQL可以这么写 (参考了网上一些列子)-- 静态sqlselect ifnu…...

4399小游戏电脑版在线玩/魔贝课凡seo课程好吗

Shell 命令替换是指将命令的输出结果赋值给某个变量。比如&#xff0c;在某个目录中输入 ls 命令可查看当前目录中所有的文件&#xff0c;但如何将输出内容存入某个变量中呢&#xff1f;这就需要使用命令替换了&#xff0c;这也是 Shell 编程中使用非常频繁的功能。 Shell 中有…...

无锡专业做网站的/网站批量查询工具

摘自http://www.2cto.com/os/201404/296364.html&#xff08;原文请关注&#xff09;这几天在centos下装mysql&#xff0c;这里记录一下安装的过程&#xff0c;方便以后查阅 Mysql5.5.37安装须要cmake&#xff0c;5.6版本号開始都须要cmake来编译&#xff0c;5.5以后的版本号应…...

常州网络公司网站/站长之家最新域名查询

Django框架 拓展 手机验证码简单实现 在views.py中加入如下代码 注: 获取手机验证码的时候需要先判断是否为POST请求格式 import re, random from django.http import JsonResponse, HttpResponse def mobile_verification(request):print(request.method) # 返回用户的请求…...

铁建设文件在什么网站下载/网络营销教案ppt

spring-boot-starter机制 starter是什么 在了解spring-boot-starter是什么前&#xff0c;我们先回忆一下&#xff0c;最开始我们使用spring,spring mvc时是怎么和其他组件进行整合的呢&#xff1f; 没错&#xff0c;我们要配置很多模板xml文件&#xff0c;而且对新手不熟悉不…...

wordpress输出菜单/产品优化是什么意思

extern “C”是c可以正确使用c中代码而产生的&#xff0c;虽然c兼容c&#xff0c;但是在c程序调用c的库时&#xff0c;也会产生链接错误。因为c的库中函数的修饰规则与c的函数修饰规则不同&#xff0c;这会导致&#xff0c;c程序跑不起来&#xff0c;因为在编译链接时就出了错误…...