/*
validform datatype extension
by sean during december 8, 2012 - february 20, 2013
for more information, please visit http://validform.rjboy.cn
扩展以下类型:
date:匹配日期
zh:匹配中文字符
dword:匹配双字节字符
money:匹配货币类型
ipv4:匹配ipv4地址
ipv6:匹配ipv6地址
num:匹配数值型
qq:匹配qq号码
unequal:当前值不能等于被检测的值,如可以用来检测新密码不能与旧密码一样
notvalued:当前值不能包含指定值,如密码不能包含用户名等的检测
min:多选框最少选择多少项
max:多选框最多不能超过多少项
byterange:判断字符长度,中文算两个字符
numrange:判断数值范围,如小于100大于10之间的数
daterange:判断日期范围
idcard:对身份证号码进行严格验证
*/
(function () {
if ($.datatype) {
$.extend($.tipmsg.w, {
"date": "请填写日期!",
"zh": "请填写中文!",
"zh2-5": "请填写2到5位中文!",
"dword": "请填写双字节字符!",
"money": "请填写货币值!",
"ipv4": "请填写ip地址!",
"ipv6": "请填写ipv6地址!",
"num": "请填写数值!",
"qq": "请填写qq号码!",
"unequal": "值不能相等!",
"notvalued": "不能含有特定值!",
"idcard": "身份证号码不对!"
});
$.extend($.datatype, {
/*
reference http://blog.csdn.net/lxcnn/article/details/4362500;
日期格式可以是:20120102 / 2012.01.02 / 2012/01/02 / 2012-01-02
时间格式可以是:10:01:10 / 02:10
如 2012-01-02 02:10
2012-01-02
*/
"date": /^(?:(?:1[6-9]|[2-9][0-9])[0-9]{2}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:(?:1[6-9]|[2-9][0-9])(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)([-/.]?)0?2\2(?:29))(\s+([01][0-9]:|2[0-3]:)?[0-5][0-9]:[0-5][0-9])?$/,
//匹配中文字符;
"zh": /^[\u4e00-\u9fa5]+$/,
"zh2-5": /^[\u4e00-\u9fa5]{2,5}$/,
//匹配双字节字符;
"dword": /^[^\x00-\xff]+$/,
//货币类型;
"money": /^([\u0024\u00a2\u00a3\u00a4\u20ac\u00a5\u20b1\20b9\uffe5]\s*)(\d+,?)+\.?\d*\s*$/,
//匹配ipv4地址;
"ipv4": /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$/,
/*
匹配ipv6地址;
reference http://forums.intermapper.com/viewtopic.php?t=452;
*/
"ipv6": /^\s*((([0-9a-fa-f]{1,4}:){7}([0-9a-fa-f]{1,4}|:))|(([0-9a-fa-f]{1,4}:){6}(:[0-9a-fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-fa-f]{1,4}:){5}(((:[0-9a-fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-fa-f]{1,4}:){4}(((:[0-9a-fa-f]{1,4}){1,3})|((:[0-9a-fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-fa-f]{1,4}:){3}(((:[0-9a-fa-f]{1,4}){1,4})|((:[0-9a-fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-fa-f]{1,4}:){2}(((:[0-9a-fa-f]{1,4}){1,5})|((:[0-9a-fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-fa-f]{1,4}:){1}(((:[0-9a-fa-f]{1,4}){1,6})|((:[0-9a-fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-fa-f]{1,4}){1,7})|((:[0-9a-fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,
//数值型;
"num": /^(\d+[\s,]*)+\.?\d*$/,
//qq号码;
"qq": /^[1-9][0-9]{4,}$/,
/*
参数gets是获取到的表单元素值,
obj为当前表单元素,
curform为当前验证的表单,
datatype为内置的一些正则表达式的引用。
*/
"unequal": function (gets, obj, curform, datatype) {
/*
当前值不能与指定表单元素的值一样,如新密码不能与旧密码一样,密码不能设置为用户名等
注意需要通过绑定with属性来指定要比较的表单元素,可以是clas,id或者是name属性值
eg.
eg1.
eg2.
eg3.
也可以用来验证不能与with指定的值相等
当上面根据class,id和name都查找不到对象时,会直接跟with的值比较
eg4.
该文本框的值不能等于100
*/
var withele = $.trim(obj.attr("with"));
var val = curform.find(withele + ",[name='" + withele + "']").val() || withele;
if (gets == $.trim(val)) {
return false;
}
},
"notvalued": function (gets, obj, curform, datatype) {
/*
当前文本框的值不能含有指定文本框的值,如注册时设置的密码里不能包含用户名
注意需要给表单元素绑定with属性来指定要比较的表单元素,可以是clas,id或者是name属性值
eg.
也可以用来验证不能包含with指定的值
当上面根据class,id和name都查找不到对象时,会直接跟with的值比较
eg2.
要求不能含有"validform"字符
*/
var withele = $.trim(obj.attr("with"));
var val = curform.find(withele + ",[name='" + withele + "']").val() || withele;
if (gets.indexof($.trim(val)) != -1) {
return false;
}
},
"min": function (gets, obj, curform, datatype) {
/*
checkbox最少选择n项
注意需要给表单元素绑定min属性来指定是至少需要选择几项,没有绑定的话使用默认值
eg.
*/
var minim = ~~obj.attr("min") || 2,
numselected = curform.find("input[name='" + obj.attr("name") + "']:checked").length;
return numselected >= minim ? true : "请至少选择" + minim + "项!";
},
"max": function (gets, obj, curform, datatype) {
/*
checkbox最多选择n项
注意需要给表单元素绑定max属性来指定是最多需要选择几项,没有绑定的话使用默认值
eg.
*/
var atmax = ~~obj.attr("max") || 2,
numselected = curform.find("input[name='" + obj.attr("name") + "']:checked").length;
if (numselected == 0) {
return false;
} else if (numselected > atmax) {
return "最多只能选择" + atmax + "项!";
}
return true;
},
"byterange": function (gets, obj, curform, datatype) {
/*
判断字符长度,中文算两个字符
注意需要给表单元素绑定max,min属性来指定最大或最小允许的字符长度,没有绑定的话使用默认值
*/
var dregx = /[^\x00-\xff]/g;
var maxim = ~~obj.attr("max") || 100000000,
minim = ~~obj.attr("min") || 0;
getslen = gets.replace(dregx, "00").length;
if (getslen > maxim) {
return "输入字符不能多于" + maxim + "个,中文算两个字符!";
}
if (getslen < minim) {
return "输入字符不能少于" + minim + "个,中文算两个字符!";
}
return true;
},
"numrange": function (gets, obj, curform, datatype) {
/*
判断数值范围
注意需要给表单元素绑定max,min属性来指定最大或最小可输入的值,没有绑定的话使用默认值
*/
var maxim = ~~obj.attr("max") || 100000000,
minim = ~~obj.attr("min") || 0;
gets = gets.replace(/\s*/g, "").replace(/,/g, "");
if (!/^\d+\.?\d*$/.test(gets)) {
return "只能输入数字!";
}
if (gets < minim) {
return "值不能小于" + minim + "!";
} else if (gets > maxim) {
return "值不能大于" + maxim + "!";
}
return true;
},
"daterange": function (gets, obj, curform, datatype) {
/*
判断日期范围
注意需要给表单元素绑定max或min属性,或两个同时绑定来指定最大或最小可输入的日期
日期格式:2012/12/29 或 2012-12-29 或 2012.12.29 或 2012,12,29
*/
var maxim = new date(obj.attr("max").replace(/[-\.,]/g, "/")),
minim = new date(obj.attr("min").replace(/[-\.,]/g, "/")),
gets = new date(gets.replace(/[-\.,]/g, "/"));
if (!gets.getdate()) {
return "日期格式不对!";
}
if (gets > maxim) {
return "日期不能大于" + obj.attr("max");
}
if (gets < minim) {
return "日期不能小于" + obj.attr("min");
}
return true;
},
"idcard": function (gets, obj, curform, datatype) {
/*
该方法由网友提供;
对身份证进行严格验证;
*/
var wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];// 加权因子;
var validecode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 身份证验证位值,10代表x;
if (gets.length == 15) {
return isvaliditybrithby15idcard(gets);
} else if (gets.length == 18) {
var a_idcard = gets.split("");// 得到身份证数组
if (isvaliditybrithby18idcard(gets) && istruevalidatecodeby18idcard(a_idcard)) {
return true;
}
return false;
}
return false;
function istruevalidatecodeby18idcard(a_idcard) {
var sum = 0; // 声明加权求和变量
if (a_idcard[17].tolowercase() == 'x') {
a_idcard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作
}
for (var i = 0; i < 17; i++) {
sum += wi[i] * a_idcard[i];// 加权求和
}
valcodeposition = sum % 11;// 得到验证码所位置
if (a_idcard[17] == validecode[valcodeposition]) {
return true;
}
return false;
}
function isvaliditybrithby18idcard(idcard18) {
var year = idcard18.substring(6, 10);
var month = idcard18.substring(10, 12);
var day = idcard18.substring(12, 14);
var temp_date = new date(year, parsefloat(month) - 1, parsefloat(day));
// 这里用getfullyear()获取年份,避免千年虫问题
if (temp_date.getfullyear() != parsefloat(year) || temp_date.getmonth() != parsefloat(month) - 1 || temp_date.getdate() != parsefloat(day)) {
return false;
}
return true;
}
function isvaliditybrithby15idcard(idcard15) {
var year = idcard15.substring(6, 8);
var month = idcard15.substring(8, 10);
var day = idcard15.substring(10, 12);
var temp_date = new date(year, parsefloat(month) - 1, parsefloat(day));
// 对于老身份证中的你年龄则不需考虑千年虫问题而使用getyear()方法
if (temp_date.getyear() != parsefloat(year) || temp_date.getmonth() != parsefloat(month) - 1 || temp_date.getdate() != parsefloat(day)) {
return false;
}
return true;
}
}
});
} else {
settimeout(arguments.callee, 10);
}
})();