JavaScript實(shí)現(xiàn)身份證驗(yàn)證代碼
18位身份證號(hào)碼各位的含義
1-2位省、自治區(qū)、直轄市代碼;
3-4位地級(jí)市、盟、自治州代碼;
5-6位縣、縣級(jí)市、區(qū)代碼;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位為順序號(hào),其中17位男為單數(shù),女為雙數(shù);
18位為校驗(yàn)碼,0-9和X,由公式隨機(jī)產(chǎn)生;
舉例:
340523 1980 0101 0013這個(gè)身份證號(hào)的含義:
34為安徽省
05為馬鞍山市
23為和縣
19800101為出生日期(1980年1月1日)
001為順序號(hào)(1為單數(shù),代表為男性)
3為驗(yàn)證碼
行政區(qū)劃代碼
最新縣及縣以上行政區(qū)劃代碼(截止2014年10月31日)
北京市 (110000 BJ)
天津市 (120000 TJ)
河北省 (130000 HE)
山西省 (140000 SX)
內(nèi)蒙古自治區(qū) (150000 NM)
遼寧省 (210000 LN)
吉林省 (220000 JL)
黑龍江省 (230000 HL)
上海市 (310000 SH)
江蘇省 (320000 JS)
浙江省 (330000 ZJ)
安徽省 (340000 AH)
福建省 (350000 FJ)
江西省 (360000 JX)
山東省 (370000 SD)
河南省 (410000 HA)
湖北省 (420000 HB)
湖南省 (430000 HN)
廣東省 (440000 GD)
廣西壯族自治區(qū) (450000 GX)
海南省 (460000 HI)
重慶市 (500000 CQ)
四川省 (510000 SC)
貴州省 (520000 GZ)
云南省 (530000 YN)
西藏自治區(qū) (540000 XZ)
陜西省 (610000 SN)
甘肅省 (620000 GS)
青海省 (630000 QH)
寧夏回族自治區(qū) (640000 NX)
新疆維吾爾自治區(qū) (650000 XJ)
臺(tái)灣省 (710000 Tw)
香港特別行政區(qū) (810000 HK)
澳門特別行政區(qū) (820000 Mo)
身份證第18位(校驗(yàn)碼)的計(jì)算方法
將身份證號(hào)碼前面的17位數(shù)分別乘以不同的系數(shù);
從第一位到第十七位的系數(shù)分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
將這17位數(shù)字和系數(shù)相乘的結(jié)果相加;
用加出來和除以11,看余數(shù)是多少;
余數(shù)只可能有0-1-2-3-4-5-6-7-8-9-10這11個(gè)數(shù)字;
其分別對(duì)應(yīng)的最后一位身份證的號(hào)碼為1-0-X-9-8-7-6-5-4-3-2
通過上面得知如果余數(shù)是2,就會(huì)在身份證的第18位數(shù)字上出現(xiàn)羅馬數(shù)字的Ⅹ。如果余數(shù)是10,身份證的最后一位號(hào)碼就是2。
舉例:
某男性的身份證號(hào)碼是340523198001010013。我們要看看這個(gè)身份證是不是合法的身份證。
首先我們得出前17位的乘積和:
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2) = 185
然后再求余:
185 % 11 = 9
最后通過對(duì)應(yīng)規(guī)則就可以知道余數(shù)9對(duì)應(yīng)的數(shù)字是3。所以,可以判定這是一個(gè)合格的身份證號(hào)碼。
JavaScript校驗(yàn)18位身份證
var ID = '340523198001010013';
首先校驗(yàn)位數(shù)是否是18位:
if(!/^\d{17}(\d|x)$/i.test(ID)) return false;
// \d 匹配數(shù)字
// ^ 匹配開始
// $ 匹配結(jié)尾
// i 不區(qū)分大小寫
// {17} 匹配17次
// \d|x 匹配數(shù)字或x
然后校驗(yàn)開頭兩位是否是合法的省(直轄市/自治區(qū)):
if(city[ID.substr(0,2)] === undefined) return "非法地區(qū)";
// stringObject.substr(start,length) 方法可在字符串中抽取從 start 下標(biāo)開始的指定數(shù)目的字符
// 訪問對(duì)象屬性時(shí)除了可以用點(diǎn)(.)語(yǔ)法外,也可以用中括號(hào)([]),用中括號(hào)時(shí)更靈活
然后再校驗(yàn)出生日期是否合法:
var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2)); var d = new Date(birthday); var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate()); var currentTime = new Date().getTime(); var time = d.getTime(); if(time >= currentTime || birthday !== newBirthday) return '非法生日'; // 獲取身份證的年月日,然后再 new 一個(gè) Date,再對(duì)比這兩個(gè)日期是否一致 // 這里用Number()主要是因?yàn)樯矸葑C的日期是帶0的,而new Date()出來的日期是不帶0的,Number()之后就都不帶0了
最后判斷校驗(yàn)碼是否正確:
var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
var sum = 0, i, residue;
for(i=0; i<17; i++) {
sum += ID.substr(i, 1) * arrInt[i];
}
residue = arrCh[sum % 11];
if (residue !== ID.substr(17, 1)) '非法證號(hào)';
如果以上校驗(yàn)都通過了,則是一個(gè)合法的身份證號(hào);
完整代碼
<script>
function checkID(ID) {
if(typeof ID !== 'string') return '非法字符串';
var city = {11:"北京",12:"天津",13:"河北",14:"山西",15:"內(nèi)蒙古",21:"遼寧",22:"吉林",23:"黑龍江 ",31:"上海",32:"江蘇",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山東",41:"河南",42:"湖北 ",43:"湖南",44:"廣東",45:"廣西",46:"海南",50:"重慶",51:"四川",52:"貴州",53:"云南",54:"西藏 ",61:"陜西",62:"甘肅",63:"青海",64:"寧夏",65:"新疆",71:"臺(tái)灣",81:"香港",82:"澳門",91:"國(guó)外"};
var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
var d = new Date(birthday);
var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());
var currentTime = new Date().getTime();
var time = d.getTime();
var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
var sum = 0, i, residue;
if(!/^\d{17}(\d|x)$/i.test(ID)) return '非法身份證';
if(city[ID.substr(0,2)] === undefined) return "非法地區(qū)";
if(time >= currentTime || birthday !== newBirthday) return '非法生日';
for(i=0; i<17; i++) {
sum += ID.substr(i, 1) * arrInt[i];
}
residue = arrCh[sum % 11];
if (residue !== ID.substr(17, 1)) return '非法身份證哦';
return city[ID.substr(0,2)]+","+birthday+","+(ID.substr(16,1)%2?" 男":"女")
}
</script>
- JS支持帶x身份證號(hào)碼驗(yàn)證函數(shù)
- js身份證驗(yàn)證超強(qiáng)腳本
- javascript或asp實(shí)現(xiàn)的判斷身份證號(hào)碼是否正確兩種驗(yàn)證方法
- javascript 身份證號(hào)碼驗(yàn)證函數(shù)(可辨真?zhèn)?,支?5或18位身份證號(hào))測(cè)試誤差為0
- javascript身份證驗(yàn)證代碼
- js實(shí)現(xiàn)二代身份證號(hào)碼驗(yàn)證詳解
- 如何用javascript正則表達(dá)式驗(yàn)證身份證號(hào)碼是否合法
- JavaScript正則表達(dá)式驗(yàn)證身份證號(hào)碼是否合法(兩種方法)
- js驗(yàn)證真實(shí)姓名與身份證號(hào)是否匹配
相關(guān)文章
CodeMirror2 IE7/IE8 下面未知運(yùn)行時(shí)錯(cuò)誤的解決方法
最近用CodeMirror2作后臺(tái)的模板編輯器,在IE9、Firefox下面沒有問題。到了IE7、IE8下面,textarea里面的代碼就顯示不出來了。搜索了好多,終于找到原因2012-03-03
js 提取某()特殊字符串長(zhǎng)度的實(shí)例
下面小編就為大家分享一篇js 提取某()特殊字符串長(zhǎng)度的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
原生javascript實(shí)現(xiàn)無(wú)間縫滾動(dòng)示例
原生javascript無(wú)間縫滾動(dòng)目前支持的是豎向與橫向滾動(dòng),下面有個(gè)不錯(cuò)的示例,大家可以參考下2014-01-01
Bootstrap零基礎(chǔ)學(xué)習(xí)第一課之模板
這篇文章主要為大家詳細(xì)介紹了Bootstrap零基礎(chǔ)學(xué)習(xí)第一課:模板,感興趣的小伙伴們可以參考一下2016-07-07
JavaScript?進(jìn)階問題列表(各種js代碼段1-65)
從基礎(chǔ)到進(jìn)階,測(cè)試你有多了解?JavaScript,刷新你的知識(shí),或者幫助你的?coding?面試!?:muscle:?:rocket:?我每周都會(huì)在這個(gè)倉(cāng)庫(kù)下更新新的問題2024-11-11
JavaScript+canvas實(shí)現(xiàn)五子棋游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript+canvas實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
js實(shí)現(xiàn)iGoogleDivDrag模塊拖動(dòng)層拖動(dòng)特效的方法
這篇文章主要介紹了js實(shí)現(xiàn)iGoogleDivDrag模塊拖動(dòng)層拖動(dòng)特效的方法,實(shí)例分析了javascript操作拖動(dòng)層的技巧,需要的朋友可以參考下2015-03-03
js實(shí)現(xiàn)點(diǎn)擊左右按鈕輪播圖片效果實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)點(diǎn)擊左右按鈕輪播圖片效果的方法,涉及click事件相應(yīng)、animate方法等使用技巧,需要的朋友可以參考下2015-01-01

