在我们用dom语句写验证码倒计时时,会遇到几个小问题
先放源码
<body>
<ul>
<li>
手机号:
<input type="text">
</li>
<li>
验证码:
<input type="text" class="verify">
<button id="btn">获取验证码</button>
</li>
</ul>
<script>
const btn = document.querySelector('#btn')
btn.addEventListener('click',function(){
btn.disabled = true
// 这行代码非常重要,表示点击之后,按钮立即禁用,可以有效的解决用户瞬间点几下按钮打开多个定时器的bug
let i = 5
btn.innerHTML = `${i}秒之后重新获取`
id = setInterval(function(){
i--
if(i>=1){
btn.disabled = true
btn.innerHTML = `${i}秒之后重新获取`
}else{
btn.disabled = false
btn.innerHTML = `获取验证码`
clearInterval(id)
}
},1000)
})
</script>
</body>
第一个问题,按下按钮,按钮需要过一段时间才能实现禁用效果.
第二个问题,按下按钮,里面的文字不会立刻跳转成(x秒之后重新获取),也需要一段时间.
其实这两个问题属于同一种类型的错误,第一种bug,会导致按钮没有及时禁用,用户能在瞬间点多下按钮,导致打开多个定时器.而第二种bug影响稍小,会在观感上给用户一种延迟的感觉.
这两个bug的原因都是因为实现这俩功能的代码位置放错.下面是放错的源码
对比第一张图,这个错误代码就是把开头的两个功能代码给注释了.
效果就是点击按钮之后,按钮禁用延迟,验证码读秒延迟.
原因代码运算是从上到下,从结构到函数,所以代码先执行结构,然后再进入函数(我函数里面也写了这两个功能)实现功能.造成延迟.
如何才能让点击按钮事件,立刻实现按钮禁用和验证码读秒呢?
那就是把这两行功能代码直接先写到按钮事件下面,一点击按钮立刻触发!