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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决IE8下opacity属性失效问题[通俗易懂]

    解决IE8下opacity属性失效问题[通俗易懂]解决IE8下opacity属性失效问题

    2022年5月10日
    40
  • python中print的用法_Python中print用法里面% ,”%s 和 % d” 代表的意思

    python中print的用法_Python中print用法里面% ,”%s 和 % d” 代表的意思Python 编程里面 s 和 d 代表的意思 s 表示格化式一个对象为字符 d 整数 Hello s zhang3 Hello zhang3 d 33 33 s d ab 3 ab 3 字符 标记转换说明符的开始 在 的左侧放置一个字符串 格式化字符串 而右侧则放置希望格式化的值 s 表示格式化规则 1 splu

    2025年8月7日
    0
  • Java类加载,getClassLoader()

    Java类加载,getClassLoader()转自【java类加载的深入研究1】loadClass()的研究,IBM深入探讨Java类加载器类加载器基本概念顾名思义,类加载器(classloader)用来加载Java类到Java虚拟机中。一般来说,Java虚拟机使用Java类的方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载…

    2022年5月27日
    31
  • VS2010密钥(破解版可用)「建议收藏」

    VS2010密钥(破解版可用)「建议收藏」YCFHQ-9DWCY-DKV88-T2TMH-G7BHP转载于:https://www.cnblogs.com/ctou45/archive/2012/12/11/2812396.html

    2022年6月5日
    70
  • linux vim命令保存退出_vim退出命令

    linux vim命令保存退出_vim退出命令使用vim命令打开一个文件:例如,打开openwrt系统下的system配置文件vim/etc/config/system内容如下:configsystemoptionhostname’OpenWrt’optiontimezone’UTC’optionttylogin’0’optionlog_size’64’optionurandom_seed’0’configtimeserve

    2022年8月24日
    9
  • 剑指offer——二进制中1的个数(解释n & 0xFFFFFFFF)[通俗易懂]

    剑指offer——二进制中1的个数(解释n & 0xFFFFFFFF)[通俗易懂]题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解答如下:环境:python2.7.3正数的原码反码补码都一样负数的补码是其对应正数的反码加1这里需要弄清楚为什么python中负数需要和0xFFFFFFFF做与操作?在计算机中,所有的数字都是使用补码存储起来的。由于Python没有位数这个概念,所以得到二进制表示需要多一点操作,即将位数限制在32位,…

    2022年5月16日
    40

发表回复

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

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