这个已经有牛人写出来了啊。不记得出处了 - -
<script>
function checkIdcard2(idcard){
var Errors=new Array(
"%u9a8c%u8bc1%u901a%u8fc7!",//这里是错误提示,因为我的编码才改成这样的
"%u8eab%u4efd%u8bc1%u53f7%u7801%u4f4d%u6570%u4e0d%u5bf9!",
"%u8eab%u4efd%u8bc1%u53f7%u7801%u51fa%u751f%u65e5%u671f%u8d85%u51fa%u8303%u56f4%u6216%u542b%u6709%u975e%u6cd5%u5b57%u7b26!",
"%u8eab%u4efd%u8bc1%u53f7%u7801%u6821%u9a8c%u9519%u8bef!",
"%u8eab%u4efd%u8bc1%u5730%u533a%u975e%u6cd5!"
);
var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",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:"台湾",81:"香港",82:"澳门",91:"国外"} var idcard,Y,JYM;
var S,M;
var idcard_array = new Array();
idcard_array = idcard.split("");
//地区检验
if(area[parseInt(idcard.substr(0,2))]==null) 
{
alert(unescape(Errors[4]));
return false ; 
}
//身份号码位数及格式检验
switch(idcard.length){
case 15:
if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
} else {
ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
}
if(ereg.test(idcard)) return true;
else
{
alert(unescape(Errors[2]));
return false; 

break;
case 18:
//18位身份号码检测
//出生日期的合法性检查 
//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
} else {
ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
}
if(ereg.test(idcard)){//测试出生日期的合法性
//计算校验位
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
+ parseInt(idcard_array[7]) * 1 
+ parseInt(idcard_array[8]) * 6
+ parseInt(idcard_array[9]) * 3 ;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substr(Y,1);//判断校验位
if(M == idcard_array[17]) return true; //检测ID的校验位
else
{ alert(unescape(Errors[3]));
return false;
}
}
else 
{
alert(unescape(Errors[2]));
return false; 
}
break;
default:
alert(unescape(Errors[1]));
return false ; 
break;
}
}
</script>

解决方案 »

  1.   

    <SCRIPT>
    var VR={render:function(el,isOk,msg){
    if(!isOk) alert(msg);
    }};
    /**
    * idnumber(e,el,renderResult): 身份证验证
    */
    var idnumber=function(e,el,renderResult){
    el=el||this;
    //VH.prepare4Vld(el);//trim等动作
    //VH.dbc2sbcValue(el);//全码转半码
    var val=el.value;
    var isOk=(val=="");
    if(!isOk){
    var val=el.value;
    if((/^\d{15}$/).test(val)) isOk=true;
    else if((/^\d{17}[0-9xX]$/).test(val)) {
    var vs = "1,0,x,9,8,7,6,5,4,3,2".split(",");
    var ps = "7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2".split(",");
    var ss=val.toLowerCase().split("");
    var r=0;
    for(var i=0;i<17;i++){
    r += ps[i]*ss[i];
    }
    isOk=(vs[r % 11]==ss[17]);
    }
    }
    if(renderResult!=false) VR.render(el,isOk,"请检查您输入的身份证号码。");//将正确或错误的结果显示到页面
    return isOk;
    };
    </SCRIPT><INPUT onblur="idnumber(null,this);">
    更多验证,可以参考:
    http://download.csdn.net/source/997377