js实现自动锁屏功能


Posted in Javascript onJune 02, 2021

1.使用场景

有这么一个需求,开发了一套系统,当用户离开桌面或者一段时间不操作的话,需要把该系统所有打开页面锁定起来,就跟桌面锁屏一样,只能输入密码验证成功后,或者重新登录,才可以继续操作页面,如果刷新页面,也要保持锁定。就像下图一样。当然用户也可以手动触发锁屏。目的是防止他人随意操作系统的重要内容。那么该如何去实现呢?

5s锁屏效果如下:

js实现自动锁屏功能

2.思路

  1. 首先需要一个变量isLock表示页面是否锁定。由于多个页面需要共享这个数据,且刷新后依然能够获取到,所以我使用了localStorage储存在本地。isLock为true的时候就展示锁屏样式。
  2. 设置一个定时器 setTimeout,比如代码中设置页面无操作n秒后锁屏,那么n秒后执行锁屏操作lockPro(),即var timer = setTimeout(lockPro, n)
  3. 需要监测window的mousemove事件,监测用户鼠标移动动作,判断屏幕有没有被锁定,如果已经锁定,则不做任何操作,如果屏幕还没有锁定,需要设置一个变量moveTime记录每次鼠标移动时的时间,并保存到localStorage中,并且清除定时器timer,重新计时。
  4. setInterval轮询监听isLock,每1s获取一次,以便及时拿到锁屏状态。
  5. 锁屏操作lockPro,判断当前时间与上次鼠标操作的时间即moveTime的差值,如果小于n秒,则认为不需要锁屏,如果大于等于n秒,则需要锁屏,并更新锁屏状态isLock
  6. 判断状态为锁定后,清除定时器timer,结束定时任务。
  7. 判断状态为未锁定后,重置定时器,即先清除timer,再设置一个timer
  8. 退出登录时,清除本地缓存isLock。
  9. 密码解锁时,清除本地缓存isLock,重新设置moveTime,重置定时器。

有点绕,需要好好捋一捋。

3.代码实现

以下代码是不完全代码,html结构省略了,大家自由发挥。

// app.vue

data () {
  return {
    timeOut: 5000,
    timer: null,
    isLock: 'false'
  }
},
mounted () {
  this.timer = setTimeout(this.lockPro, this.timeOut)
  // 首次设置操作时间
  localStorage.setItem('moveTime', Date.now())
  // 首次判断状态
  this.modalStatus()
  // 轮询监听状态
  setInterval(this.modalStatus, 1000)
  // 监听鼠标事件
  this.events()
},
methods:{
   events() {
      window.onmousemove = () => {
        // console.log('鼠标移动了')
        if (!this.isLock) {
          localStorage.setItem('moveTime', Date.now())
          this.clearLocaPro('continue')
        }
      }
    },
    modalStatus() {
      if (localStorage.getItem('isLock') === 'true') {
        // console.log('锁屏了')
        this.isLock = true
        this.clearLocaPro()
      } else {
        // console.log('当前没锁屏')
        this.isLock = false
        this.clearLocaPro('continue')
      }
    },
    lockPro() {
      if (!this.timeOut) {
        localStorage.setItem('isLock', 'false')
        this.clearLocaPro('continue')
        return
      }
      if (Date.now() - localStorage.getItem('moveTime') < this.timeOut) {
        localStorage.setItem('isLock', 'false')
        this.clearLocaPro('continue')
      } else {
        localStorage.setItem('isLock', 'true')
        this.clearLocaPro()
      }
    },
    clearLocaPro(status) {
      if(this.timer){
         clearTimeout(this.timer)
      }
      if (status === 'continue') {
        this.timer = setTimeout(this.lockPro, this.timeOut)
      }
    },
    // 手动锁定
    handleLock(){
      this.clearLocaPro()
      localStorage.setItem('isLock', 'true')
    },
    // 密码解锁
    unlock(){
      localStorage.removeItem('isLock')
      localStorage.setItem('moveTime', Date.now())
      this.clearLocaPro('continue')
    },
    ...
    // 别忘了退出登录也要清除isLock
}

到此这篇关于js实现自动锁屏功能的文章就介绍到这了,更多相关js 自动锁屏 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
Aug 18 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
jQuery 取值、赋值的基本方法整理
Mar 31 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
JavaScript面试题大全(推荐)
Sep 22 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
Sep 07 Javascript
关于vue-router的beforeEach无限循环的问题解决
Sep 09 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
Mar 16 Javascript
vue项目环境变量配置的实现方法
Oct 12 Javascript
javascript匿名函数中的'return function()'作用
Oct 15 Javascript
Vue多环境代理配置方法思路详解
Jun 21 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
You might like
用穿越火线快速入门php面向对象
2012/02/22 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
用js重建星际争霸
2006/12/22 Javascript
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
Python实现八大排序算法
2016/08/13 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
详解Python循环作用域与闭包
2019/03/21 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
个人自我鉴定范文
2013/10/04 职场文书
工作自我评价怎么写
2014/01/29 职场文书
司机工作自我鉴定
2014/09/19 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python