切换网页visibilitychange,的升级版实现

目录

1 需求场景

2 用到的技术

3 日常检测方法

4 一个有意思的场景

5 升级版实现一 

5.1 新建 /utils/browser.js

5.2 项目业务组件中使用

6 升级版实现二

6.1 安装js-tool-big-box工具库

6.2 引入 browserBox 对象 

6.3 以控制累加定时器为例

6.4 查看定时器效果


1 需求场景

我们做前端开发,会有这样一种场景。比如说,网页有个setInterval做的一个轮播图,然后我们切换浏览器的标签呢,继续去做一件其他的事情。当做完这件事的时候呢,再切换回来,轮播图就会像疯了一样的转动几次,然后又恢复正常。

又或者呢,我们希望网页中的视频,在浏览器最小化的时候呢,视频就停止播放。当浏览器再被切换回屏幕最上层的时候呢,视频继续播放。

2 用到的技术

这里,所用到的技术呢,就是visibilitychange。visibilitychange是一个事件,用于监听当前页面的可见性状态是否发生改变。这个事件通常用于处理当用户切换到另一个标签页或者最小化浏览器窗口时的情况。

比如用户将浏览器切换到另一个标签页的时候,或者是将网页窗口最小化的时候,或者是移动端APP嵌入的H5网页,然后用户将APP切换到后台运行的时候,浏览器都会监听到这个事件。

3 日常检测方法

比如我们要监测一个视频,当浏览器网页最小化的时候,视频就停止播放。当浏览器被切换恢复的时候,视频就继续播放。以一个Vue项目为例:

<script>

export default {
  name: 'PagePlay',
  data () {
    return {
      canPlay: false,
    }
  },
  created() {
    
  },
  mounted() {
    document.addEventListener('visibilitychange', function() {
      if (document.hidden) {
        // 页面不可见,视频停止播放
        this.canPlay = false;
      } else {
        // 页面可见,视频继续播放
        this.canPlay = true;
      }
    });

  }
}
</script>

4 一个有意思的场景

有一段时间的工作呢,就是通过网页帮助叔叔们播放监控视频。有一次,有人提出要来看一个加油站的监控视频,要播放前一天晚上的。为什么要看视频呢,是老板提出的。老板一般下午就会回家去,让一个工人在加油站上班,给晚上需要加油的用户们加油。但老板第二天去了加油站,发现,这个工人还在呼呼大睡,而且外面的油洒了一地。老板就问工人,咋回事,咋晚上还把油喷洒到地上了呢。工人说,不可能啊,昨晚有人来加油,其中一个穿着红裙子的客户,让给加油,还给了我现金。但工人从兜里拿出来的时候却是2张纸。后来我们就开始播放那天的视频。

视频由于需要对照着一些数据来看,所以需要时不时的切换,切换后就需要暂停,再次打开的时候呢,就需要继续播放,这就用到了这个 visibilitychange 监听技术。

后来看了几遍视频后才发现,嗨,原来是工人睡懵了,晚上他自己从屋里走出来,和空气说话,然后对着地上加油。这件事就这么过去了。

5 升级版实现一 

上面第3步的实现没有问题,但这样写太初级了,我们如果有多处使用,就必须要每个业务组件里都去实现。我们必须把他添加到项目的公共方法中去,所以就需要新建一个 utils 目录。这样,公共方法和业务组件内的实现可以是:

5.1 新建 /utils/browser.js

新建目录后,我们写上公共方法

const getPageVisibility = function(callback) {
  document.addEventListener('visibilitychange', function() {
      const isPageVisible = !document.hidden;
      callback(isPageVisible);
  });       
}

export default getPageVisibility ;

5.2 项目业务组件中使用

到了业务组件中可以这样使用

<script>
import getPageVisibility from '../utils/browser';

export default {
  name: 'PageIndex',
  data () {
    return {
      canPlay: false,
    }
  },
  created() {
    
  },
  mounted() {
    getPageVisibility((isVisible) => {
      if (isVisible) {
        this.canPlay = true;
      } else {
        this.canPlay = false;
      }
    });
  },
}
</script>

6 升级版实现二

但是第5步这样实现呢,还是有问题的。你换个项目呢,还得把代码拷过去;人家问你咋解决的,你跟人家说去哪个哪个项目里找吧,在那里呢;所以啊,还是给大家推荐一个快捷高效的库,没错,js-tool-big-box。高效的前端开发,从js-tool-big-box开始。

6.1 安装js-tool-big-box工具库

执行安装命令

npm install js-tool-big-box

6.2 引入 browserBox 对象 

检测浏览器切换状态的公共方法,被放到了browserBox对象下面,可以快捷调用。

import { browserBox } from 'js-tool-big-box';

6.3 以控制累加定时器为例

例子中呢,我们就不单纯的操控一个变量了,那太简单了,我们操控一个定时累加器。

<template>
  <div class="box-404">
    <p>js-tool-big-box</p>
    <p>做功能更丰富的前端JS库</p>
    
  </div>
</template>

<script>
import { browserBox } from 'js-tool-big-box';

export default {
  name: 'Page404',
  data () {
    return {
      timer: null,
      number: 0,
    }
  },
  created() {
    
  },
  mounted() {
    this.startTimer();
    // 判断浏览器是否切出或者最小化
    browserBox.getPageVisibility((isVisible) => {
      if (isVisible) {
        this.startTimer();
      } else {
        window.clearInterval(this.timer);
        this.timer = null;
      }
    });
  },
  methods: {
    startTimer() {
      this.timer = setInterval(() => {
        this.number += 1;
        console.log('计时器数值:', this.number);
      }, 990)
    }
  }
}
</script>

6.4 查看定时器效果

上图中,我们先使定时器自己执行5秒。然后切换标签,随便去做一些其他事情。然后再切换回来看一下。要达到的效果是:在切换回来之前,不能继续执行。再切换回来之后呢,必须得继续执行,那么效果就达到了。我们来看一下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/801280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go 切片进行链式操作并支持泛型

背景&#xff1a; 由于团队不是专业级别的go开发人员&#xff0c;主开发还是java&#xff0c;用惯了java的lambda表达式特别是流式操作&#xff0c; 所以在用go语言时&#xff0c;发现切片处理起来比较麻烦&#xff0c;看看能不能支持类似流式操作&#xff0c;我这边就研究了下…

什么是STM32?嵌入式和STM32简单介绍

1、嵌入式和STM32 1.1.什么是嵌入式 除了桌面PC之外&#xff0c;所有的控制类设备都是嵌入式 嵌入式系统的定义&#xff1a;“用于控制、监视或者辅助操作机器和设备的装置”。 嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板&#xff0c;是一种专用的计算机系统。…

启动react 18.2.x项目报node错误

1、项目启动报错&#xff0c;node版本问题 可以考虑把node版本降低一点&#xff0c;我当时node版本是20.xx 后面我把本本降到16.13.1 2、tsconfig.json的飘红问题 这里提示的是这个字段已经不用了&#xff0c;建议删除该字段&#xff0c;所以删除该字段就好&#xff0c;其实…

[经典]Axrue部件库:Android系统部件

部件库预览链接&#xff1a;&#xff08;请与班主任联系获取文档&#xff09; 支持版本: Axrure RP 8 文件大小: 1200KB 模板目录 黑、白两种UI风格 每天 文档内容介绍 免费领取资料 “210630” 领取

JavaScript object 数据更新方法

https://andi.cn/page/621560.html

JS-11G1端子排静态时间继电器 约瑟JOSEF

JS-11G端子排静态时间继电器 系列型号&#xff1a; JS-11G1端子排静态时间继电器&#xff1b;JS-11G2端子排静态时间继电器; JS-11G3端子排静态时间继电器; JS-11G4端子排静态时间继电器; JS-11G5端子排静态时间继电器;JS-11G7端子排静态时间继电器; JS-11G9端子排静态时间…

沙袋装袋机的原理和特点_鼎跃安全

在现代工业和建筑领域&#xff0c;沙子等散状物料的包装是一个必不可少的环节。传统的手工包装方式效率低下且劳动强度大&#xff0c;而沙袋装袋机的出现则极大地提高了包装效率和质量。 一、沙袋装袋机的工作原理 沙子通过输送系统从储料仓输送到装袋机的料斗中。输送系统设计…

SpringBoot中动态注册Bean的方式

测试环境&#xff0c;本文源码 Java&#xff1a;8SpringBoot&#xff1a;2.5.14示例场景&#xff1a;动态注册ProxyServlet&#xff0c;间接实现类似于Nginx的反向代理功能 先理解如何实现动态注册 Bean 。 由于在 SpringBoot 中&#xff0c;先进行 Bean 的定义&#xff0c;…

道路巡检准确率优于90%,千寻驰观是怎么做到的?

在7月初落下帷幕的2024世界人工智能大会上&#xff0c;人形机器人十八罗汉齐聚现场&#xff0c;“百模大战”精彩开演&#xff0c;还有多种大模型在产业端应用和落地&#xff0c;AI浪潮席卷而来。千寻位置携北斗时空智能AI应用千寻驰观产品亮相大会&#xff0c;备受瞩目。 2024…

释放DOE的能量,快速确定最佳工艺设置,节省时间、成本和资源

您是否希望降低成本、提高生产效率&#xff0c;并最大限度地减少行业对环境的影响&#xff1f; 所有行业&#xff0c;尤其是钢铁、铝、水泥和石化等能源密集型行业&#xff0c;都面临着应对这些挑战的持续压力。供应链压力、可持续发展、严格的监管环境、日益增长的消费者预期…

在前端vue3 开发媒体查询代码 实现 响应式布局(js 和css 方式)

在上一篇文章中 我介绍了一下 媒体查询的知识以及概念 我只介绍了在html css3 中的使用方式以及书写 下面我来简单来演示一下 在vue3 中怎么使用这个 其实都一样的 只是.vue 的文件 我用的是ant-design-vue3 的前端web端框架 用这个来演示 一. css样式媒体查询 目前的框架 是…

mysql中的存储过程

存储过程的作用:有助于提高应用程序的性能。存储过程可以不必发送多个冗长的SQL语句 废话不说多&#xff0c;直接实操 ##实现num的相加 delimiter $$ CREATE PROCEDURE test1 () begindeclare num int default 0; -- 声明变量,赋默认值为0select num20;end $$ delimiter ; …

誉天教育与武汉晴川学院携手开展鸿蒙实训营,共筑鸿蒙生态新篇章!

在数字经济蓬勃发展的今天&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐步构建起一个开放、协同、共赢的生态体系。为了进一步推动鸿蒙生态的繁荣发展&#xff0c;培养更多具备鸿蒙原生应用开发能力的专业人才&#xff0c;誉天教育与武汉晴川学院强强联合&a…

聚类分析方法(三)

目录 五、聚类的质量评价&#xff08;一&#xff09;簇的数目估计&#xff08;二&#xff09;外部质量评价&#xff08;三&#xff09;内部质量评价 六、离群点挖掘&#xff08;一&#xff09;相关问题概述&#xff08;二&#xff09;基于距离的方法&#xff08;三&#xff09;…

内网服务器通过squid代理访问外网

一、背景 现在要对172.16.58.158服务器进行openssh升级操作,我用之前写好的升级脚本执行后,发现没有备份旧的ssh程序文件,然后还卸载了oenssl-devel,然后我发现其他服务器ssh该服务器失败。同时脚本执行时报错“ configure: error: *** zlib.h missing - please install first …

Modbus - 笔记

1 Modbus Poll/Slave 模拟器使用教程 Modbus Poll/Slave 模拟器使用教程_modbus poll 使用教程-CSDN博客 https://item.jd.com/67488830087.html 2 一文秒懂串口、COM口、TTL、RS-232、RS-485区别 一文秒懂串口、COM口、TTL、RS-232、RS-485区别_电平 3 串口的学习 http…

安灯系统在电力设备制造业中的应用效果

安灯系统作为面向制造业生产现场的专门应用软硬件系统&#xff0c;在电力设备制造企业中发挥着重要的作用。作为精益制造执行的核心工具&#xff0c;安灯系统为企业提供了快速联络生产、物料、维修、主管等部门的功能&#xff0c;以实时掌控和管理生产线状况&#xff0c;实现生…

FlashAttention3:“GEMM”就是比较快!

阅读文章之前请温习以下四篇文章&#xff0c;避免云里雾里&#xff1a; 轻松读懂FlashAttention上<矩阵分块加载&#xff0c;改写softmax算法> 轻松读懂FlashAttention下 轻松读懂FlashAttention-2<优化循环体&#xff0c;减少非矩阵运算> GPU的基础认知<GE…

绘制science研究区域概况图

Python绘制研究区域概况图&#xff1a; import numpy as np import matplotlib.pyplot as plt from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.io.shapereader import R…

【螺旋矩阵】python刷题记录

目录 题目&#xff1a; 思路&#xff1a; 上代码&#xff1a; 结果&#xff1a; 大佬题解&#xff1a; 思路&#xff1a; 代码&#xff1a; 结果&#xff1a; 题目&#xff1a; 这题 模拟 来做 思路&#xff1a; 方向转换&#xff1a;使用矩阵&#xff08;4个元素&…