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 相关文章推荐
jQuery链式操作如何实现以及为什么要用链式操作
Jan 17 Javascript
Firefox和IE兼容性问题及解决方法总结
Oct 08 Javascript
jquery如何根据值设置默认的选中项
Mar 17 Javascript
jQuery显示和隐藏 常用的状态判断方法
Jan 29 Javascript
Javascript动画的实现原理浅析
Mar 02 Javascript
JavaScript中判断两个字符串是否相等的方法
Jul 07 Javascript
javascript针对不确定函数的执行方法
Dec 16 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
Mar 14 Javascript
解决webpack打包速度慢的解决办法汇总
Jul 06 Javascript
Vue2.0 v-for filter列表过滤功能的实现
Sep 07 Javascript
vue滚动固定顶部及修改样式的实例代码
May 30 Javascript
vue实现页面切换滑动效果
Jun 29 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
You might like
PHP读取MySQL数据代码
2008/06/05 PHP
php 变量未定义等错误的解决方法
2011/01/12 PHP
PHP数组交集的优化代码分析
2011/03/06 PHP
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python中单例模式总结
2018/02/20 Python
python和c语言的主要区别总结
2019/07/07 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
python 5个实用的技巧
2020/09/27 Python
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
酒店led欢迎词
2014/01/09 职场文书
2014年幼儿园元旦活动方案
2014/02/13 职场文书
行政助理工作职责范本
2014/03/04 职场文书
美容院店长岗位职责
2014/04/08 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
教育教学工作反思
2016/02/24 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server
vue elementUI表格控制对应列
2022/04/13 Vue.js
vue封装数字翻牌器
2022/04/20 Vue.js