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,当然这是非标准的)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容斥原理 训练笔记

​ 容斥原理 设S是一个有限集&#xff0c;A_1,A_2…A_n是S的n个子集&#xff0c;则 ∣ S − ⋃ i 1 n A i ∣ ∑ i 0 n ( − 1 ) i ∑ 1 ≤ j 1 < j 2 . . . < j i ≤ n ∣ ⋂ k 1 i A j k ∣ |S-\bigcup_{i1}^{n}A_i|\sum_{i0}^{n}(-1)^i\sum_{1\leq j_1< j_2.…

基于长短期神经网络LSTM的位移监测,基于长短期神经网络的位移预测,LSTM的详细原理

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的位移监测 完整代码: https://download.csdn.net/download/abc991835105/88098131 效果图 结果分析 展望 参考论文 背影 路径追踪预测,对实现自动飞行驾驶拥有重要意义,长短期神经网络是一种改进党的…

有效三角形的个数

给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 示例 2: 输入: nums [4,2,3,4] 输出: 4 代码如下&#xff1a;…

力扣75——队列

总结leetcode75中队列的算法题解题思路。 上一篇&#xff1a;力扣75——哈希表/哈希集合 以下代码大部分为本人所写&#xff0c;少部分为官方示例代码。 力扣75——队列 1 最近的请求次数2 Dota2 参议院1-2 解题总结 1 最近的请求次数 题目&#xff1a; 写一个 RecentCounter…

okvis

论文 Keyframe-Based Visual-Inertial SLAM Using Nonlinear Optimization 摘要 由于两种感知模式的互补性&#xff0c;视觉和惯性线索的融合在机器人中变得很流行。虽然迄今为止大多数融合策略都依赖于过滤方案&#xff0c;但视觉机器人界最近转向了非线性优化方法&#x…

【React Native】学习记录(二)——路由搭建和常见的开发技巧

模拟器设置成中文 在开发过程中发现&#xff0c;两个模拟器都不能输入中文&#xff0c;所以需要配置一下。 先说一下安卓&#xff0c;在弹出的输入框中查看设置&#xff0c;设置一下对应的languages即可&#xff1a; 在苹果模拟器中&#xff0c;跟苹果手机一样&#xff0c;打…

树莓派本地快速搭建web服务器,并发布公网访问

文章目录 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 随着科技的发展&#xff0c;电子工业也在不断进步&#xff0c;我们身边的电子设备也在朝着小型化和多功能化演进&#xff0c;以往体积庞大的电脑也在…

Selenium多浏览器处理

Python 版本 #导入依赖 import os from selenium import webdriverdef test_browser():#使用os模块的getenv方法来获取声明环境变量browserbrowser os.getenv("browser").lower()#判断browser的值if browser "headless":driver webdriver.PhantomJS()e…

为Android构建现代应用——应用架构

选择风格(Choosing a style) 我们将依照Google在《应用架构指南》中推荐的最佳实践和架构指南来构建OrderNow的架构。 这些定义包括通过各层定义组件的一些Clean Architecture原则。 层次的定义(Definition of the layers) 在应用程序中&#xff0c;我们将定义以下主要层次…

小程序创建

1&#xff0c;下载HBuilder X ;(3.8.7) HBuilderX-高效极客技巧 2,下载模板&#xff08;不选云服务的&#xff09;&#xff1b; 3&#xff0c;运行-运行到小程序模拟器&#xff1b; 4&#xff0c;安装小程序开发工具&#xff1b; 5&#xff0c;选择稳定版-windows64版&…

SpringBoot 统⼀功能处理

目录 前言 1.⽤户登录权限效验 1.1、最初⽤户登录效验 1.2、Spring AOP ⽤户统⼀登录验证的问题 1.3、Spring 拦截器 了解 创建一个 Spring 拦截器 的流程 1、 创建自定义拦截器&#xff0c;实现 HandlerInterceptor 接⼝的preHandle&#xff08;执⾏具体⽅法之前的预处理…

win10日程怎么同步到安卓手机?电脑日程同步到手机方法

在如今快节奏的生活中&#xff0c;高效地管理时间变得至关重要。而对于那些经常在电脑上安排日程的人来说&#xff0c;将这些重要的事务同步到手机上成为了一个迫切的需求。因为目前国内使用win10系统电脑、安卓手机的用户较多&#xff0c;所以越来越多的职场人士想要知道&…

Jenkins 安装构建

一、CentOS 安装 1. 使用该存储库 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key 2. 安装 Java yum install fontconfig java-11-openjdk配…

NAND flash的坏块

NAND flash的坏块 1.为什么会出现坏块 由于NAND Flash的工艺不能保证NAND的Memory Array&#xff08;由NAND cell组成的阵列&#xff09;在其生命周期中保持性能的可靠&#xff08;电荷可能由于其他异常原因没有被锁起来。因此&#xff0c;在NAND的生产中及使用过程中会产生坏…

ESP32(MicroPython) 四足机器人(五)功能补充

本次更新增加了前后倾斜&#xff08;每次动作交换前部和后部高度&#xff09;、蹲起与抬脚动作&#xff0c;均位于用于连续执行动作的function函数中&#xff0c;但实测抬脚动作需要先启动function函数的另一项功能才能正常开启&#xff0c;代码检查无误&#xff0c;应该是Micr…

解决eclipse 打开报错 An error has occurred. See the log file null.

解决eclipse 打开报错an error has ocurred. See the log file null 出现原因&#xff1a;安装了高版本的jdk,更换 jdk 版本&#xff0c;版本太高了。 解决方案&#xff1a;更改环境变量 改成 jkd 1.8

【深度学习实践】垃圾检测

简介 本项目使用深度学习目标检测开源框架PaddleDetection中的yolox算法实现了垃圾检测&#xff0c;本文包含了从头训练yolox模型和直接使用训练好的模型进行推理的代码及相关权重。 一、数据集准备 本次训练的数据集为coco格式&#xff0c;共包含150张垃圾的照片&#xff0…

F5 LTM 知识点和实验 6-使用虚拟服务器处理流量

第六章:使用虚拟服务器处理流量 virtual server 类型 前几章描述的场景,可以简单总结为,F5设备终结了一个会话,在client-side充当服务端,在server-side充当客户端,完成了一个全代理过程,这种模型的vs类型被称为标准类型。一般在你需要将流量做负载等场景时需要。 但是…

利用小波分解信号,再重构

function [ output_args ] example4_5( input_args ) %EXAMPLE4_5 Summary of this function goes here % Detailed explanation goes here clc; clear; load leleccum; s leleccum(1:3920); % 进行3层小波分解&#xff0c;小波基函数为db2 [c,l] wavedec(s,3,db2); %进行…

hcip——路由策略

要求&#xff1a; 基础配置 AR1 [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.0.0.1 24[R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip add 14.0.0.1 24[R1]int loop0 [R1-LoopBack0]ip add 1.1.1.1 24[R1]rip 1 [R1-rip-1]vers 2 [R1-rip-1]net…