vue 监听是否切屏和开启小窗

news/2024/4/20 16:18:37/文章来源:https://blog.csdn.net/xc9711/article/details/130283328

前言

在做自己的项目的时候有用到判断设备是否有切屏,一般用的多的地方就是考试系统,切屏我们都知道,一般可以很容易的进行监控,只不过当开启了小窗的时候,之前一直没有解决办法,而现在则通过监控切屏和小窗来教大家如何进行设置监听这两种方式。

切屏监控

方法一

Vue框架提供了一个$hidden属性,可以用来判断当前页面是否被隐藏(如在后台标签页)。以下是具体代码:

export default {data () {return {isHidden: false // 页面是否被隐藏(初始值为false)};},created () {// 监听document visibilityState变化事件(用于监听页面是否被隐藏)document.addEventListener('visibilitychange', this.onVisibilityChange);},destroyed () {// 解除监听事件document.removeEventListener('visibilitychange', this.onVisibilityChange);},methods: {// 监听页面是否被隐藏onVisibilityChange () {this.isHidden = document.hidden;if (this.isHidden) { // 当前页被隐藏// 执行相关操作} else { // 当前页被打开// 执行相关操作}}}
};

以上代码在Vue组件中,利用$hidden属性来判断当前页面是否被隐藏,并根据该取值来执行相应操作。需要注意的是,在关闭组件前必须解除监听事件以避免内存泄漏。

方法二

可以利用Vue的activated和deactivated生命周期函数来实现判断页面是否因为切换而隐藏。

具体代码如下:

export default {data() {return {isActive: false, // 标志页面是否处于活动状态isHidden: false, // 标志页面是否处于隐藏状态};},activated() {this.isActive = true;if (this.isHidden) {console.log('页面由隐藏状态切换到了活动状态');// TODO:执行需要在页面由隐藏状态切换到活动状态时的逻辑}this.isHidden = false;},deactivated() {this.isActive = false;if (!this.isHidden) {console.log('页面由活动状态切换到了隐藏状态');// TODO:执行需要在页面由活动状态切换到隐藏状态时的逻辑}this.isHidden = true;},
};

在代码中,我们定义了两个变量isActive和isHidden,分别代表页面是否处于活动和隐藏状态。

当activated生命周期函数被触发时,我们将isActive设置为true,并且如果此时页面之前处于隐藏状态,则说明页面是因为切换而隐藏的,此时我们可以执行一些需要在页面由隐藏状态切换到活动状态时的逻辑。

同理,当deactivated生命周期函数被触发时,我们将isActive设置为false,并且如果此时页面之前处于活动状态,则说明页面是因为切换而隐藏的,此时我们可以执行一些需要在页面由活动状态切换到隐藏状态时的逻辑。

同时,我们还需要根据activated和deactivated生命周期函数的调用顺序来设置isHidden的值,以便准确标志页面是否处于隐藏状态。

小窗监控

方法一

一开始我是没有头绪的,但是现在实际上是可以通过监听视窗和实际窗口比较大小,如果一直说明没有变成小窗,否则说明开启了小窗,那么就可以通过监控它来添加我们需要的逻辑。

Vue 本身并没有直接提供监测设备是否开启小窗口的 API,但可以通过 JavaScript 监听 window 对象的 resize 事件变化并通过 document.documentElement.clientHeight 和 document.documentElement.clientWidth 获取当前视口宽高,进而推断出设备是否开启小窗口。

具体的实现方法如下:

在 Vue 组件中监听 resize 事件

html
<template><div>{{ status }}</div>
</template><script>
export default {data() {return {status: ''};},created() {window.addEventListener('resize', this.check);},beforeDestroy() {window.removeEventListener('resize', this.check);},methods: {check() {if (document.documentElement.clientHeight < window.innerHeight) {this.status = '开启小窗口';} else {this.status = '非小窗口';}}}
};
</script>

在上面的代码中,我们使用了 window 对象的 resize 事件,并在组件创建时添加该监听器。check() 方法会在触发 resize 前后检查视口大小并输出结果。

根据视口大小是否变化判断设备状态
在上述 check() 方法中,我们使用了一些计算方式来判断设备状态。主要思路是通过比较视口高度和 window 高度的大小,如果视口高度小于 window 高度,则认为设备处于小窗口模式,否则为非小窗口模式。

总之,这是一种可行的方式来检测设备是否开启小窗口,但需要注意的是,不同的设备及浏览器可能会有不同的反应速度,因此我们需要在具体情况中进行适当的测试和调整。

方法二

除了以上方法,还可以通过matchMedia进行查询
以下代码是利用媒体查询(Media Query)来判断是否开启小窗的方法,与Vue框架无关:

// 创建一个媒体查询实例
const mediaQuery = window.matchMedia('(max-width: 768px)');// 监听媒体查询变化并执行回调函数
mediaQuery.addListener(function (mq) {if (mq.matches) { // 当前窗口大小满足小窗条件// 执行相关操作} else { // 当前窗口大小不满足小窗条件// 执行相关操作}
});

以上代码中,我们使用matchMedia方法来创建一个媒体查询实例,并将小窗条件作为参数传入。之后,通过addListener方法来监听该实例的变化,根据当前窗口大小是否满足小窗条件来执行相应操作。

需要注意的是,在使用该方法时,必须保证所设置的媒体查询条件与CSS样式表中所定义的一致,否则可能导致判断出错。

方法三

还可以通过操作DOM元素判断是否开启小窗,
以下代码是通过检测DOM元素宽度来判断是否开启小窗的方法:

export default {data () {return {isSmallScreen: false // 是否开启小窗(初始值为false)};},mounted () {// 初次加载组件时判断初始窗口大小this.checkWindowSize();},methods: {// 检查当前窗口尺寸并根据该值更新isSmallScreen变量取值checkWindowSize () {const elementWidth = document.documentElement.clientWidth;if (elementWidth <= 768) {this.isSmallScreen = true;} else {this.isSmallScreen = false;}}}
};

以上代码中,我们使用checkWindowSize函数来检查当前窗口宽度,并根据该值来更新isSmallScreen变量的取值。需要注意的是,在初次渲染组件时也必须执行一次checkWindowSize函数以确保页面显示正确。

该方法相对于利用媒体查询或监控屏幕大小变化的方法而言,更加精准,但不可避免地需要操作DOM,因此需要注意效率和性能问题

结语

以上就是实现vue监听切屏和开启小窗的过程

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

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

相关文章

天梯赛 L3-025 那就别担心了

原题链接&#xff1a; PTA | 程序设计类实验辅助教学平台 题目描述&#xff1a; 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题&#xff0c;其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”&#xff0c;即从某个命题出发的所有推理路径都会将结…

用java 实现二叉树创建

二叉树是数据结构中的一个重要的概念&#xff0c;二叉树的概念最早由 Linus Torvalds在1958年提出。他给出了一个树形数据结构&#xff0c;可以用来存储二叉树。每个节点的左子树和右子树都是空&#xff0c;中间层是子树。在一个给定的空间中&#xff0c;每一个节点都有两个左右…

相机雷达联合标定cam_lidar_calibration

文章目录 运行环境&#xff1a;1.1 ROS环境配置1&#xff09;工作空间创建和编译2&#xff09;官方数据集测试环境 2.1 在线标定1&#xff09;数据类型2&#xff09;标定板制作3&#xff09;配置文件4&#xff09;开始标定5&#xff09;完整实现步骤 3.1 python版本选择3.2 rvi…

4年的测试工程师,你遇到过自身瓶颈期吗?又是怎样度过的?

从毕业到现在已经快4年啦&#xff0c;一直软件测试行业混迹。我不是牛人&#xff0c;但是自我感觉还算是个合格的测试工程师&#xff0c;有必要写下自己将近4年来的经历&#xff0c;给自我以提示&#xff0c;给刚入行的朋友提供点参考。 貌似这一点适应的行业最广&#xff0c;…

Java——二叉搜索树的后序遍历序列

题目链接 牛客在线oj题——二叉搜索树的后序遍历序列 题目描述 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。 数据范围&#xff1a; 节点数量 0≤n≤1000 …

自习室管理系统的设计与实现(论文+源码)_kaic

摘要 近年来&#xff0c;随着高校规模的逐步扩大&#xff0c;学生对高校自习室座位的需求也在不断增加。然而&#xff0c;一些高校仍然采用人工管理学院自习室座位&#xff0c;这大大降低了管理效率。显然&#xff0c;开发一个成本低、占用资源少、能提高高校自习室座位管理效率…

Junit 5 如何使用 Guice DI

Guice 是一个依赖注入的小清新工具。 相比 Spring 的依赖管理来说&#xff0c;这个工具更加小巧&#xff0c;我们可以在测试中直接使用。 Junit 5 在 Junit 中使用就没有那么方便了&#xff0c;因为 Junit 没有 Guice 的注解。 你需要手动写一个类&#xff0c;在这个类中&a…

ABeam Insight | 智能制造系列(6):虚拟/增强现实(VR/AR)×智能制造

虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;的概念早在20世纪60年代就被提出&#xff0c;但由于当时的技术水平无法满足相关应用的需求&#xff0c;这些概念并没有引起广泛关注。直到近年来随着计算机技术的飞速发展&#xff0c;虚拟现实和增强现…

nodejs+vue 文旅旅游公司智能管理OA系统

通过本次设计&#xff0c;让我学到了更多的知识&#xff0c;而且在设计中会有一些问题出现&#xff0c;最后通过查阅资料和在老师和同学的帮助下完成了系统的设计和开发&#xff0c;使得这次系统的开发非常的有意义。同时通过这次系统的设计也让我明白了自己在哪方面有不足&…

【PWN刷题__ret2text】[CISCN 2019华北]PWN1

ret2text~ 前言 依旧是简单的ret2text 一、checksec查看 No canary found 没有开启栈溢出保护 二、IDA反汇编 双击进入func() 发现后门函数system("cat/flag")&#xff1b;根据语义&#xff0c;函数提供了修改v1&#xff0c;判断v2是否等于11.28125&#xff0c;如…

项目沟通管理5大技巧 第4个很重要

1、充分使用twitter管理沟通模型 项目沟通会议可以充分使用witter的管理沟通模型&#xff0c;提高会议沟通效率。使用此模型&#xff0c;主要是有三步&#xff1a; 第一步&#xff1a;倾听&#xff0c;项目经理需要保持中立的立场&#xff0c;不先表态&#xff0c;让团队成员畅…

SAP ABAP 使用SICF发布HTTP API接口

一、SE24创建类&#xff1a;Z_HCX_HTTP 1、创建类&#xff1a; 2、切换到接口&#xff08;interface&#xff09;页签&#xff0c;输入IF_HTTP_EXTENSION &#xff0c;回车。切换到方法&#xff08;method&#xff09;页签&#xff0c;双击IF_HTTP_EXTENSION~HANDLE_REQUEST进…

STM32 产生随机数方式

STM32 产生随机数方式 C语言的stdlib.h库里的srand(unsigned seed)和rand(void)函数&#xff0c;可以配合产生伪随机数。其中srand(seed)产生算法种子&#xff0c;再由rand()通过算法产生随机数&#xff0c;产生的随机数在宏定义RAND_MAX范围内。如果seed不变&#xff0c;则产…

URL 转为QR code(二维码)

推荐一个良心的网站&#xff0c;能够免费地将url、text编码为二维码&#xff0c;而且还能设计logo、颜色等。 https://www.the-qrcode-generator.com/ 如下图&#xff1a; 可以自己定义logo、颜色&#xff1a; 还能查看扫描历史等统计信息&#xff1a; 上述所有功能都是免…

【虚拟仿真】Unity3D打包WEBGL后播放视频(VideoPlayer组件)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章实现Unity3D打包WEBGL后播放视频&#xff0c;如下图所…

VGG网络与中间层特征提取

1. 背景 VGG是常见的用于大型图片识别的极深度卷积网络&#xff0c; 这里主要介绍VGG网络预测在ImageNet数据集上的训练及预测。 2. ImageNet图像数据集简介 ImageNet包含了145W张224*224像素的三通道彩色图像数据集&#xff0c;图像划分为1000个种类。其中训练集130W张&…

Observability:添加免费和开放的 Elastic APM 作为 Elastic 可观察性部署的一部分 - 8.x

作者&#xff1a;David Hope 在最近的一篇博文中&#xff0c;我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面&#xff0c;我们将介绍你需要做些什么来扩展你的部署&#xff0c;这样你就可以开始免费从应用程序性能监控&#xff08;APM&#xff09;或跟踪集群…

可算是熬出头了,测试4年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

为什么你永远不应该在CSS中使用px来设置字体大小

代码部署后可能存在的BUG没法实时知道&#xff0c;事后为了解决这些BUG&#xff0c;花了大量的时间进行log 调试&#xff0c;这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。 在Josh Collinsworth的博客文章“永远不要用px作为字体大小”中&#xff0c;作者讨论了为什么不…

Ceph入门到精通-Ceph 编排器简介

第 1 章 Ceph 编排器简介 作为存储管理员&#xff0c;您可以将 Ceph 编排器与 Cephadm 实用程序搭配使用&#xff0c;能够发现设备并在 Red Hat Ceph Storage 集群中创建服务。 1.1. 使用 Ceph Orchestrator Red Hat Ceph Storage Orchestrators 是经理模块&#xff0c;主要…