校验方法一: 

/*
         * 身份证15位编码规则:dddddd yymmdd xx p
         * dddddd:6位地区编码
         * yymmdd: 出生年(两位年)月日,如:910215
         * xx: 顺序编码,系统产生,无法确定
         * p: 性别,奇数为男,偶数为女
         *
         * 身份证18位编码规则:dddddd yyyymmdd xxx y
         * dddddd:6位地区编码
         * yyyymmdd: 出生年(四位年)月日,如:19910215
         * xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女
         * y: 校验码,该位数值可通过前17位计算获得
         *
         * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
         * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
         * 如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替
         * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
         * i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置
        */
         function validateIdCard(idCard){
            //15位和18位身份证号码的正则表达式
            var regIdCard=/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
 
            //如果通过该验证,说明身份证格式正确,但准确性还需计算
            if(regIdCard.test(idCard)){
                if(idCard.length==18){
                    var idCardWi=new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里
                    var idCardY=new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后,可能产生的11位余数、验证码,也保存成数组
                    var idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
                    for(var i=0;i<17;i++){
                        idCardWiSum+=idCard.substring(i,i+1)*idCardWi[i];
                    }
                    var idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
                    var idCardLast=idCard.substring(17);//得到最后一位身份证号码
                    //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
                    if(idCardMod==2){
                        if(idCardLast=="X"||idCardLast=="x"){
                            alert("恭喜通过验证啦!");
                        }else{
                            alert("身份证号码错误!");
                        }
                    }else{
                        //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
                        if(idCardLast==idCardY[idCardMod]){
                            alert("恭喜通过验证啦!");
                        }else{
                            alert("身份证号码错误!");
                        }
                    }
                }
            }else{
                alert("身份证格式不正确!");
            }
        }

校验方法2:

/*
check(ID)验证身份证号码
返回值:0 : "是正确的身份证号"
        1 : "身份证校验不符合求和模11=1这个等式",
        2 : "身份证最后一位校验位有误",
        3 : "身份证位数不正确",
        4 : "年份错误",
        5 : "月份错误",
        6 : "日错误"
        
*/

function check(ID) {
    var ck = new IDCard();
    ck.check(ID);
    return ck.errNum;
}

function IDCard(ID) {
    var me = this;
    this.checkCode = new Array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2);
    this.ID;
    this.errNum = 0;
    this.err = {
        1 : "身份证校验不符合求和模11=1这个等式",
        2 : "身份证最后一位校验位有误",
        3 : "身份证位数不正确",
        4 : "年份错误",
        5 : "月份错误",
        6 : "日错误"
    };
    this.err_msg = function() {
        return (0 !== this.errNum) ? this.err[this.errNum] : null;
    };
    this.check = function(ID) {
        this.errNum = 0;
        this.ID = ID;
        if (cardValidate()) {
            if (!aiCheck()) this.errNum = 1;
            if (!LastByteCheck()) this.errNum = 2;
            return (0 === this.errNum) ? true: false;
        } else {
            return false;
        }
    };
    function getNum(str) {
        var re = /^[0]*([0-9]*)$/;
        str.match(re);
        return parseInt(RegExp.$1,10);
    }
    //对身份证位数,出生日期,初步验证
    function cardValidate() {
        var re = /^[0-9x]{15,18}$/i;
        if (!re.test(me.ID)) {
            me.errNum = 7;
            return false;
        }
        if (15 == me.ID.length || 18 == me.ID.length) {
            var realLen = 0;
            if (18 == me.ID.length) realLen = 2;
            var year = parseInt(me.ID.substr(6, 2 + realLen),10);
            var month = getNum(me.ID.substr(8 + realLen, 2));
            var day = parseInt(me.ID.substr(10 + realLen, 2),10);
            if (4 == year.length) if (year < 1900 || year > 2050) me.errNum = 4;
            if (month < 1 || month > 12) me.errNum = 5;
            if (day < 1 || day > 31) me.errNum = 6;
            return 0 === me.errNum;
        } else {
            me.errNum = 3;
            return false;
        }
    }
    //总和模11应该等于1
    var aiCheck = function() {
        var sum = 0;
        for (var i = 1; i <= me.ID.length; i++) {
            var ai = me.ID.substr(me.ID.length - i, 1);
            ai = (ai.toLowerCase() == 'x') ? 10 : ai;
            var wi = Math.pow(2, i - 1) % 11;
            sum += parseInt(ai,10) * wi;
        }
        return 1 == sum % 11;
    };
    //最后一位校验,这个可以和aiCheck合在一起,减少一次循环
    var LastByteCheck = function() {
        var sum = 0;
        for (var i = 2; i <= me.ID.length; i++) {
            var ai = me.ID.substr(me.ID.length - i, 1);
            ai = (ai.toLowerCase() == 'x') ? 10 : ai;
            var wi = Math.pow(2, i - 1) % 11;
            sum += parseInt(ai,10) * wi;
        }
        var checkCodeIndex = sum % 11;
        var c = me.ID.substr(me.ID.length - 1, 1);
        //alert(c+"=="+me.checkCode[checkCodeIndex]);
        return c == me.checkCode[checkCodeIndex];
    };
}
if(document.form1.csrq.value==""){ 
alert("请填写出生日期!"); 
document.form1.csrq.focus(); 
return false; 
} 
if(document.form1.csrq.value==""){ 
alert("请填写出生日期!"); 
document.form1.csrq.focus(); 
return false; 
}else{ 
if(document.form1.csrq.value.length!=8){ 
alert("出生日期必须为8位!"); 
document.form1.csrq.focus(); 
return false; 
} 
if(document.form1.sfzh.value.length==18){ 
var sfzh =document.form1.sfzh.value; 
if(document.form1.csrq.value!=sfzh.substring(6,14)){ 
alert("出生日期与身份证号不一致!"); 
document.form1.csrq.focus(); 
return false; 
} 
} 
if(document.form1.sfzh.value.length==15){ 
var sfzh =document.form1.sfzh.value; 
if(document.form1.csrq.value!='19'+sfzh.substring(6,12)){ 
alert("出生日期与身份证号不一致!"); 
document.form1.csrq.focus(); 
return false; 
} 
} 
} 
if(!isIdCardNo(document.form1.sfzh.value)){ 
document.form1.sfzh.focus(); 
return false; 
} 
function isNN(num){ 
var badChar ="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //大写字母 
badChar += "abcdefghijklmnopqrstuvwxyz"; //小写字母 
badChar += "0123456789"; //数字 
badChar += " "+" ";//半角与全角空格 
badChar += "`~!@#$%^&()-_=+]\\|:;\"\\'<,>?/";//特殊符号 
var c; 
//for(var i=0;i<name.length;i++){//依次判断name中的字符 
c=num.charAt(0);//取出num中的第1个字符 
if(badChar.indexOf(c) != -1){ //如果当前字符在badChar中找到了匹配字符,说明它不是汉字 
return false; 
} else{ 
return true; 
} 
} 
function isIdCardNo(num) 
{ 
// if (isNaN(num)) {alert("输入的不是数字!"); return false;} 
var len = num.length, re; 
if (len == 15){ 
re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/); 
}else if (len == 18){ 
re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/); 
}else if (isNN(num)){ 
return true; 
}else { 
alert("如果是军官号请输入完整,例如:某军官证号为政字第123456号;如果是身份证号请检测您输入的位数,必须为15位或18位。"); 
return false; 
} 
var a = num.match(re); 
if (a != null) 
{ 
if (len==15) 
{ 
var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]); 
var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5]; 
} 
if (len == 18) 
{ 
var D = new Date(a[3]+"/"+a[4]+"/"+a[5]); 
var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5]; 
} 
if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;} 
} 
return true; 
}