1. function IDCard(ID) {
    2. var me = this;
    3. this.checkCode = new Array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2);
    4. this.ID;
    5. this.errNum = 0;
    6. this.err = {
    7. 1 : "身份证校验不符合求和模11=1这个等式",
    8. 2 : "身份证最后一位校验位有误",
    9. 3 : "身份证位数不正确",
    10. 4 : "年份错误",
    11. 5 : "月份错误",
    12. 6 : "日错误"
    13. };
    14. this.err_msg = function() {
    15. return (0 !== this.errNum) ? this.err[this.errNum] : null;
    16. };
    17. this.check = function(ID) {
    18. this.errNum = 0;
    19. this.ID = ID;
    20. if (cardValidate()) {
    21. if (!aiCheck()) this.errNum = 1;
    22. if (!LastByteCheck()) this.errNum = 2;
    23. return (0 === this.errNum) ? true: false;
    24. } else {
    25. return false;
    26. }
    27. };
    28. function getNum(str) {
    29. var re = /^[0]*([0-9]*)$/;
    30. str.match(re);
    31. return parseInt(RegExp.$1,10);
    32. }
    33. //对身份证位数,出生日期,初步验证
    34. function cardValidate() {
    35. var re = /^[0-9x]{15,18}$/i;
    36. if (!re.test(me.ID)) {
    37. me.errNum = 7;
    38. return false;
    39. }
    40. if (15 == me.ID.length || 18 == me.ID.length) {
    41. var realLen = 0;
    42. if (18 == me.ID.length) realLen = 2;
    43. var year = parseInt(me.ID.substr(6, 2 + realLen),10);
    44. //console.log(year, year.length)
    45. var month = getNum(me.ID.substr(8 + realLen, 2));
    46. var day = parseInt(me.ID.substr(10 + realLen, 2),10);
    47. if (4 == (year+'').length) if (year < 1900 || year > 2050) me.errNum = 4;
    48. if (month < 1 || month > 12) me.errNum = 5;
    49. if (day < 1 || day > 31) me.errNum = 6;
    50. return 0 === me.errNum;
    51. } else {
    52. me.errNum = 3;
    53. return false;
    54. }
    55. }
    56. //总和模11应该等于1
    57. var aiCheck = function() {
    58. var sum = 0;
    59. for (var i = 1; i <= me.ID.length; i++) {
    60. var ai = me.ID.substr(me.ID.length - i, 1);
    61. ai = (ai.toLowerCase() == 'x') ? 10 : ai;
    62. var wi = Math.pow(2, i - 1) % 11;
    63. sum += parseInt(ai,10) * wi;
    64. }
    65. return 1 == sum % 11;
    66. };
    67. //最后一位校验,这个可以和aiCheck合在一起,减少一次循环
    68. var LastByteCheck = function() {
    69. var sum = 0;
    70. for (var i = 2; i <= me.ID.length; i++) {
    71. var ai = me.ID.substr(me.ID.length - i, 1);
    72. ai = (ai.toLowerCase() == 'x') ? 10 : ai;
    73. var wi = Math.pow(2, i - 1) % 11;
    74. sum += parseInt(ai,10) * wi;
    75. }
    76. var checkCodeIndex = sum % 11;
    77. var c = me.ID.substr(me.ID.length - 1, 1);
    78. //alert(c+"=="+me.checkCode[checkCodeIndex]);
    79. return c == me.checkCode[checkCodeIndex];
    80. };
    81. }
    82. /*
    83. check(ID)验证身份证号码
    84. 返回值:0 : "是正确的身份证号"
    85. 1 : "身份证校验不符合求和模11=1这个等式",
    86. 2 : "身份证最后一位校验位有误",
    87. 3 : "身份证位数不正确",
    88. 4 : "年份错误",
    89. 5 : "月份错误",
    90. 6 : "日错误"
    91. */
    92. function check(ID) {
    93. var arr = [
    94. 'ok',
    95. "身份证校验不符合求和模11=1这个等式",
    96. "身份证最后一位校验位有误",
    97. "身份证位数不正确",
    98. "年份错误",
    99. "月份错误",
    100. "日错误",
    101. "格式错误"
    102. ];
    103. var ck = new IDCard();
    104. ck.check(ID);
    105. return [ck.errNum, arr[ck.errNum] ];
    106. }
    107. var sfzh = '1234567890X';
    108. console.log(check(sfzh))