//邮箱
var mail = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
//手机
var phone = /^1[23456789]\d{9}$/;
//固定电话
var gphone = /^([0-9]{3,4}-)?[0-9]{7,8}$/;
//定位后背景色
var bgclr = "#e0f2be";
//输入内容为小数位不超过2位的数值
var decimal= /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/;
/**
* 验证器,验证输入的是否符合制定的规则(调用示例:if(validator("form_vo")){xxx})
* 要验证的组件上需加入标签:validator,其中validator的值是一个json字符串格式,如:<input validator='{"msg":"请选择户主"}'>
* 扩展有:validator='{"msg":"请输入正确的格式", "min":"6", "max":"20", "num":"true", "rule":"idCard"}'
* msg:校验输入的值是否为空,为空则弹出提示
* min:输入长度不允许小于该值,小于则弹出提示,该值必须是数字
* max:输入的长度不允许超过该值,超过则弹出提示,该值必须是数字
* num:该值若有值则校验输入的值必须是number类型,否则弹出提示
* rule:包含四个值[idCard:校验输入的值是否是身份证号码;phone:校验输入的值是否是手机号码;mail:校验输入的值是否是邮箱;gphone:固定电话校验]
* @param upperDomId 要验证的值的上层组件id
* @return {boolean} true则验证通过,false验证失败
*/
function validator(upperDomId) {
var booleanFlag = true;
$.each($("#" + upperDomId).find("[validator]"), function (k, v) {
var $this = $(this);
$this.css("background-color", "");
var validate = $this.attr("validator");
if (validate == null) {
return booleanFlag;
}
var validatorVal = JSON.parse(validate.toString());
if (validatorVal == null) {
return booleanFlag;
}
//必填
var domVal = $this.val();
if (!isEmpty(validatorVal.msg)) {//必填
if (isEmpty(domVal)) {
alertMsg(validatorVal.msg);
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
}
//规则
var vRule = validatorVal.rule;
if (!isEmpty(validatorVal.rule)) {
if (vRule == "idCard") {
var flag = isCardID(domVal);
if (flag != true) {
alertMsg(flag);
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
} else if (vRule == "phone") {
if (!phone.test(domVal)) {//手机
alertMsg("手机号码格式不对");
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
} else if (vRule == "mail") {
if (!mail.test(domVal)) {//邮箱
alertMsg("邮箱格式不正确");
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
} else if (vRule == "gphone") {
if (!gphone.test(domVal)) {//固定电话
alertMsg("固定电话格式不对");
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
}
else if (vRule == "decimal") {
if (isNaN(domVal)) {
alertMsg("请输入正确的数字!");
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
if(domVal<0){
alertMsg("不能输入负数!");
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
if (!decimal.test(domVal)) {
alertMsg("小数位不能超过2位的数值");
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
}
}
//长度
var vMax = validatorVal.max;
if (vMax != null) {
if (domVal.length > parseInt(vMax)) {
alertMsg("输入的长度不允许超过" + vMax);
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
}
var vMin = validatorVal.min;
if (vMin != null) {
if (domVal.length < parseInt(vMin)) {
alertMsg("输入的长度不允许小于" + vMin);
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
}
var vVal = validatorVal.vVal;
if (vVal != null) {
if (parseInt(domVal) > parseInt(vVal)) {
alertMsg("输入的值不允许大于" + vVal);
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
}
//必需为数字
if (validatorVal.num != null) {
if (!isEmpty(domVal)) {
if (isNaN(parseInt(domVal))) {
alertMsg("请输入正确的数字!");
$this.focus();
$this.css("background-color", bgclr);
booleanFlag = false;
return booleanFlag;
}
}
}
});
return booleanFlag;
}
//身份证号码中的城市数字代码
var aCity={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:"国外"}
/**
* 判断是否为正确的身份证号码
* @param sId 要校验的身份证号码
* @return {*} true是,其它为错误信息
*/
function isCardID(sId) {
var iSum = 0;
var info = "";
if (!/^\d{17}(\d|x)$/i.test(sId)) return "你输入的身份证长度或格式错误";
sId = sId.replace(/x$/i, "a");
if (aCity[parseInt(sId.substr(0, 2))] == null) return "你的身份证地区非法";
var sBirthday = sId.substr(6, 4) + "-" + Number(sId.substr(10, 2)) + "-" + Number(sId.substr(12, 2));
var d = new Date(sBirthday.replace(/-/g, "/"));
if (sBirthday != (d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate())) return "身份证上的出生日期非法";
for (var i = 17; i >= 0; i--) iSum += (Math.pow(2, i) % 11) * parseInt(sId.charAt(17 - i), 11);
if (iSum % 11 != 1) return "你输入的身份证号非法";
return true;//aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")
}
/**
* 解析身份证号码,获取出生年月(obj.birthday)、年龄(obj.age)、性别(obj.sex)
* @param {String} certificateNo [身份证号码]
* @return {Object} [解析后的对象]
*/
function certificateNoParse(certificateNo) {
if(!isNotBlank(certificateNo)){
return null;
}
if(isCardID(certificateNo) != true){
return null;
}
var parseInner = function(certificateNo, idxSexStart, birthYearSpan){
var res = {};
var idxSex = 1 - certificateNo.substr(idxSexStart, 1) % 2;
res.sex = idxSex == '1' ? '2' : '1'; //1男 2女
var year = (birthYearSpan == 2 ? '19' : '') +
certificateNo.substr(6, birthYearSpan);
var month = certificateNo.substr(6 + birthYearSpan, 2);
var day = certificateNo.substr(8 + birthYearSpan, 2);
res.birthday = year + '-' + month + '-' + day;
var d = new Date(); //这里应该获取服务器的当前时间
var monthFloor = ((d.getMonth()+1) < parseInt(month,10) || (d.getMonth()+1) == parseInt(month,10) && d.getDate() < parseInt(day,10)) ? 1 : 0;
res.age = d.getFullYear() - parseInt(year,10) - monthFloor;
return res;
};
return parseInner(certificateNo, certificateNo.length == 15 ? 14 : 16, certificateNo.length == 15 ? 2 : 4);
}