工作H5开发需要做短信验证码及秒倒计时,如果是用纯JS做好像还比较容易,但用angularJS做还是一些坑,特此记录一下,有如下几种实现方式。
一.setTimeout方式实现
<html> <head> <title>AngularJs倒计时</title> </head> <body> <div ng-controller="registerCtrl"> <div> <div> <label>验证码:</label> <input ng-model='verifCode' ng-disabled="verifCodeDisabled" placeholder="请输入验证码"></input> <button ng-bind="timing" ng-click="reacQuire()"></button> </div> </div> <div class="btn-group"> <button ng-click="submitBtn()" ng-disabled="submitBtnDisabled">提交</button> </div> </div> <script src="jquery-1.8.3.js"></script> <script src="angular1.2.9.js"></script> <script src="index.js"></script> </body> </html>
index.js
var app = angular.module('myModule', []); app.controller('registerCtrl', function($scope,$interval){ let countDown = 10; $scope.timing = countDown + "s"; $scope.verifCode = ''; $scope.verifCodeDisabled = false; $scope.submitBtnDisabled = false; function settime() { if(countDown > 0) { setTimeout(function() {settime(countDown--); $scope.$apply();}, 1000); $scope.timing = countDown + 's'; }else { $scope.timing = "重新获取"; $scope.verifCodeDisabled = true; $scope.submitBtnDisabled = true; } } settime(); $scope.reacQuire = function() { if(countDown <= 0) { countDown = 10; $scope.timing = countDown + "s"; settime(); $scope.verifCodeDisabled = false; $scope.submitBtnDisabled = false; } }; $scope.submitBtn = function() { if(!$scope.verifCode) { alert('请输入验证码'); return; } alert('提交成功'); }; }); angular.element(document).ready(function() { angular.bootstrap(document,['myModule']); });
运行效果:
当倒计到0,输入框和“提交”按钮变灰,倒计时按钮变成“重新获取”,如下所示:
在这里的实现在,必须注意settime函数中的$scope.$apply();在这里,如果没有$scope.$apply();则倒计时,只会倒计一次,虽然JS确实在一秒一秒的减少,但由于异步(延迟)的存在,当开始执行回调函数的时候,angularJS自身controller中的脏值检测已经结束,无法检测到回调函数导致数据的变化,导致页面无法正常倒计时间。同样,如果在settime函数级别加上$scope.$apply();效果确实可以,但F12可以看到angularJS报错$apply already in progress。详见:理解和解决angularJS报错$apply already in progress。
二.修改网上查看的实现方式,也能达到目的
<html> <head> <title>AngularJs倒计时</title> </head> <body> <div ng-controller="registerCtrl"> <a href="javascript:" ng-click="sendphonecode(reg_phone)" ng-class="paraclass" ng-bind="paracont">获取验证码</a> </div> <script src="jquery-1.8.3.js"></script> <script src="angular1.2.9.js"></script> <script src="app.js"></script> </body> </html>
app.js
var app = angular.module('myModule', []); app.controller('registerCtrl', function($scope, $interval) { $scope.paracont = "获取验证码"; $scope.paraclass = "but_null"; $scope.paraevent = true; var second = 10, timePromise = undefined; function interval(){ if(second<=0){ $interval.cancel(timePromise); timePromise = undefined; $scope.paracont = "重发验证码"; $scope.paraclass = "but_null"; $scope.paraevent = true; }else{ $scope.paracont = second + "秒后可重发"; $scope.paraclass = "not but_null"; second--; } } timePromise = $interval(interval, 1000, 100); //表示每一秒执行一次,执行100次 $scope.sendphonecode = function() { if(second <= 0) { second = 10; timePromise = $interval(interval, 1000, 100); //表示每一秒执行一次,执行100次 } }; }); angular.element(document).ready(function() { angular.bootstrap(document,['myModule']); });
运行效果:
三.用$interval实现
<html> <head> <title>AngularJs倒计时</title> </head> <body> <div ng-controller="registerCtrl"> <div> <div> <label>验证码:</label> <input ng-model='verifCode' ng-disabled="verifCodeDisabled" placeholder="请输入验证码"></input> <button ng-bind="timing" ng-click="reacQuire()"></button> </div> </div> <div class="btn-group"> <button ng-click="submitBtn()" ng-disabled="submitBtnDisabled">提交</button> </div> </div> <script src="jquery-1.8.3.js"></script> <script src="angular1.2.9.js"></script> <script src="index02.js"></script> </body> </html>
index02.js
var app = angular.module('myModule', []); app.controller('registerCtrl', function($scope,$interval){ let countDown = 10; $scope.timing = countDown + "s"; $scope.verifCode = ''; $scope.verifCodeDisabled = false; $scope.submitBtnDisabled = false; var time = $interval(interval, 1000); function interval() { countDown--; $scope.timing = countDown + "s"; if(countDown <= 0) { $interval.cancel(time); $scope.timing = "重新获取"; $scope.verifCodeDisabled = true; $scope.submitBtnDisabled = true; } } $scope.reacQuire = function() { if(countDown <= 0) { countDown = 10; $scope.timing = countDown + "s"; time = $interval(interval, 1000); $scope.verifCodeDisabled = false; $scope.submitBtnDisabled = false; } }; $scope.submitBtn = function() { if(!$scope.verifCode) { alert('请输入验证码'); return; } alert('提交成功'); }; }); angular.element(document).ready(function() { angular.bootstrap(document,['myModule']); });
运行效果同方法一。
四.指令方式
<html> <head> <title>AngularJs倒计时</title> </head> <body> <div ng-controller="registerCtrl"> <timer-button show-timer="initTime" timeout="timeoutValue">获取验证码</timer-button> </div> <script src="jquery-1.8.3.js"></script> <script src="angular1.2.9.js"></script> <script src="index03.js"></script> </body> </html>
index03.js
var app = angular.module('myModule', []); app.controller('registerCtrl', function($scope, $interval){ $scope.initTime = false; $scope.timeoutValue = 10000; }); app.directive('timerButton', function($timeout, $interval){ return { restrict: 'AE', scope: { showTimer: '=', timeout: '=' }, link: function(scope, element, attrs){ scope.timer = false; scope.timerCount = scope.timeout / 1000; scope.text = "获取验证码"; scope.onClick = function(){ scope.showTimer = true; scope.timer = true; scope.text = 's'; var counter = $interval(function(){ if(scope.timerCount > 0) { scope.timerCount = scope.timerCount - 1; }else { scope.timerCount = ''; } }, 1000); $timeout(function(){ scope.text = "重新获取"; scope.timer = false; $interval.cancel(counter); scope.showTimer = false; scope.timerCount = scope.timeout / 1000; }, scope.timeout); } }, template: '<button ng-click="onClick()" class="button button-calm xgmm-btn" ng-disabled="timer"><span ng-show="showTimer">{{ timerCount }}</span>{{text}}</button>' }; }); angular.element(document).ready(function() { angular.bootstrap(document,['myModule']); });
运行效果:
刚打开页面,显示”获取验证码“按钮
点击”获取验证码“按钮,进行秒倒计时
倒计到0时,显示”重新获取“,此时,可点击“重新获取”按钮重新进行倒计时。
五.AngularJs $interval 和 $timeout
1.$interval
window.setInterval的Angular包装形式。Fn是每次延迟时间后被执行的函数。
间隔函数的返回值是一个承诺。这个承诺将在每个间隔刻度被通知,并且到达规定迭代次数后被取消,如果迭代次数未定义,则无限制的执行。通知的值将是运行的迭代次数。取消一个间隔,调用$intreval.cancel(promise)。
备注:当你执行完这项服务后应该把它销毁。特别是当controller或者directive元素被销毁时而$interval未被销毁。你应该考虑到在适当的时候取消interval事件。
使用:$interval(fn,delay,[count],[invokeApply],[Pass]);
fn:一个将被反复执行的函数。
delay:每次调用的间隔毫秒数值。
count:循环次数的数值,如果没设置,则无限制循环。
invokeApply:如果设置为false,则避开脏值检查,否则将调用$apply。
Pass:函数的附加参数。
方法:cancel(promise);
取消与承诺相关联的任务。
promise:$interval函数的返回值。
使用代码:
(function () { angular.module("Demo", []) .controller("testCtrl",["$interval",testCtrl]); function testCtrl($interval){ var toDo = function () { console.log("Hello World"); }; $interval(toDo, 3000, 10); }; }());
2.$timeout
window.setTimeout的Angular包装形式。Fn函数包装成一个try/catch块,代表$exceptionHandler服务里的任何异常。
timeout函数的返回值是一个promise,当到达设置的超时时间时,这个承诺将被解决,并执行timeout函数。
需要取消timeout,需要调用$timeout.cancel(promise);
使用: $timeout(fn,[delay],[invokeApply]);
fn:一个将被延迟执行的函数。
delay:延迟的时间(毫秒)。
invokeApply:如果设置为false,则跳过脏值检测,否则将调用$apply。
方法:cancel(promise);
取消与承诺相关联的任务。这个的结果是,承诺将被以摒弃方式来解决。
promise:$timeout函数返回的承诺。
使用代码:
(function () { angular.module("Demo", []) .controller("testCtrl",["$timeout",testCtrl]); function testCtrl($timeout){ var toDo = function () { console.log("Hello World"); }; $timeout(toDo,5000) }; }());
大致使用方法可以和原生js的setInterval和setTimeout那样使用,一些使用小技巧可以用在浏览器单线程的事件执行方面。
相关推荐
在网页开发中,短信验证码是验证用户身份的重要手段,它通常与倒计时功能结合,以防止用户频繁发送验证码,减轻服务器压力,并提供良好的用户体验。本文将深入探讨如何实现一个js短信验证码倒计时功能,同时确保在...
在AngularJS开发过程中,有时候我们需要实现一些交互性的功能,比如验证码60秒倒计时。这个功能在用户注册、登录等场景中非常常见,目的是防止恶意频繁请求验证码,保护系统资源。本文将详细介绍如何在AngularJS中...
发送短信验证码后,为了防止恶意频繁发送,通常会有一个倒计时限制,例如60秒内不可再次发送。在js中,我们可以创建一个名为`countdown`的函数来实现这个功能: ```javascript let countdownInterval; function ...
实现了验证码倒计时的功能 1.以下验证码例子采用的是先获取手机号文字验证码,如果文字验证码收不到,将采用语音播放验证码的形式,两种形式的结合,基本避免个别手机号收不到的问题,从而是验证码的成功率接近100%...
这个"jQuery手机号码获取验证码60秒倒计时表单代码"提供了一个实用的解决方案,尤其适用于移动端界面,同时也可调整适应电脑端。下面我们将深入探讨这个功能涉及到的关键知识点。 1. **jQuery库**:jQuery是一个...
在网页设计中,"网页上发送短信时验证码变灰倒计时显示" 是一个常见的功能,主要用于提升用户体验和防止恶意操作。这个功能通常出现在用户注册、登录或进行其他需要验证身份的操作时,确保手机号码的有效性和唯一性...
数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf...
asp阿里云短信接口,带60秒倒计时功能,特别适合验证码,2023年4月亲测可用 阿里云短信接口asp,网上找了好多都不太适合,或者都是以前阿里大于的 网上找了下代码,自己更改了下,亲测可用. 适用于短信验证码等功能.asp适用...
Vue 验证码 60 秒倒计时功能简单实例代码 本文主要介绍了 Vue 验证码 60 秒倒计时功能简单实例代码,代码简单易懂,非常实用,具有参考价值。 标题解析 该标题主要介绍了 Vue 验证码 60 秒倒计时功能简单实例代码...
在这个特定的项目中,“Bmob短信验证码以及倒计时重新发送验证码的实现”是一个实际应用场景,用于验证用户身份并确保安全性。 首先,我们要理解验证码系统的核心功能。验证码是一种安全机制,通过向用户的手机发送...
在IT行业中,自动获取短信验证码并填充以及倒计时是一项常见的功能,特别是在用户注册、登录、支付等场景中。这个功能极大地提升了用户体验,减少了手动输入验证码的繁琐步骤,同时也为应用的安全性提供了一定保障。...
2.短信验证码60s倒计时 第一种的话,根据需求我们可以知道,我们想要的效果就是3s结束做出一个动作。 factory Timer(Duration duration, void callback()) { if (Zone.current == Zone.root) { // No need to ...
js设置手机获取验证码后按钮倒计时,页面发送验证码后显示倒计时60秒demo,逻辑很简单,参考后可以自己设置 称需要的倒计时间,及显示内容
这个压缩包“安卓短信彩信相关相关-一个仿全民夺宝和短信验证码按钮的倒计时控件.rar”似乎包含了一个模仿热门应用“全民夺宝”中短信验证码功能的倒计时控件。这个控件可能是为了帮助开发者创建类似功能,提供用户...
倒计时界面通常显示如 "验证码已发送,请在XX秒内输入" 的提示。当计时结束,调用 `clearInterval` 停止计时,并根据需求决定是否允许用户重新发送验证码。 3. **状态管理**:为了确保用户在倒计时期间无法重复发送...
使用了CountdownTimer实现短信验证码倒计时的效果,并解决了倒计时读数不准确的Bug。博客地址:http://blog.csdn.net/Lindroid20/article/details/73693102
在Android应用开发中,短信验证码倒计时按钮是常见的功能之一,主要用于用户验证手机号码的正确性。这个功能通常在用户注册或者找回密码等场景下出现,用户输入手机号后,点击获取验证码,系统会发送一条包含验证码...
在jQuery中实现表单中的短信验证码倒计时功能是一项常见的前端交互设计,它增强了用户体验,同时也确保了用户在请求验证码后必须等待一段时间才能再次发送,防止滥用系统资源。以下将详细讲解如何使用jQuery来实现这...
单片机9秒倒计时程序是一个典型的微控制器应用实例,它涉及到电子工程中的嵌入式系统设计。在这个项目中,单片机被用来实现一个9秒钟的倒计时功能,这种功能在很多应用场景中都很常见,比如定时开关、竞赛计时、安全...