我们平时在逛到一些网站的时候,在一些网站的会员注册页面里,为了提高用户的责任心
以及给用户留下足够的时间阅读完注册协议,可以采用10秒倒计时的方式,阅读完协议后,才可以单机注册按钮的特效
其实这与发送短信验证码倒计时,是一样的
示例效果
原生JS实现
以下是原生简易
var sec = 10;
function countDownTimer() {
timer = setInterval(function() {
// 获取注册按钮的DOM
var btn = document.getElementById("btn");
sec--;
btn.value = `注册(${sec})`;
if(sec == 0) {
clearInterval(timer); // 清除定时器
btn.disabled = false; // 按钮恢复可用
btn.value = '注册'; // 设置按钮文本
}
},1000)
}
countDownTimer();
如下是
<p>请认真阅读完协议</p>
<input type="button" value="注册(10)" id="btn" disabled="disabled" />
分析
实现这个示例,主要依赖于定时器,且倒计时的时间间隔必须是1秒钟,另外还需要注意的是需要把握倒计时是否已经结束,如果结束的话,那么就需要回复按钮的可用状态
Vue版本实现
如下是Vue的实现,也就是上面示例展示的源代码
方式1-使用方法实现
<template>
<div class="el-button-wrap">
<div class="content">请认真阅读完协议....</div>
<el-button type="primary" :disabled="sec == 0?false:true"
>注册<span v-show="sec == 0?false:true">({{sec}}秒)</span></el-button>
</div>
</template>
<script>
export default {
data() {
return {
sec: 15, // 倒计预设15秒
}
},
mounted() {
this.countDownTimer()
},
methods: {
countDownTimer() {
if(this.sec > 0) {
setTimeout(() => {
this.sec -= 1
this.countDownTimer()
}, 1000)
}
}
},
};
</script>
<style>
.el-button-wrap {
text-align: center;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.content{
margin-bottom: 20px;
}
</style>
上面这种使用方法去实现,是一种比较常见的方式
方式2-使用watch实现
使用
<template>
<div class="el-button-wrap">
<div class="content">请认真阅读完协议....</div>
<el-button type="primary" :disabled="second == 0?false:true"
>注册<span v-show="second == 0?false:true">({{second}}秒)</span></el-button>
</div>
</template>
<script>
export default {
data() {
return {
second: 30, // 倒计时30秒
}
},
watch:{
second: {
handler(value) {
if(value > 0) {
setTimeout(() => {
this.second--;
},1000)
}
},
immediate: true // 首次加载时,调用上面的handler函数
}
},
};
</script>
<style>
.el-button-wrap {
text-align: center;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.content {
margin-bottom: 20px;
}
</style>
总结
无论是使用原生js方式还是使用
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END