`

angularjs短信验证码及秒倒计时

阅读更多

  工作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那样使用,一些使用小技巧可以用在浏览器单线程的事件执行方面。

  • 大小: 3.2 KB
  • 大小: 3.9 KB
  • 大小: 1.2 KB
  • 大小: 1.6 KB
  • 大小: 789 Bytes
  • 大小: 1.3 KB
分享到:
评论

相关推荐

    js短信验证码倒计时(页面刷新无效)

    在网页开发中,短信验证码是验证用户身份的重要手段,它通常与倒计时功能结合,以防止用户频繁发送验证码,减轻服务器压力,并提供良好的用户体验。本文将深入探讨如何实现一个js短信验证码倒计时功能,同时确保在...

    AngularJS 验证码60秒倒计时功能的实现

    在AngularJS开发过程中,有时候我们需要实现一些交互性的功能,比如验证码60秒倒计时。这个功能在用户注册、登录等场景中非常常见,目的是防止恶意频繁请求验证码,保护系统资源。本文将详细介绍如何在AngularJS中...

    js 实现发送短信验证码后的倒计时功能

    发送短信验证码后,为了防止恶意频繁发送,通常会有一个倒计时限制,例如60秒内不可再次发送。在js中,我们可以创建一个名为`countdown`的函数来实现这个功能: ```javascript let countdownInterval; function ...

    asp.net短信登录验证码和图片验证程序源码

    实现了验证码倒计时的功能 1.以下验证码例子采用的是先获取手机号文字验证码,如果文字验证码收不到,将采用语音播放验证码的形式,两种形式的结合,基本避免个别手机号收不到的问题,从而是验证码的成功率接近100%...

    jQuery手机号码获取验证码60秒倒计时表单代码

    这个"jQuery手机号码获取验证码60秒倒计时表单代码"提供了一个实用的解决方案,尤其适用于移动端界面,同时也可调整适应电脑端。下面我们将深入探讨这个功能涉及到的关键知识点。 1. **jQuery库**:jQuery是一个...

    网页上发送短信时验证码变灰倒计时显示

    在网页设计中,"网页上发送短信时验证码变灰倒计时显示" 是一个常见的功能,主要用于提升用户体验和防止恶意操作。这个功能通常出现在用户注册、登录或进行其他需要验证身份的操作时,确保手机号码的有效性和唯一性...

    数电课程设计报告_30秒倒计时器.pdf

    数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf数电课程设计报告_30秒倒计时器.pdf...

    asp阿里云短信接口,带60秒倒计时功能,可用于验证码,2023年4月亲测可用

    asp阿里云短信接口,带60秒倒计时功能,特别适合验证码,2023年4月亲测可用 阿里云短信接口asp,网上找了好多都不太适合,或者都是以前阿里大于的 网上找了下代码,自己更改了下,亲测可用. 适用于短信验证码等功能.asp适用...

    Vue验证码60秒倒计时功能简单实例代码

    Vue 验证码 60 秒倒计时功能简单实例代码 本文主要介绍了 Vue 验证码 60 秒倒计时功能简单实例代码,代码简单易懂,非常实用,具有参考价值。 标题解析 该标题主要介绍了 Vue 验证码 60 秒倒计时功能简单实例代码...

    Bmob短信验证码以及倒计时重新发送验证码的实现

    在这个特定的项目中,“Bmob短信验证码以及倒计时重新发送验证码的实现”是一个实际应用场景,用于验证用户身份并确保安全性。 首先,我们要理解验证码系统的核心功能。验证码是一种安全机制,通过向用户的手机发送...

    自动获取短信验证码并填充以及倒计时

    在IT行业中,自动获取短信验证码并填充以及倒计时是一项常见的功能,特别是在用户注册、登录、支付等场景中。这个功能极大地提升了用户体验,减少了手动输入验证码的繁琐步骤,同时也为应用的安全性提供了一定保障。...

    Flutter之Timer实现短信验证码获取60s倒计时功能的代码

    2.短信验证码60s倒计时 第一种的话,根据需求我们可以知道,我们想要的效果就是3s结束做出一个动作。 factory Timer(Duration duration, void callback()) { if (Zone.current == Zone.root) { // No need to ...

    js设置手机获取验证码后按钮倒计时

    js设置手机获取验证码后按钮倒计时,页面发送验证码后显示倒计时60秒demo,逻辑很简单,参考后可以自己设置 称需要的倒计时间,及显示内容

    安卓短信彩信相关相关-一个仿全民夺宝和短信验证码按钮的倒计时控件.rar

    这个压缩包“安卓短信彩信相关相关-一个仿全民夺宝和短信验证码按钮的倒计时控件.rar”似乎包含了一个模仿热门应用“全民夺宝”中短信验证码功能的倒计时控件。这个控件可能是为了帮助开发者创建类似功能,提供用户...

    小程序获取验证码倒计时

    倒计时界面通常显示如 "验证码已发送,请在XX秒内输入" 的提示。当计时结束,调用 `clearInterval` 停止计时,并根据需求决定是否允许用户重新发送验证码。 3. **状态管理**:为了确保用户在倒计时期间无法重复发送...

    Android使用CountDownTimer实现短信验证码倒计时Demo

    使用了CountdownTimer实现短信验证码倒计时的效果,并解决了倒计时读数不准确的Bug。博客地址:http://blog.csdn.net/Lindroid20/article/details/73693102

    Android获取短信验证码倒计时按钮

    在Android应用开发中,短信验证码倒计时按钮是常见的功能之一,主要用于用户验证手机号码的正确性。这个功能通常在用户注册或者找回密码等场景下出现,用户输入手机号后,点击获取验证码,系统会发送一条包含验证码...

    jquery表单中获取短信验证码倒计时

    在jQuery中实现表单中的短信验证码倒计时功能是一项常见的前端交互设计,它增强了用户体验,同时也确保了用户在请求验证码后必须等待一段时间才能再次发送,防止滥用系统资源。以下将详细讲解如何使用jQuery来实现这...

    单片机9秒倒计时(成功)

    单片机9秒倒计时程序是一个典型的微控制器应用实例,它涉及到电子工程中的嵌入式系统设计。在这个项目中,单片机被用来实现一个9秒钟的倒计时功能,这种功能在很多应用场景中都很常见,比如定时开关、竞赛计时、安全...

Global site tag (gtag.js) - Google Analytics