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 ui(接口)介绍
Sep 17 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
Feb 27 Javascript
JavaScript实现的链表数据结构实例
Apr 02 Javascript
js带缩略图的图片轮播效果代码分享
Sep 14 Javascript
Javascript技术难点之apply,call与this之间的衔接
Dec 04 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
AngularJS折叠菜单实现方法示例
May 18 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
express+mockjs实现模拟后台数据发送功能
Jan 07 Javascript
Vue多系统切换实现方案
Jun 05 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
为vue项目自动设置请求状态的配置方法
Jun 09 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
You might like
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
图片按比例缩放函数
2006/06/26 Javascript
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
ASP SQL防注入的方法
2008/12/25 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
使用jquery实现简单的ajax
2013/07/08 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
JavaScript中this详解
2015/09/01 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
python新手经常遇到的17个错误分析
2014/07/30 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
详解Python if-elif-else知识点
2018/06/11 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
python编写微信公众号首图思路详解
2019/12/13 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
销售团队口号大全
2014/06/06 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
搬迁通知
2015/04/20 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
56句经典英文座右铭
2019/08/09 职场文书
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers