前端简单实现校招笔试'作弊监听'功能

一、 监听你的页面活动

最近校招笔试如火如荼地开展。各种小心思都浮上来了:"我就查一道".小心翼翼按了一下tab切换(mac用三爪),Document.visibilityState开始工作了."监测到你切换页面,超过xx次将影响你的成绩(希望你自重)"

二、 visibilityState

描述
visible 此时页面内容至少是部分可见. 即此页面在前景标签页中,并且窗口没有最小化.
hidden 此时页面对用户不可见. 即文档处于背景标签页或者窗口处于最小化状态,或者操作系统正处于 ‘锁屏状态‘ .
prerender 页面此时正在渲染中, 文档只能从此状态开始,永远不能从其他值变为此状态.
unloaded 页面从内存中卸载清除

当此属性的值改变时, 会递交 visibilitychange 事件给Document.

三、visibilitychange用法

当页面离开的时候,visibilityState值也会相应改变,只需要在监听事件上做判断即可

实现‘作弊监听‘功能,监听用户离开页面的时间和次数

<script>
    let leaveTime;
    let inTime;
    let num = 0;
    document.addEventListener(‘visibilitychange‘,function(e){
        console.log(document.visibilityState);

        let state = document.visibilityState
        if(state == ‘hidden‘){
            leaveTime = (new Date()).getTime();
            num++;
        }
        if(state == ‘visible‘){
            inTime = (new Date()).getTime();
            let time = (Number(inTime) - Number(leaveTime))/1000;

            alert(‘用户离开了:‘ + time + ‘s‘ + ‘\n‘ + ‘用户离开了:‘ + num + ‘次‘)
        }

    })
</script>

效果图:

解析一下步骤:

  1. 首先定义几个全局变量,不用全局变量的话每次监听更改的时候,未赋值的值会报underfine。

    leaveTime:用户离开页面的时间. 用getTime()获取毫秒

    inTime:用户进入页面的时间.

    num:记录用户离开次数

  2. 通过不同的参数执行不同的操作

    state为hidden的时候表示离开页面,记录离开时间,并且记录次数

    state为visible的时候表示回来页面,记录回来时间,返回时间差和次数

一个简单的监听离开事件就完成啦!

四、利用visibilityState实现离开页面暂停播放音乐(视频)功能

<body>
    <video style="width:600px" controls>
        <source src="tvb.mp4" type="video/mp4">
        浏览器不支持 video 标签。
    </video>
    <script>
        document.addEventListener(‘visibilitychange‘,function(e){
            let state = document.visibilityState;
            if(state == ‘hidden‘){
                document.querySelector(‘video‘).pause();
            }

        })
    </script>
</body>

效果:

  1. 打开页面 播放视频

  2. 切换页面(mac三爪滑过)

前端简单实现校招笔试'作弊监听'功能

原文地址:https://www.cnblogs.com/soyxiaobi/p/9550106.html

时间: 2024-08-27 23:03:43

前端简单实现校招笔试'作弊监听'功能的相关文章

javascript面向对象--观察者模式(为对象添加事件监听功能)

正文开始之前,有这么一个需求: >背景:宁静的夜晚,一天晚上,狗蛋(主人)睡得正香,侠盗高飞(小偷)突然造访. >事件:高飞正准备下手的时候,不料被旺财(狗)发现了,于是旺财叫了起来,狗蛋醒了,高飞逃走了. 分析需求后,可以发现有三个对象: 高飞(小偷) 旺财(狗) 狗蛋(主人) 创建对象的构造函数以及原型方法 //人的构造函数 function Person(name){ this.name=name; //首次创建实例时,为Person的原型添加共有的方法 if(!Person.proto

前端 2018 届校招笔试面经【百度,阿里,腾讯,阿里文娱,携程,美团,拼多多】

百度 1.块级元素和行内元素的区别和举例2.HTML5的新特性3.清除浮动的方法4.BFC清除浮动的原理5.盒子模型6.标准模式和兼容模式7.闭包的定义8.原型链和作用域链9.作用域链和闭包的区别10.Object的原型对象是什么11.怎么判断一个属性是对象上的属性还是其原型对象上的属性12.判断一个对象类型为数组13.网络安全的防御14.localStorage和cookie的区别15.前端性能优化16.层叠上下文17.手写events模块18.手写将一个段落里的单词首字母都大写的函数 1.三

C# Socket系列一 简单的创建socket的监听

socket的应用场景,在快速,稳定,保持长连接的数据传输代码.Http也是socket封装出来的,基于一次请求一次回复,然后断开的socket连接封装. 比如我们常见的游戏服务器,目前的很火的物联网服务器,都需要开启socket服务器去监听实时传输的数据. 那么我们如何实现socket的监听呢.说到这里,我们需要知道,socket的监听分为tcp和udp两种形式,但是tcp其实是udp封装而来的,可看做可靠的udp传输,基于udp的定向传输,收到消息回复发送方收到消息.等验证,来实现tcp的数

简单剖析Node中的事件监听机制(一)

使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效.并且Node中的大量模块都使用了Event机制,因此可以说是整个Node中最重要的模块之一. 实例: let event = new eventEmitter(); event.on('someType',function(){ }); even

AsyncHttpClient 登录 Application Fragment 回调 监听 软键盘

Activity /**登录界面及登陆后用户首页界面,使用两个Fragment实现*/ public class LoginActivity extends Activity implements LoginInterface {     /** 存放Fragment的容器 */     private View fragmentContainer;     /** 在使用replace替换Fragment是需要一个id */     public static final int ROOT_I

android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上找对应ContentProvider的源码:https://github.com/android 有好多个,哪一个才是短信数据的ContentProvider呢? 在filters输入框:输入telephony. 现在只有一个了,打开: 装有git的话,可以选择clone到本地,没有的话,就选择下载

mqtt实现自动监听服务器消息

本示例借助meteor的一个环境跑,和我们平时用的node自己搭的环境或java,php的环境本质一样,在此不多讨论. 首先需求是:多系统对接进行消息实时传递. 安装好mqtt:  npm install mqtt --save 本地服务(可以直接配在java中):这里采用mosca 安装好mosca: npm install mosca --save var mosca=reqire('mosca'); var mqttServer=new mosca.Server({port:8000});

好记性不如烂笔头42-javaWeb监听对象域属性变化(6)

JavaWeb中对象域的属性的变更的事件监听器,可以用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器. 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件

迷你MVVM框架 avalonjs 学习教程15、属性监听与模块通信

avalon的ViewModel对象从其内部EventManager里继承了三个方法,$watch.$unwatch.$fire三个方法,它们就是我们本节的主题. 词如其名,非常直白,一看就知道做什么.我们先从$watch方法说起,它能监听当前的VM第一层的监控属性 与 计算属性,如果某属性是一个对象,想监控其子孙属性,就需要定位到此对象上使用$watch回调了.$watch回调会默认传入先后两个属性值. <!DOCTYPE html> <html> <head> &l