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 相关文章推荐
javascript 获取页面的高度及滚动条的位置的代码
May 06 Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
Mar 04 Javascript
JS上传前预览图片实例
Mar 25 Javascript
JavaScript中数组Array.sort()排序方法详解
Mar 01 Javascript
jQuery菜单实例(全选,反选,取消)
Aug 28 jQuery
javascript高级模块化require.js的具体使用方法
Oct 31 Javascript
vue实现文章内容过长点击阅读全文功能的实例
Dec 28 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
react MPA 多页配置详解
Oct 18 Javascript
vue实现淘宝购物车功能
Apr 20 Javascript
vue使用echarts画组织结构图
Feb 06 Vue.js
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
You might like
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
PHP编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
js中判断控件是否存在
2010/08/25 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
Python中对列表排序实例
2015/01/04 Python
Django中使用locals()函数的技巧
2015/07/16 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
快速查找Python安装路径方法
2020/02/06 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
QML用PathView实现轮播图
2020/06/03 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
土木工程实习生自我鉴定
2013/09/19 职场文书
高中生期末评语
2014/01/28 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
材料员岗位职责
2015/02/10 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
基于Python实现对比Exce的工具
2022/04/07 Python