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 设置级联菜单的默认值
Jun 13 Javascript
js常用代码段整理
Nov 30 Javascript
javascript 常用功能总结
Mar 18 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 Javascript
angular中使用路由和$location切换视图
Jan 23 Javascript
使用iojs的jsdom库实现同步系统时间
Apr 20 Javascript
详解JavaScript函数
Dec 01 Javascript
JS字符串的切分用法实例
Feb 22 Javascript
vue 实现类似淘宝星级评分的示例
Mar 01 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
Aug 28 Javascript
node Buffer缓存区常见操作示例
May 04 Javascript
微信小程序后台持续定位功能使用详解
Aug 23 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
You might like
虫族 ZERG 概述
2020/03/14 星际争霸
php微信支付之APP支付方法
2015/03/04 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
JS面向对象编程 for Cookie
2010/09/19 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
改进Django中的表单的简单方法
2015/07/17 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
keras多显卡训练方式
2020/06/10 Python
python爬取天气数据的实例详解
2020/11/20 Python
python中round函数保留两位小数的方法
2020/12/04 Python
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
药学专业大专生的自我评价
2013/12/12 职场文书
社会保险接收函
2014/01/12 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
自我评价优缺点范文
2015/03/11 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL