[js] 页面可见性API 监测用户切屏

news/2024/10/5 9:21:37

Page Visibility API

在做考试系统或者网课系统的时候,通常需要监测用户是否隐藏了当前标签页在看其它页面。

Page Visibility API提供了一个事件和两个状态来监测页面可见性,可以用它来判断用户是否切屏。

visibilitychange

这个事件会在页面可见性变化时触发。(隐藏时、打开时)

// 使用 addEventLisitener
document.addEventListener('visibilitychange', (e)=>{console.log('visibilityState: ', document.visibilityState);
});// 或者 onvisibilitychange
document.onvisibilitychange = function(){console.log('visibilityState: ', document.visibilityState);
}

document.visibilityState

这个变量有3种值:

  • hidden

    • 浏览器被最小化了;
    • 浏览器打开,但是当前看的是其它标签页;
    • 这个标签页要被卸载了(unload);
  • visible

    • 当前正在看标签页;

    • 当前浏览器处于最小化,但是正在预览页面内容;

      如下图,这种把鼠标移到任务栏图标上的行为也会触发 visibilitychange 事件,且 document.visibilityState 变为 visible。

      image-20240830191250009
  • prerender:页面即将或正在渲染,处于不可见状态。

document.hidden

这个状态仅用于兼容,平时应使用document.visibilityState。当document.visibilityStatevisible时,document.hiddenfalse,其余情况下都为 true

iframe

当页面中通过 iframe 嵌入子文档时,iframe节点的display:none;并不会触发子文档的 visibilitychange事件。

子文档的可见性和父文档的可见性保持一致。

示例场景

考试违规切屏次数统计

let violationCount = 0;
const maxViolations = 3; // 设定最大违规次数document.addEventListener('visibilitychange', function() {if (document.visibilityState === 'visible') {console.log('考试页面重新可见');} else {violationCount++;console.log(`考试页面不可见,违规次数: ${violationCount}`);// 如果违规次数达到上限,触发结束考试的逻辑if (violationCount >= maxViolations) {endExam();} else {alert(`警告:请勿离开考试页面!您已违规 ${violationCount} 次,最多允许 ${maxViolations} 次违规。`);}}
});function endExam() {alert('您已多次离开考试页面,考试结束!');// 在此添加结束考试的逻辑,例如提交答案并退出考试界面submitExam();
}function submitExam() {// 模拟提交考试结果console.log('考试结果已提交');// 重定向到考试结束页面或显示结束信息window.location.href = '/exam-finished';
}// 模拟考试开始
console.log('考试开始,请勿离开页面。');

"被动"网课学习

document.addEventListener('visibilitychange', function() {if (document.visibilityState === 'visible') {video.play();	// 视频播放} else {video.pause();	// 视频暂停}
});

如何避免逃课?

下面的策略可以提高逃课的门槛(用户可能会编写脚本来让视频在页面不可见的情况下也能播放),但是只能说是防君子不防小人。

  1. setInterval定时检查visibilityState,缺点是定时器在页面不可见的情况下执行频率和设定的时间可能不一样。

    const videoElement = document.querySelector('video');function checkVisibility() {if (document.visibilityState === 'visible') {if (videoElement.paused) {videoElement.play(); // 播放}} else {if (!videoElement.paused) {videoElement.pause(); // 暂停}}
    }// 初始检查页面可见性并启动定时器
    checkVisibility();
    setInterval(checkVisibility, 1000); // 每秒检查一次页面可见性
    
  2. 监听视频元素的play事件,视频开始播放的时候visibilityState应为visible,否则暂停播放。

    video.addEventListener('play', function() {if (document.visibilityState !== 'visible') {videoElement.pause();	// 视频暂停}
    });
    
  3. 冻结相关的属性和方法,避免用户重写。

    Object.defineProperty(document, 'visibilityState', {configurable: false,enumerable: true,writable: false,value: document.visibilityState
    });Object.defineProperty(document, 'hidden', {configurable: false,enumerable: true,writable: false,value: document.hidden
    });
    

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

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

相关文章

[Paper Reading] ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models

ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models link 时间:23.11 机构:Standford TL;DR 提出ControlNet算法模型,用来给一个预训练好的text2image的diffusion model增加空间条件控制信息。作者尝试使用5w-1M的edges/depth/segmentation/pose等信…

结点电压法

如图,流过 1Ω电阻的电流是 (1+1/4)/(1+1/4+1/4)

【SpringBoot】分析 SpringBoot 中的扩展点

1 前言 SpringBoot 它给我们留了很多的扩展点,这节我们就看看都有哪些(有的扩展点是基于 Spring 的,有的我就不具体强调到底是 SpringBoot 还是 Spring 的噢)。 另外每一种扩展点我们都从两个方面来看: 入口时机:入口就是 SpringBoot 解析或者寻找你自定义的类的时机 执…

智能选择:如何筛选合适项目管理软件?

国内外主流的 10 款项目管理系统对比:PingCode、Worktile、Teambition、明道云、泛微E-cology、Asana、Trello、Monday.com、ClickUp、Wrike。在项目管理的世界里,选择合适的管理工具似乎是一个令人头疼的问题。你是否经常在众多选项中感到迷茫,不知道哪一个系统能真正提升你…

【整理】【信息收集】web渗透测试

一、WAF探测1.1 什么是WAF1.2 WAF常见的部署方式:1.3 WAF的作用1.4 如何触发waf1.5 WAF的分类1.6 如何探测WAF二、操作系统识别三、Git信息收集3.1 Git信息泄露原理3.2 github搜索技巧3.3 Git信息泄露利用方式原创 LULU 红队蓝军一、WAF探测 1.1 什么是WAF Web应用程序防火墙(…

RouteLLM:通过智能查询路由优化 AI 响应

在当今人工智能驱动的世界中,优化人工智能的使用至关重要。不同的 AI 系统 在能力和成本上各不相同,因此需要智能管理解决方案。RouteLLM 是一个创新 的框架,旨在动态地将用户查询路由到最合适的 AI 模型,确保成本效益和高质 量的响应。 什么是 RouteLLM? RouteLLM 作为 A…

vue3下拉菜单点击之后缓慢展开与缓慢关闭

利用 max-height 来实现下拉菜单的缓慢展开和关闭效果。通过设置一个固定的 max-height 值以及过渡效果,可以让菜单在展开和关闭时产生动画效果。 <template> <div class="dropdown"><div class="selected" @click="toggleDropdown&q…