document.visibilityState 和 visibilitychange 事件结合优化性能

一般在项目中,用户登录之后有消息通知的时候,用户头像上面会有一个消息数来提醒用户,但这个数字要保证新打开一个页面的时候是正确的,当切换浏览器的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/
### 关于 `document.visibilityState` 始终为 `visible` 的原因 `document.visibilityState` 是 HTML5 中的一个特性,用于表示当前文档的可见状态。它的可能值包括 `visible`、`hidden` `prerender`。如果发现 `document.visibilityState` 始终返回 `visible`,可能是由于以下几个原因之一: 1. **页面未失去焦点** 如果浏览器窗口始终保持活动状态或者用户的鼠标键盘输入一直集中在该窗口上,则 `visibilityState` 将不会切换到其他状态[^4]。 2. **测试环境限制** 在某些开发环境中(例如调试器或特定框架),可能会模拟出一种行为使得 `visibilityState` 不会正常变化。这通常发生在本地运行的应用程序中[^5]。 3. **事件监听器缺失** 即使页面实际进入了后台或其他标签页被激活,如果没有正确设置 `visibilitychange` 事件监听器来捕获这些更改,开发者也可能误以为其状态固定不变[^6]。 #### 正确使用方法 为了确保能够检测到真正的可见性变化并更新相应的逻辑,可以按照以下方式进行实现: ```javascript // 添加 visibilitychange 事件监听器 document.addEventListener('visibilitychange', function () { console.log(`Visibility state changed to: ${document.visibilityState}`); if (document.visibilityState === 'hidden') { // 执行当页面不可见时的操作 console.log('Page is now hidden.'); } else if (document.visibilityState === 'visible') { // 执行当页面恢复可见时的操作 console.log('Page is now visible again.'); } }); ``` 上述代码片段展示了如何通过绑定 `visibilitychange` 事件来实时监控文档的状态转换过程,并据此采取适当措施[^7]。 --- ### 提供的相关工具链说明补充 对于涉及复杂数据处理的任务来说,利用现代化编程生态中的多种库是非常必要的。比如提到过的几个重要组件: - 使用 **Jupyter Notebook** 可以方便地探索性可视化数据分析流程; - 结合 **LangChain** 实现自然语言理解能力扩展; - 利用 **Elasticsearch Python Client** 构建高效全文检索解决方案; 以上技术栈的选择有助于构建更加智能化的信息管理系统[^8]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值