document.visibilityState 和 visibilitychange 事件结合优化性能「建议收藏」

document.visibilityState 和 visibilitychange 事件结合优化性能「建议收藏」一般在项目中,用户登录之后有消息通知的时候,用户头像上面会有一个消息数来提醒用户,但这个数字要保证新打开一个页面的时候是正确的,当切换浏览器的tab再回来的时候还要保证正确性。说到这可能有人觉得放一个定时器,过一段时间去获取一次不就可以了,但这样会相当耗性能,使用定时器,这个页面就算被隐藏(非当前标签页、最小化)也会去一直执行这个定时器,这就相当消耗资源,而且这个页面放很久的话,还会造成页面卡死…

大家好,又见面了,我是你们的朋友全栈君。

一般在项目中,用户登录之后有消息通知的时候,用户头像上面会有一个消息数来提醒用户,但这个数字要保证新打开一个页面的时候是正确的,当切换浏览器的tab再回来的时候还要保证正确性。

说到这可能有人觉得放一个定时器,过一段时间去获取一次不就可以了,但这样会相当耗性能,使用定时器,这个页面就算被隐藏(非当前标签页、最小化)也会去一直执行这个定时器,这就相当消耗资源,而且这个页面放很久的话,还会造成页面卡死的问题。下面介绍一个方法解决这个问题。

visibilitychange

浏览器标签页被隐藏或显示的时候会触发visibilitychange事件。

document.addEventListener('visibilitychange', handleVisibilityChange, false);

要对上面的问题做优化,首先就要能够监听浏览器标签页的显示隐藏,visibilitychange事件刚好满足。现在事件可以监听到了,就要在事件中判断当前标签页是否显示,然后执行相应的事件就能解决上面的问题。

visibilityState

document.visibilityState (只读属性), 返回document的可见性,,可用的值如下:

  1. visible:页面内容可以至少部分可见。实际上,这意味着页面是非最小化窗口的前景选项卡;
  2. hidden:页面内容对用户不可见。实际上,这意味着文档可以是后台选项卡,也可以是最小化窗口的一部分,或者OS屏幕锁定处于活动状态;
  3. prerender:页面内容正在预呈现,并且对用户不可见(被视为隐藏用途document.hiddendocument.hidden只读属性,返回布尔值,表示页面是(true)否(false)隐藏))。文档可以在此状态下启动,但永远不会从另一个值转换到它。注意:浏览器支持是可选的。

实际上这里我测试了用document.visibilityStatedocument.hidden都可以达到相同的效果,但是这里https://www.w3.org/TR/page-visibility/ 推荐使用document.visibilityState

具体方案如下:

// 首次加载页面去获取设置消息数
setHeadImgBadge(); 
// 添加监听事件
document.addEventListener("visibilitychange", function () { 
   
    if (document.visibilityState == "visible") { 
    
    	//页面激活的时候再次获取设置消息数
        setHeadImgBadge();
    }
}, false);

按照上面的例子,每次新进入页面就去获取设置最新的消息数,当此页面再次被激活(用户切换到此标签页)的时候再去获取设置最新的消息数,就能保证用户看到的消息数永远是正确的了,而且不会存在定时器不断获取设置的问题,还能减轻服务器端压力。

参考:

  1. https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilityState
  2. https://www.w3.org/TR/page-visibility/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150109.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月18日 下午7:46
下一篇 2022年6月18日 下午8:00


相关推荐

  • 集合和数组相互转换[通俗易懂]

    集合和数组相互转换[通俗易懂]集合转数组【强制】使用集合转数组的方法,必须使用集合的toArray(T[]array),传入的是类型完全一样的数组,大小就是list.size()。说明:使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址;如果数组元素个数大于实际所需,下标为[list.size()]的数组元素将被置为…

    2022年6月29日
    29
  • 双曲线和直线联立公式_2.直线与圆锥曲线位置关系:用联立法.联立直线和圆锥曲线的方程.消去 y (或x).得到方程(或).然后用判别式.判定直线与圆锥曲线相交(若是双曲线或抛物线.要讨论的系数为0的情…

    双曲线和直线联立公式_2.直线与圆锥曲线位置关系:用联立法.联立直线和圆锥曲线的方程.消去 y (或x).得到方程(或).然后用判别式.判定直线与圆锥曲线相交(若是双曲线或抛物线.要讨论的系数为0的情…一 选择题 1 5BBAB 文 B 理 A6 10ADCBC11 12 文 B 理 DA6 A 提示 设 则表示点与点 0 0 连线的斜率 当该直线 kx y 0 与圆相切时 取得最大值与最小值 圆心 2 0 由 1 解得 的最大值为 11 文 B11 文 A 提示 抛物线的焦点为 F 1 0 作 PA 垂直于准线 x 1 则 PA PF 当 A P Q 在同一条直线上时 PF

    2026年3月17日
    2
  • 41.XDMA寄存器详解5-H2C SGDMA/C2H SGDMA寄存器组剖析

    41.XDMA寄存器详解5-H2C SGDMA/C2H SGDMA寄存器组剖析目录1.上节回顾2.H2CSGDMA寄存器组2.1H2CSGDMA标识寄存器2.2H2CSGDMA描述符基地址寄存器2.3H2CSGDMA邻接描述符数量寄存器2.4H2CSGDMA描述符信用寄存器3.C2HSGDMA寄存器组4.下节内容1.上节回顾上节我们讲述了ConfigBlock寄存器组,我们今天来看H2CSGDMA/C2HSGDMA寄存器组,如下。H2CSGDMA/C2HSGDMA寄存器组主要是用来描述每个通道DMA描述符相关的一些

    2025年6月23日
    5
  • JVM成神之路-类加载机制-双亲委派,破坏双亲委派

    概述概念虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接时候用的Java类型。类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析统称为连接上图中,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须严…

    2022年4月16日
    38
  • springboot集成Thymeleaf(一)

    springboot集成Thymeleaf(一)传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了。SpringBoot支持如下页面模板语言Thymeleaf FreeMarker Velocity Groovy JSP …………其中Thymeleaf是SpringBoot官方所推荐使用的,接下来说说Thymeleaf使用。一、特点动静结合: 1、Thym…

    2022年6月13日
    33
  • Java语言冒泡排序详解

    Java语言冒泡排序详解基于很多同学在面试的过程中被问到一些基础的算法,导致整个面试过程不理想,而基础的算法和数据结构往往都是一些大公司任职的基本要求,这也严重影响拿offer的成功率。接下来的一段时间我将陆续对一些简单的基础的算法和数据结构进行详细说明。我将从排序算法说起,下面从冒泡排序开始说起。排序结果:数据从小到大。首先说一下冒泡排序的思想:每次比较从第一个数据开始,数据两两比较,如果左边数据比右边数据大,则交换左右

    2022年6月20日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号