当前位置: 首页 > news >正文

切换网页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秒。然后切换标签,随便去做一些其他事情。然后再切换回来看一下。要达到的效果是:在切换回来之前,不能继续执行。再切换回来之后呢,必须得继续执行,那么效果就达到了。我们来看一下:

 

相关文章:

切换网页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…...

基于pytesseract的OCR图片识别

简介 pytesseract是基于谷歌的tesseract的OCR包&#xff0c;支持识别一些简单的数字、字母、中文。 安装 安装引擎 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 一般是Windows 64位系统最新版&#xff1a; 如果要识别中文&#xff0c;注意选中中文…...

Docker_指令篇

Docker 的常用指令 1. 启动docker systemctl start docker2. 关闭docker systemctl stop docker3. 重启docker systemctl restart docker4. 设置自启动 systemctl enable docker5. 查看运行状态 systemctl status docker6. 查看帮助命令 docker pull --help7. 查看镜像 …...

HAL_UART_Transmit()函数用法

HAL_UART_Transmit函数用法 HAL_UART_Transmit()是 HAL 库中的一个函数&#xff0c;用于向指定的串口发送数据。它的函数原型如下: HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)其中各参数的含…...

OpenCV一个简单的摄像头调用与关闭

在使用OpenCV&#xff08;Open Source Computer Vision Library&#xff09;进行摄像头调用与关闭时&#xff0c;通常使用cv2.VideoCapture()函数来调用摄像头&#xff0c;并通过适当的方式关闭它。 调用摄像头 首先&#xff0c;需要导入OpenCV库&#xff08;通常简写为cv2&a…...

深度学习5 神经网络

生物神经网络是指人的大脑&#xff0c;这是人工神经网络的技术原型。根据生物神经网络的原理&#xff0c;人们用计算机复现了简化的神经网络。当然&#xff0c;人工神经网络是机器学习的一大分支。 1.基本组成 1.1神 经 元 神经元是神经网络的基本组成。激活函数又称作激励函…...

js中! 、!!、?.、??、??=的用法及使用场景

js中! 、 !. 、!、?.、.?、??、??的用法及使用场景 !!!?.??????、?? 区别 !. &#xff08;ts&#xff09;注意 ! (非空断言符号) 用于取反一个布尔值或将一个值转换为布尔类型并取反 const a true; const b false; const value !a; // false const value !…...

嵌入式面试高频八股文面试题及参考答案

目录 什么是嵌入式系统?请简要描述其特点。 请解释实时操作系统(RTOS)的概念。 请列举几种常见的嵌入式操作系统。 请解释中断、异常和竞态条件在嵌入式系统中的作用。 什么是死锁?请举例说明如何避免死锁的发生。 请解释进程和线程的区别。 请解释同步和互斥的概念…...

前端练习小项目——方向感应名片

前言&#xff1a;在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了&#xff0c;本篇文章所讲的小项目为——方向感应名片 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习之前&#xff0c;先让我们看一…...

【Vim】为什么程序员喜欢用 Vim

1. Vim介绍 Vim是一款高度可配置的文本编辑器&#xff0c;它被设计成作为一个工具&#xff0c;可以非常高效地进行文本编辑工作。以下是关于Vim的一些基本介绍&#xff1a; 历史&#xff1a;Vim 是 Vi 文本编辑器的改进版&#xff0c;最初由布莱姆米勒&#xff08;Bram Moole…...

stm32h743 NetXduo 实现http server CubeIDE+CubeMX

在这边要设置mpu的大小,要用到http server,mpu得设置的大一些 我是这么设置的,做一个参考 同样,在FLASH.ld里面也要对应修改,SECTIONS里增加.tcp_sec和 .nx_data两个区,我们用ram_d2区域去做网络,这个就是对应每个数据在d2区域的起点。 在CubeMX里,需要用到filex、dhc…...

ubuntu服务器部署vue springboot前后端分离项目

上传构建好的vue前端文件 vscode构建vue项目&#xff0c;会生成dist目录 npm run build在服务器root目录新建/projects/www目录&#xff0c;把dist目录下的所有文件&#xff0c;上传到此目录中 上传ssl证书 上传ssl证书到/projects目录中 配置nginx 编辑 /etc/nginx/site…...

【python】pandas报错:UnicodeDecodeError详细分析,解决方案以及如何避免

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

FlinkModule加载HiveModule异常

HiveModule这个模块加载不出来 加在不出来这个模块&#xff0c;网上查说是要加下面这个依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-hive_${scala.binary.version}</artifactId><version>${flink.…...

计算机硬件---如何更新自己电脑的BLOS

1找官网 例如“我使用的是HP&#xff08;惠普&#xff09;品牌的电脑”我只需要在浏览器上搜索“惠普官网”或“惠普-blos更新” 就可以看到&#xff0c;来自官网中更新blos的信息 2.有些品牌要查序列号该怎么办呢&#xff1f; 有许多方法可以查询&#xff0c;例如&#xf…...

AI算法17-贝叶斯岭回归算法Bayesian Ridge Regression | BRR

贝叶斯岭回归算法简介 贝叶斯岭回归&#xff08;Bayesian Ridge Regression&#xff09;是一种回归分析方法&#xff0c;它结合了岭回归&#xff08;Ridge Regression&#xff09;的正则化特性和贝叶斯统计的推断能力。这种方法在处理具有大量特征的数据集时特别有用&#xff…...

唯众物联网综合实训台 物联网实验室建设方案

物联网综合实训装置 物联网工程应用综合实训台是我公司针对职业院校物联网行业综合技能型人才培养&#xff0c;综合运用传感器技术、RFID技术、接口控制技术、无线传感网技术、Android应用开发等&#xff0c;配合实训台上的433M无线通信设备、ZigBee节点、射频设备、控制设备、…...

深入浅出 Vue.js:从基础到进阶的全面总结

深入浅出 Vue.js&#xff1a;从基础到进阶的全面总结 Vue.js 是一个用于构建用户界面的渐进式框架。它不仅易于上手&#xff0c;还能通过其强大的生态系统支持复杂的应用开发。本文将从基础到进阶&#xff0c;全面总结 Vue.js 的核心概念、常用技术和最佳实践&#xff0c;并提…...

路网双线合并单线——ArcGISpro 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…...

邮箱验证码功能开发

该文章用于记录怎么进行邮箱验证码开发。 总所周知&#xff0c;我们在某些网站进行注册的适合总是会遇到什么填写邮箱&#xff0c;邮箱接收验证码&#xff0c;验证通过后才可以继续注册&#xff0c;那么这个功能是怎么实现的呢&#xff1f; 一&#xff0c;准备工作 1.1 邮箱…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...