滑块&四位验证码

/*
最外层div包裹里面:
drag_text 始终 = 最外层容器宽度(w:346  h:40) {开始验证/验证通过}
drag_greenbg width:0 => 306
drag_handler ref=“moveDiv” 滑块 初始两个class样式 handler 和 handle-bg(base64编码的图片)
  .handler_bg {
    background: #fff
      url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==')
      no-repeat center;
  }

估计当 drag_greenbg width=306时  判断验证成功 加上 handle-ok-bg(先前的图片就被覆盖吧)

max-width:最外层div -滑块=340

流程:
1.给滑块绑定@mousedown ,用$event传递原生dom点击事件(阻止文字被选中)
记下beginClientX ,mouseMovestate=true
2.mounted中 有鼠标移动和鼠标抬起监听事件
3.mouseMove 触发mouseMoveFn
比较 拖拽方块的width 和 maxwidth(mouted)

mouseMoveFn:
比较 width 和 maxwidth
如果 width > 0 && <= maxWidth(width > 0条件和=maxWidth去掉了,不影响)
用document.xxx.style.left    控制滑块的位置
用document.xxx.style.width    控制绿色背景条的宽度
如果 width > maxwidth
调用成功函数

successFunction:
(1)this.confirmSuccess = true   用这个来控制handler_ok_bg类(图片)的增加
this.confirmSuccess = false  起初
:class="{'handler_ok_bg':confirmSuccess}"   =》这个是控制这个类是否显示
:class="xxx?y1:y2"  这个是切换  或许可以把前者稍加改造
(2)移除mousemove和mouseup(兼容性)
(3)docuemnt.xxx.style.color="#fff"  字体白色
滑块 和 绿色背景条的宽度又设置 等于 maxWidth
      document.getElementsByClassName('handler')[0].style.left =
        this.maxwidth + 'px'
      document.getElementsByClassName('drag_bg')[0].style.width =
        this.maxwidth + 'px'
派发事件:
this.$emit('success')
/*
$event
1.将原生dom事件传入事件处理方法中
<div @click="getDom($event)">按钮</div>
getDom(e){
    console.log(e.target.value)
    //获取值——————子组件向父组件传值
    或者 e.preventDefault&e.preventDefault()
    //阻止默认点击事件

}
通过ref来获取值
<div @click=“getDom”  ref=‘xxx’>
$this.ref.xxx.value

鼠标点下时,触发mouseDown事件,通过$event传入原生dom点击事件
“请向右拖动” 置空

moveState = true
计算出鼠标据窗口左侧的宽度 clientX
 */
/*
切换 icon/字体/背景图片
我的2种 那2种
 */

/*
created 在模板渲染成html前调用,这时一些dom节点还没有创建,可以初始化属性、数据
mounted 模板渲染成html后调用,通常是对html的dom节点的操作,求它的宽、高什么的

methods中四个:
mouseDown
mouseUp
mouseMove
success(移除监听器 再 派发事件)
mouted中:
监听mousedown,执行mousedownFn
监听mouseup,执行mouseupFn

 */

/*
发个参数给后台 说明滑块是否验证
滑块组件后有<el-input>  绑定v-model formData.sVerify  display:none

 */

/*
滑块 + 验证码

<el-button type="primary" class="w135" :disabled="count>0" @click="sendCodeFn">{{btnTxt}}</el-button>
//触发方法,改变btn显示内容
  computed: {
    btnTxt() {
      if (this.count) {
        return `${this.count}秒后重新获取`
      } else {
        return this.btnTipTxt
      }
    }
  },

  props: {
    btnTipTxt: {
      type: String,
      default: '发送验证码'
    }
  },

 //count值在另一个方法中被求出
 this.count = second ? second : TIME_COUNT(//60)
 */

/*
仿刷新
// TIME
const TIME_KEY = 'TIME_KEY'

    // 标记时间(用于防刷新)
    singTime() {
      // 存储时间
      setLocalStorage(TIME_KEY, new Date().getTime())
    },
当点击“获取验证码”  localStorage中标记当前时间

// 更改倒计时时间
const TIME_COUNT = 60

  data() {
    return {
      tiem: 60,
      count: '', // 初始化次数
      timer: null
    }
  }

   created() {
    // 检查获取验证码时间间隔
    this.checkSingTime()
检查时间挂在created,当第一次点击“获取验证码”或者再次刷新,都有TIME_KEY并且(获取到)
  },

     // 检查时间(防刷新)
    checkSingTime() {
      let _time = getLocalStorage(TIME_KEY) - 0
      if (_time) {
        // 两个时间戳相减 除1000 后取整即可
        let second =
          TIME_COUNT - parseInt((new Date().getTime() - _time) / 1000)
当前的时间-标记的当时点击时间(unit:ms)/1000        =>s   过去多少秒
second=还剩多少秒
        if (second > 0) {
          this.countDownFn(second)
        } else {
          removeLocalStorage(TIME_KEY)
        }
      }
    }

    // 倒计时
    countDownFn(second, url) {
      if (!this.timer) {
        this.count = second ? second : TIME_COUNT
        this.timer = setInterval(() => {
          if (this.count > 0 && this.count <= TIME_COUNT) {
            this.count--
          } else {
            clearInterval(this.timer) // 清除定时器
            this.timer = null
            removeLocalStorage(TIME_KEY)
            // 需要跳转传入url
            if (url) {
              window.location.href = url
            }
          }
        }, 1000)
      }
    },  
    每过1秒,setInterval=》count就减1

总结:

滑块验证、图片验证码都是防止高频操作
分三个步骤,邮箱验证=》发送验证码到邮箱,正确=》下一步=》重置密码,提交完成

用饿了吗 步骤条,有个属性是active 值0、1、2、3,加上v-if 来决定显示那个步骤的页面

有滑块、发送验证码、用canvas生成验证码组件

滑块没有实际功能,主要用鼠标事件、监听器、脚本化css(改变滑过的绿色背景条宽度和滑块左边距)、窗口属性ClientX(用这个获取滑块距离容器左边的距离,如果等于
或大于滑动的最大距离,说明滑到头了,这时滑块的背景换成一张带对勾的图片),如果中途松开鼠标,监听到mouseup事件,比较出滑动距离不等于
滑动最大距离,用style.width、style.left把滑块和通过背景条都变成0
滑动条下有input标签,但设置成display:none,有实际功能的是它。
它v-modle一个值,滑动条验证通过,它被设为1,传给后台
如果滑动条没有通过验证,那input v-model的值是空,饿了吗 对这一项的校验不会通过,不会进入下一步
 
注意派发事件 和$event传递原生dom点击事件,preventDefault阻止文字被默认选中

验证码做了防刷新
点击“获取验证码”时,new Date().getTime把这个时间存到localStorage里,命名TIME_KEY
created中挂载一个检查获取验证码时间间隔的函数
每次刷新时,都会调用这个函数,getLocalStorage获取到第一次点击的时间
倒计时second=60(time_count)-(现在的时间-TIME_KEY)/1000
如果second<=0 说明这次刷新距离上一次过了60s,就移除localstorage中的TIME_KEY,并且按钮那里恢复成“重新获取验证码”

((重新获取验证码  这里用了prop属性,type是string,default就是这句话  如果没有second倒计时这个数值,那用prop就默认把按钮
填上“重新获取验证码”这句话

如果second>0   说明距离上一次获取验证码不足60s   就调用函数,把这个重新获取到的倒计时时间传进去,
再调用setInterval,每过1s,在这个时间基础上-1,这个时间就显示到按钮上
但是每次-1前都要判断这个时间是否>0,并且(<time_count),这样才能减
如果不是,说明倒计时间结束了到0了,把消除定时器和当时localstorage里存下的时间
视情况可以传入url,让它在读秒结束后可以跳转到其他页面

 

修改密码、重置密码、登录(验证密码)


 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值