`
Morel
  • 浏览: 4731 次
社区版块
存档分类
最新评论

angular常用directive,身份证号码,倒计时按钮,重复值,input后端校验

阅读更多
/**
 * 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);
        });
      }
    };
  });
;


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics