首页 > 其他分享 >如何在用户刷新、跳转、关闭浏览器时向服务端发送统计的数据?

如何在用户刷新、跳转、关闭浏览器时向服务端发送统计的数据?

时间:2024-12-01 09:45:10浏览次数:13  
标签:浏览器 logData 跳转 xhr 时向 sendBeacon 卸载 服务端 页面

在用户刷新、跳转或关闭浏览器时向服务器发送统计数据,前端开发中常用的方法有以下几种:

1. 使用navigator.sendBeacon() API:

这是最推荐的方式,尤其是在用户即将离开页面时。sendBeacon() 方法异步发送少量数据到服务器,并且不会阻塞页面卸载或影响下一个导航的加载性能。它在浏览器后台发送数据,即使浏览器已经关闭,也能保证数据尽可能地发送到服务器。

window.addEventListener('unload', logData);

function logData() {
  if (navigator.sendBeacon) {
    navigator.sendBeacon('/log', JSON.stringify({/* 数据 */}));
  } else {
    // sendBeacon() 不支持时的 fallback,例如使用同步 XMLHttpRequest
    // 但要注意这可能会阻塞页面卸载
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/log', false); // 使用同步请求
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(JSON.stringify({/* 数据 */}));
  }
}

2. 使用XMLHttpRequest (同步):

unloadbeforeunload事件中使用同步的XMLHttpRequest发送数据。这种方法的缺点是会阻塞页面卸载,影响用户体验,并且在某些浏览器中可能不被支持或受到限制。 因此,不推荐使用,除非sendBeacon不可用。

window.addEventListener('unload', logData); // 或 beforeunload

function logData() {
  var xhr = new XMLHttpRequest();
  xhr.open('POST', '/log', false); // 同步请求
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.send(JSON.stringify({/* 数据 */}));
}

3. 使用fetch API (keepalive):

fetch API 的 keepalive 选项允许在页面卸载后继续发送请求。这在支持的浏览器中可以作为 sendBeacon 的替代方案。

window.addEventListener('unload', logData);

async function logData() {
  try {
    await fetch('/log', {
      method: 'POST',
      body: JSON.stringify({/* 数据 */}),
      keepalive: true
    });
  } catch (error) {
    // 处理错误
  }
}

4. 使用 Image 对象 (像素追踪):

创建一个 Image 对象,并将其 src 属性设置为指向服务器上的一个记录日志的脚本,可以在 URL 中携带数据。这种方法的缺点是只能发送 GET 请求,并且数据量有限。

window.addEventListener('unload', logData);

function logData() {
  new Image().src = `/log?data=${encodeURIComponent(JSON.stringify({/* 数据 */}))`;
}

事件选择:

  • unload: 页面完全卸载时触发。此时文档、资源都已经被移除。由于页面正在卸载,执行时间有限,建议使用 sendBeacon
  • beforeunload: 在页面卸载前触发,可以取消卸载。如果在该事件处理函数中返回一个非空字符串,浏览器会显示一个确认对话框,询问用户是否要离开页面。 要注意的是,在移动端浏览器中,beforeunload 事件可能不被支持或行为不一致。

数据格式:

建议使用 JSON 格式来发送数据,方便服务器端处理。

服务器端:

服务器端需要设置相应的路由来接收和处理这些数据。

总结:

navigator.sendBeacon() 是目前最好的选择,因为它不会阻塞页面卸载,并且能够保证数据尽可能地发送到服务器。如果浏览器不支持 sendBeacon,可以考虑使用 fetch with keepalive,最后才考虑使用同步的 XMLHttpRequest 或 Image 对象。 选择哪种方法取决于你的具体需求和浏览器兼容性要求。 记住测试不同浏览器和场景下的兼容性。

标签:浏览器,logData,跳转,xhr,时向,sendBeacon,卸载,服务端,页面
From: https://www.cnblogs.com/ai888/p/18579521

相关文章

  • html的标签`<a>`除了用作跳转链接外,还有哪些用途?
    <a>标签除了用于创建超链接跳转到其他页面或资源外,还有以下几种用途:锚点链接(页面内跳转):可以使用href属性指向页面内的特定位置。通过设置id属性为目标元素,然后在<a>标签的href属性中使用#加上id值,即可实现点击链接跳转到页面同一位置的不同部分。<ahref="#sec......
  • 基于Linux下单进程的网络客户端和服务端开发
    基于Linux下单进程的网络客户端和服务端开发前言一、socket是什么?二、网络客户端1.创建流式套截字2.connect()3.send()4.recv()5.关闭socket三、网络服务端1.创建服务端监听套接字2.用于指定通信的IP和端口3.把socket设置为监听的socket4.接收客户端的连接5.recv()/send......
  • 说说React服务端渲染怎么做?原理是什么?
    一、是什么在SSR中 (opensnewwindow),我们了解到Server-SideRendering ,简称SSR,意为服务端渲染指由服务侧完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程其解决的问题主要有两个:SEO,由于搜索引擎爬虫抓取工具......
  • vivo 企业云盘服务端实现简介
    作者:来自vivo互联网存储团队-ChengZhi本文将介绍企业云盘的基本功能以及服务端实现。一、背景vivo企业云盘是一个企业级文件数据管理服务,解决办公数据的存储、共享、审计等文件管理需求;同时便于团队成员快速共享、管理文件,帮助集中管理企业数字资产,提升办公效率,实现内部......
  • node.js毕设智慧校园服务系统服务端(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于智慧校园服务系统的研究,现有研究主要以智慧校园的整体架构和部分功能模块为主,专门针对包含如此全面功能(如学生、教职工、班级信息到宿舍分配、活动......
  • PbootCMS网站访问页面提示:您访问的页面不存在,请核对后重试!如何改成自动404跳转页面
    操作步骤:依次打开根目录/core/template/error.html。修改error.html文件,例如,一秒后跳转百度。示例代码:<!doctypehtml><html><head><metacharset="utf-8"><title>错误信息</title><metaname="viewport"content=&quo......
  • python+flask框架的基于微信小程序的校园互助平台服务端视频8(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的飞速发展,微信小程序作为一种轻量级的应用形式,已经深入到人们生活的方方面面。在校园环境中,学生之间经常存在各种互助......
  • Vue-Router实现路由跳转
    1、官方指导文件1、官方指导文件客户端路由的作用是在单页应用(SPA)中将浏览器的URL和用户看到的内容绑定起来。当用户在应用中浏览不同页面时,URL会随之更新,但页面不需要从服务器重新加载。2、如何定义一个新的路由1)引入相关的组件importHomeViewfrom'../views/H......
  • python+flask框架的基于微信小程序的高校食堂在线预约点餐系统的设计服务端视频8(开题
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的迅猛发展,高校学生的生活方式和学习模式正发生着深刻变化。特别是在餐饮消费方面,学生群体对便捷性、个性化和高效性的......
  • 当IT技术总监面试问:描述你如何实现服务端渲染(SSR)以及它对SEO和性能的影响?
    服务端渲染(SSR)是一种在服务器上渲染HTML页面,然后将完成的页面发送给客户端的网页渲染技术。这种方法与客户端渲染(CSR)相对,后者通常是在浏览器中执行JavaScript来动态生成页面内容。如何实现服务端渲染(SSR):1.**选择框架**:  选择支持SSR的框架,如React(Next.js)、Vue(Nuxt.js)、A......