/**
* Created by jing on 14-11-4.
*/
angular.module('app')
.directive('jingIdCard', function () {
/**
* 身份证号码验证
*
* @param cardNo
* {String} 证件号码
* @returns info {Object} 身份证信息.
*
*/
var getIdCardInfo = function (cardNo) {
var info = {
isTrue: false, // 身份证号是否有效。默认为 false
year: null,// 出生年。默认为null
month: null,// 出生月。默认为null
day: null,// 出生日。默认为null
isMale: false,// 是否为男性。默认false
isFemale: false // 是否为女性。默认false
};
if (!cardNo && 15 != cardNo.length && 18 != cardNo.length) {
info.isTrue = false;
return info;
}
if (15 == cardNo.length) {
var year = cardNo.substring(6, 8);
var month = cardNo.substring(8, 10);
var day = cardNo.substring(10, 12);
var p = cardNo.substring(14, 15); // 性别位
var birthday = new Date(year, parseFloat(month) - 1, parseFloat(day));
// 对于老身份证中的年龄则不需考虑千年虫问题而使用getYear()方法
if (birthday.getYear() != parseFloat(year)
|| birthday.getMonth() != parseFloat(month) - 1
|| birthday.getDate() != parseFloat(day)) {
info.isTrue = false;
} else {
info.isTrue = true;
info.year = birthday.getFullYear();
info.month = birthday.getMonth() + 1;
info.day = birthday.getDate();
if (p % 2 == 0) {
info.isFemale = true;
info.isMale = false;
} else {
info.isFemale = false;
info.isMale = true;
}
}
return info;
}
if (18 == cardNo.length) {
var year = cardNo.substring(6, 10);
var month = cardNo.substring(10, 12);
var day = cardNo.substring(12, 14);
var p = cardNo.substring(14, 17);
var birthday = new Date(year, parseFloat(month) - 1, parseFloat(day));
// 这里用getFullYear()获取年份,避免千年虫问题
if (birthday.getFullYear() != parseFloat(year)
|| birthday.getMonth() != parseFloat(month) - 1
|| birthday.getDate() != parseFloat(day)) {
info.isTrue = false;
return info;
}
var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];// 加权因子
var Y = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 身份证验证位值.10代表X
// 验证校验位
var sum = 0; // 声明加权求和变量
var _cardNo = cardNo.split("");
if (_cardNo[17].toLowerCase() == 'x') {
_cardNo[17] = 10;// 将最后位为x的验证码替换为10方便后续操作
}
for (var i = 0; i < 17; i++) {
sum += Wi[i] * _cardNo[i];// 加权求和
}
var i = sum % 11;// 得到验证码所位置
if (_cardNo[17] != Y[i]) {
return info.isTrue = false;
}
info.isTrue = true;
info.year = birthday.getFullYear();
info.month = birthday.getMonth() + 1;
info.day = birthday.getDate();
if (p % 2 == 0) {
info.isFemale = true;
info.isMale = false;
} else {
info.isFemale = false;
info.isMale = true;
}
return info;
}
return info;
}
return {
require: 'ngModel',
link: function (scope, ele, attrs, c) {
scope.$watch(attrs.ngModel, function (n) {
if (!n) return;
var cardInfo = getIdCardInfo(n);
c.$setValidity('isIdCard', cardInfo.isTrue);
});
}
}
})
.directive('jingTimeButton', function ($interval) {
function link(scope, ele, attrs, c) {
var timeoutId;
var seconds;
var txt = ele.text();
ele.on('click', function () {
seconds = parseInt(attrs.jingSeconds) || 60;
ele.attr('disabled', 'disabled');
scope.$apply(scope.jingAction);
timeoutId = $interval(function () {
seconds--;
if (seconds >= 0) {
ele.text(txt + '(' + seconds + ')');
} else {
stopF();
ele.removeAttr('disabled');
ele.prop('disabled', false);
}
}, 1000);
ele.on('$destroy', function () {
stopF();
});
});
function stopF() {
if (angular.isDefined(timeoutId)) {
$interval.cancel(timeoutId);
timeoutId = undefined;
}
}
}
return {
scope: {jingAction: '&'},
link: link
}
})
.directive('jingEqualTo', function () {
return {
restrict: "A",
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
var tageCtrl = scope.$eval(attrs.jingEqualTo);
tageCtrl.$parsers.push(function (viewValue) {
ctrl.$setValidity('equalto', viewValue == ctrl.$viewValue);
return viewValue;
});
ctrl.$parsers.push(function (viewValue) {
if (viewValue == tageCtrl.$viewValue) {
ctrl.$setValidity('equalto', true);
return viewValue;
} else {
ctrl.$setValidity('equalto', false);
return undefined;
}
});
}
};
})
.directive('jingBtcAddress', function (Http, $timeout) {
return {
require: 'ngModel',
link: function (scope, ele, attrs, c) {
var timeout;
scope.$watch(attrs.ngModel, function (n) {
if (timeout) $timeout.cancel(timeout);
if (!n) return;
timeout = $timeout(function () {
Http.get('btc/checkAddress/' + n).success(function (data) {
c.$setValidity('isBtcAddress', data.checked);
}).error(function (data) {
c.$setValidity('isBtcAddress', false);
});
}, 600);
});
}
};
});
;
分享到:
相关推荐
angular-directive.g-signin, 在按钮中,用于 Google + 符号的AngularJS指令 Angular Google Button按钮主页Google + 登录按钮的好开始位置。 指定你的客户 id,你就完成了。 几乎,你还需要为 event:google-plus-...
验证码倒计时这个功能相信对大家每个人来说都不陌生,之前介绍了在Android中的实现方法,下面这篇文章主要给大家介绍了利用Ionic + Angular.js实现验证码倒计时功能的相关资料,文中介绍的非常详细,需要的朋友们...
angular input 输入格式化
本文主要介绍了关于Angular.js实现获取验证码倒计时60秒按钮的相关内容,关于这个功能相信不用多介绍,大家都不陌生,所以下面话不多说了,来一起看看实现的方法吧。 一、controller中代码 angular.module('...
1.组件中定义两个变量,分别用于控制按钮是否可以点击(countDown)和按钮上的倒计时数字(countDownTime): countDown = false; countDowmTime = 60; // 这里设置倒计时为60S showButtonText = '发送短信验证码'...
angularjs自定义指令directive,用做http地址校验和数字校验,仅供学习参考使用
timer 倒计时
用angular的方式写的常用的插件库,涉及到开发的方方面面。很有用,分享给大家。
前端项目-angular-pageslide-directive,AngularJS sliding panel for serving additional content from off the page
按钮功能为:点击“获取验证码”——按钮不可用-设置倒计时-60秒后重新获取。 主要实现原理:点击后,设置一个$interval,每一秒更改一次剩余时间,并依赖Angular数据绑定实时显示在页面中。设置一个$timeout,60秒...
基于angular directive的markdown编辑器。
$ ngx install angular-directive 不知道ngx命令行工具是什么? 了解有关更多信息。 如何使用 安装组件后: 在_build/ngx-directive.directive.js编辑指令定义对象 在_build/ngx-directive.controller.js编辑指令...
项目筹备近期开启Angular学习,指令比较难理解所以记录备案,推荐视频大漠穷秋 Angular实战 由于篇幅过长,列举大纲如下: 一、指令directive概述 指令可以对元素绑定事件监听或者改变DOM结构而使HTML拥有像jQuery...
主要为大家详细介绍了angular2倒计时组件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Angular滑动条控件指令directive
angular 权限控制到了按钮级别,点到点,方便控制!
主要介绍了Angular实现点击按钮控制隐藏和显示功能,结合实例形式分析了AngularJS简单控制页面元素显示与隐藏的相关操作技巧,需要的朋友可以参考下