Beacon API是W3C仍在草案阶段的一项新API,这个API主要用于发送不需要服务器回应的HTTP请求或强制浏览器发送一个请求。

window.addEventListener('unload', logData, false);function logData() {var client = new XMLHttpRequest();client you can find out more.open("POST", "/log", true);client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");client.send(analyticsData);
}

这段代码是在做什么呢?如果做过页面统计、埋点,应该能看出来,这段代码实际上是在用户切换页面时试图向服务器发送一些统计数据。

理想情况下没什么问题,然而由于这个请求是在unload事件的handler当中,浏览器可能会忽略这个请求。因此出现了下面这样的代码:

window.addEventListener('unload', logData, false);function logData() {var client = new XMLHttpRequest();client.open("POST", "/log", false); // 注意这里client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");client.send(analyticsData);
}

XMLHttpRequest.open的第三个参数表示这个HTTP请求是否异步发送。这段代码将强制浏览器进行一个同步的HTTP请求来确保浏览器不会无视这个请求。

现在数据肯定能发出去了,然而网速无情,一个同步的请求意味着浏览器必须等待整个请求发送完成直至收到整条HTTP回应。这对于页面切换来说是致命的延迟。

Beacon API

说到这大家应该明白了,Beacon API 的作用就是为了能让浏览器在类似unload这样的情况下成功发送请求,同时不影响下一个页面的载入。如何使用呢,W3C的例子如下:

window.addEventListener('unload', logData, false);function logData() {navigator.sendBeacon("/log", analyticsData);
}

好吧,太简单了,没啥可说的了。哦不,简单确实,但是太简单了,它隐藏了点细节:

  • sendBeacon只能用POST请求来发送信息;

  • sendBeacon的第二个参数是可选的,如果提供的话,参数类型可以是ArrayBufferView、Blob、DOMString或者FormData;

  • sendBeacon所收到的HTTP回应会被无视。实际上即使不无视你也不见得能拿到回应,因为整个请求发送或者收到回应的时候,页面可能早就不存在了;

  • sendBeacon是有返回值的,类型为booltrue表示浏览器已经将这个请求纳入队列稍后处理,false表示浏览器无法完成这个请求,其原因不详,不过通常来说就是浏览器的HTTP请求队列已满;

Beacon API相关推荐

  1. Beacon API的应用

    遇到了一个需求就是,在浏览器被关闭之前要调用一个后端提供的请求,我一开始用axios,信誓旦旦的说,木有问题,后端后来告诉我,没有接收到有请求,这个时候我就去排除下原因,我debugger看了下,明明 ...

  2. api存在csrf攻击吗_使用rest api防止单页应用上的csrf攻击

    api存在csrf攻击吗 tl;dr - If your SPA uses a private REST API, use CORS and a CSRF Token header. If your ...

  3. 如何使用 Performance API

    本教程介绍了如何使用 Performance API 记录来自访问您的应用程序的真实用户的类似 DevTool 的统计信息. 使用浏览器 DevTools 评估 Web 应用程序性能很有用,但复制实际 ...

  4. 腾讯企鹅辅导 H5 性能极致优化

    企鹅辅导 H5 页面在长期迭代过程中,逐渐累积了一些性能问题,导致页面加载.渲染速度变慢.为了提升用户体验,近期针对页面加载速度,渲染速度做了专项优化,本文是对此次优化的实践总结.分析过程比较细致,希 ...

  5. 腾讯企鹅辅导 H5 性能极致优化总结

    企鹅辅导 H5 页面在长期迭代过程中,逐渐累积了一些性能问题,导致页面加载.渲染速度变慢.为了提升用户体验,近期针对页面加载速度,渲染速度做了专项优化,本文是对此次优化的实践总结.分析过程比较细致,希 ...

  6. web前端埋点及数据上报

    web前端埋点及数据上报 简介 前端埋点即在产品客户端获取用户行为和使用情况的一种监控方式.通过埋点可以获取到用户行为数据,借助这些数据,我们可以从用户角度出发,升级迭代产品,使其更加贴近用户使用习惯 ...

  7. 如何用网页脚本追踪用户

    >>如何用网页脚本追踪用户 >>Beacon API 使用

  8. Ethereum 基础(一)

    以太坊(Ethereum)是社区运行的技术,为加密货币以太币(ETH)和数千个去中心化应用程序提供动力. ethereum.org是您进入以太坊世界的门户.这项技术是新的.不断发展的--有个向导会有帮 ...

  9. 万向区块链行业研究:如果从用户画像实现角度看数据隐私问题,是怎样的?

    前言: 万向区块链董事长兼总经理肖风博士曾说过,不管是元宇宙.区块链还是Web3.0,本质其实都是讲同一件事,就是人类社会在数字时代里的去中心化趋势.因此,无论在元宇宙里,还是Web3.0时代,个人数 ...

最新文章

  1. linux设备驱动模型之 kset原理与实例分析
  2. 使用微软的TFS云服务来管理小型项目
  3. GDCM:将PAPYRUS 3.0文件转换为dcm文件的的测试程序
  4. this和prototype
  5. 为提升效率,阿里取消周报制度?醒醒吧,自动化报表才是出路
  6. informix多张表UPDATE时不能用别名
  7. vue 花括号里面的变量_二、Vue条件指令
  8. 22.搜索大纲及重定向(Search Synonyms and Re-directs)
  9. linux 5.8 设备的mac地址与预想的不符 已忽略,解决“eth0设备的MAC 址与预想的不符,忽略”...
  10. 图论算法 若干定义
  11. Like My Mother Always Said… by Erin McHugh
  12. 数学三次危机(四)第一次数学危机
  13. D3DCULL_CW 和 D3DCULL_CCW
  14. emp和emn是什么文件,emnemp是什么文件
  15. 网站信息的采集系列(一)--基本流程
  16. 微信小程序 实现背景色渐变(css实现)
  17. 抖音自媒体上热门的诀窍,高效蹭实时热点的4个技巧
  18. Android Studio新手必读
  19. Wacom 数位板 和冠 手绘笔 Photoshop MacOS 延时卡顿丢笔解决办法
  20. torchsummary 中input size 异常的问题

热门文章

  1. 7-47 对称排序 (25 分)
  2. java设置默认参数_关于java:如何设置默认方法参数值?
  3. 如何修改GitHub项目显示语言问题
  4. jquery.js和jquery-1.4.2.min.js的区别
  5. Python中判断回文数
  6. signature=fa342ee2b7c3e3e9cba3f194df2d59ca,Date of Signature
  7. 用户不在sudoers文件中,此事将被报告
  8. 【线性代数公开课MIT Linear Algebra】 第十八课 行列式的性质
  9. Direct2D教程(五)复合图形
  10. 用c#控制台模拟双色球随机选