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 相关文章推荐
XHTML下,JS浮动代码失效的问题
Nov 12 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
Oct 07 Javascript
jQuery中:disabled选择器用法实例
Jan 04 Javascript
JavaScript图片轮播代码分享
Jul 31 Javascript
AngularJs 弹出模态框(model)
Apr 07 Javascript
jQuery层次选择器用法示例
Sep 09 Javascript
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 Javascript
JS使用Date对象实时显示当前系统时间简单示例
Aug 23 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
原生js通过一行代码实现简易轮播图
Jun 05 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
Aug 01 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
You might like
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
loading动画特效小结
2017/01/22 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
今天,小程序正式支持 SVG
2019/04/20 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
微信小程序实现底部弹出框
2020/11/18 Javascript
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
Python控制Firefox方法总结
2019/06/03 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
关于雷锋的演讲稿
2014/05/10 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
婚庆主持词大全
2015/06/30 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript