倒计时到0停止,用在手机获取验证码的倒计时

本文介绍如何在手机获取验证码时实现倒计时功能,并避免倒计时过程中不断调用接口的问题。通过设置定时器并控制其在倒计时结束时清除,确保倒计时结束后停止接口请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 <input type="text" placeholder="填写验证码" class="check1 "/><button class="verify" onclick="settime(this);return false;">获取验证码</button>

 


var countdown=120;
function settime(obj) {
    
    if (countdown == 0) {
     obj.removeAttribute("disabled");  
     $(obj).css("background-color","#FE663F");
        obj.innerHTML="短信验证码";
        countdown = 120;
        return;   //重要重要,注意else后面没有return,因为到倒计时为o的时候才跳出循环的。否则就一直在执行自己。
    } else {
     obj.setAttribute("disabled", true);
     $(obj).css("background-color","#ccc")
        obj.innerHTML="重新发送(" + countdown + ")";
        countdown--;
    }
   
setTimeout(function() {    //因为一直执行自己的这个函数,所以就写1000毫秒内执行一次。
    settime(obj) }   //相当于他不停的访问自己在循环
    ,1000)
   }

 

 

 

········································································································································

 

 

改写上面的内容,因为如果点击验证码访问接口,自己循环的话就会一直访问那个接口。这样就有问题啦。所以你要把判断循环的内容写在另一个函数里面;就是那个if,else。

var countdown=120;
function settime(obj) {
    //访问接口
AAAA=setInterval(function() {   //一直执行,内部函数为false。内部就终止但是定时器还会一直执行。你必须关闭定时器才行,所以在这里命名定时器,定义成全局变量,这样其他函数里面也可以用。等到countdown=0的时候就停止clearInterval()
   return  updeteTime(obj) }   //相当于他不停的访问自己在循环
    ,1000)
   }

 

 

function  updeteTime(e){

 

    if (countdown == 0) {
        obj.removeAttribute("disabled");  
        $(obj).css("background-color","#FE663F");
        obj.innerHTML="短信验证码";
        countdown = 120;
        return;   //重要重要,注意else后面没有return,因为到倒计时为o的时候才跳出循环的。否则就一直在执行自己。XXXXXX错啦。因为这个函数结束,定时器也没有结束。

    clearInterval(AAAA)
       } else {
        obj.setAttribute("disabled", true);
        $(obj).css("background-color","#ccc")
        obj.innerHTML="重新发送(" + countdown + ")";
        countdown--;
    }

 

}

 

·······················································································································································

下面是我用vue+jquery写的

<li class="mui-table-view-cell">
               <label>验证码</label>
               <input type="text" class="mui-input-clear"  placeholder="请输入验证码"  v-model="code" style="width:45%;"/>
               <button type="button" class="verify" @click="verify()">获取验证码</button>
 </li>

 

 

data() {
            return {

           listcphone:"",

          count:60,

          code:"",

         a:0

 

}

        },

//      验证码
        verify(){
            var vm=this;
            if(this.listcphone==""){return  mui.toast("请先输入手机号!")}
            else if (!/^1\d{10}$/.test(this.listcphone)) {return mui.toast('手机号格式不正确!');}
            else{
                this.$api("Member/findPassSend",{phone:this.listcphone}).then(db=>{});
                
         this.a setInterval(()=>{         //因为要一直不停的循环直到倒计时为0时,所以不能用上面的那个setTimeout
                vm.updatetime();   //必须有return,否则它会一直执行的。
            },1000)    
                
            }
        },

  updatetime(){
         if(this.count==0){
              $(".verify").removeAttr("disabled").css("background-color","#fff").html("获取验证码");
              this.count=60;
             window.clearInterval(this.a);   //停止这个定时器、如果只是停止这个函数,定时器还是会运行的
              }
        else{
             $(".verify").attr("disabled","disabled").css("background-color","#ccc").html("重新发送"+this.count+'s');
             this.count--;
        }
            
            
       },

 

---------------------------------------------------------------------------------------------------------------

 

用vue来写的

<el-button type="text" @click="getMessageCode" v-if="!isSend">{{msg}}</el-button>
 <el-button type="text" v-if="isSend">{{seconds + 's后重试'}}</el-button>

 

 isSend: false,
seconds: 60,
 msg: '发送验证码',

 

 getMessageCode() {

  这里写接口的一下信息

 this.$api("Member/findPassSend",{phone:this.listcphone}).then(db=>{

      if(res.code==1){

            this.isSend = true;
            var auth_timetimer = setInterval(() => {
            this.seconds--;
            if (this.seconds <= 0) {
              this.isSend = false;
              this.msg = '重新发送'
              clearInterval(auth_timetimer);
              this.seconds = 60
            } 

  }, 1000);   

  }

});
 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值