/** * 此文件的头部注释 */ /*global jquery: false */ (function ($) { //覆盖掉系统的date验证 $.validator.methods.date = function () { return true; }; //添加验证码远程验证 $.validator.addmethod('captcha', function (value, ele, param) { var result = false; if (event.type != 'keyup') { $.ajaxpreventcsrf({ url: param['url'], type: 'post', async: false, data: { captcha: value }, success: function (data) { result = data; } }); } return result; }); $.validator.unobtrusive.adapters.add('captcha', ['url'], function (options) { options.rules['captcha'] = { url: options.params.url }; options.messages['captcha'] = options.message; }); //添加自定义validator的日期时间格式客户端验证 $.validator.addmethod('datetime', function (value, element) { var pattern = /^(?:(?!0000)[0-9]{4}(\/|-|\.|\u5e74)(?:(?:0?[1-9]|1[0-2])(\/|-|\.|\u6708)(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])(\/|-|\.|\u6708)(?:29|30)|(?:0?[13578]|1[02])(\/|-|\.|\u6708)31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)(\/|-|\.|\u5e74)0?2(\/|-|\.|\u6708)29)(\u65e5)?(\s((0?[0-9])|1[0-9]|2[0-3])\:([0-5]?[0-9])(\:([0-5]?[0-9]))?)?$/; return this.optional(element) || pattern.test(value); }); $.validator.unobtrusive.adapters.addbool('datetime'); //添加自定义validator的日期格式客户端验证 $.validator.addmethod('localdate', function (value, element) { var pattern = /^(?:(?!0000)[0-9]{4}(\/|-|\.|\u5e74)(?:(?:0?[1-9]|1[0-2])(\/|-|\.|\u6708)(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])(\/|-|\.|\u6708)(?:29|30)|(?:0?[13578]|1[02])(\/|-|\.|\u6708)31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)(\/|-|\.|\u5e74)0?2(\/|-|\.|\u6708)29)(\u65e5)?$/; return this.optional(element) || pattern.test(value); }); $.validator.unobtrusive.adapters.addbool('localdate'); //添加自定义validator的日期范围客户端验证 $.validator.addmethod('daterange', function (value, element, params) { var comparedate = function (startdate, enddate) { if (string(startdate).length == 0 || string(enddate).length == 0) { return false; } var reg = new regexp("\\-", "gi"), start = new date(startdate.replace(reg, "/")), end = new date(enddate.replace(reg, "/")); return end - start >= 0; }; return this.optional(element) || (comparedate(params.minvalue, value) && comparedate(value, params.maxvalue)); }); //添加自定义unobtrusive的日期范围客户端验证 $.validator.unobtrusive.adapters.add('daterange', ['minvalue', 'maxvalue'], function (options) { options.rules['daterange'] = { minvalue: options.params.minvalue, maxvalue: options.params.maxvalue }; options.messages['daterange'] = options.message; }); //添加自定义比较客户端验证 $.validator.addmethod("comparewith", function (value, element, params) { var otherproperty = params.otherproperty; var operator = params.operator; var type = params.type; var ignorecase = params.ignorecase; var sourcevalue = $("#" + otherproperty + "").val(); switch (type) { case "integer": value = parseint(value); sourcevalue = parseint(sourcevalue); break; case "double": value = parsefloat(value); sourcevalue = parsefloat(sourcevalue); break; case "date": var reg = new regexp("\\-", "gi"); value = new date(value.replace(reg, "/")); sourcevalue = new date(sourcevalue.replace(reg, "/")); break; } switch (operator) { case "equal": if (type === "string" && ignorecase === "true") { return value.tolowercase() === sourcevalue.tolowercase(); } return value == sourcevalue; case "notequal": if (type === "string" && ignorecase === "true") { return value.tolowercase() !== sourcevalue.tolowercase(); } return value != sourcevalue; case "greaterthan": return value > sourcevalue; case "greaterthanequal": return value >= sourcevalue; case "lessthan": return value < sourcevalue; case "lessthanequal": return value <= sourcevalue; } return true; }); //调用unobtrusive.adapters.add方法对自定义比较验证规则 comparewith 进行注册,并指定对应的验证参数名称列表。 $.validator.unobtrusive.adapters.add("comparewith", ["otherproperty", "otherpropertydisplayname", "operator", "type", "ignorecase"], function (options) { options.rules["comparewith"] = { otherproperty: options.params.otherproperty, otherpropertydisplayname: options.params.otherpropertydisplayname, operator: options.params.operator, type: options.params.type, ignorecase: options.params.ignorecase }; options.messages["comparewith"] = options.message; }); //对视频地址进行验证 $.validator.addmethod('videourl', function (value, element) { var pattern = /^([a-z]|\d|\+|-|\.)+:\/\/(((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))\.)+(([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\ue000-\uf8ff]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i; return this.optional(element) || pattern.test(value); }); $.validator.unobtrusive.adapters.addbool('videourl'); //对图片地址进行验证 $.validator.addmethod('imageurl', function (value, element) { var pattern = /^\s*(\.jpg|\.gif|\.png|\.bmp|\.jpeg)$/i; return this.optional(element) || pattern.test(value); }); $.validator.unobtrusive.adapters.addbool('imageurl'); //对邮箱进行验证 $.validator.addmethod('email', function (value, element) { var pattern = /^((([a-za-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])+(\.([a-za-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-za-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-za-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-za-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-za-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))\.)+(([a-za-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-za-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-za-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-za-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))\.?$/; var cnpattern = /.*[\u4e00-\u9fa5]+.*$/; return this.optional(element) || (pattern.test(value) && !cnpattern.test(value)); }); //对ip进行验证 $.validator.addmethod('ipaddress', function (value, element) { var pattern = /(^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$)|(^\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*$)/; return this.optional(element) || pattern.test(value); }); $.validator.unobtrusive.adapters.addbool('ipaddress'); //对电话进行验证 $.validator.addmethod('telephone', function (value, element) { var pattern = /^((\d{11,12})|(\d{7,8})|(\d{3,4})(-|\s)(\d{7,8})|(\d{3,4})(-|\s)(\d{7,8})(-|\s)(\d{3,4}|\d{1,2})|(\d{7,8})(-|\s)(\d{1,4}))$/; return this.optional(element) || pattern.test(value); }); $.validator.unobtrusive.adapters.addbool('telephone'); //对身份证进行验证 $.validator.addmethod('idcard', function (value, element) { var isvalid = function (cardno) { if (cardno && 15 != cardno.length && 18 != cardno.length) { return false; } var year, month, day, sex, birthday, i, 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 ], wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1], // 加权因子 last = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2], // 身份证验证位值.10代表x sum = 0, // 声明加权求和变量 cardnoarray, areacode = cardno.substring(0, 6), check = /^[1-9]\d{5}$/.test(areacode); if (!check || $.inarray(parseint(cardno.substring(0, 2)), area) == -1) { return false; } if (15 == cardno.length) { year = cardno.substring(6, 8); month = cardno.substring(8, 10); day = cardno.substring(10, 12); sex = cardno.substring(14, 15); // 性别位 birthday = new date(year, parsefloat(month) - 1, parsefloat(day)); // 对于老身份证中的年龄则不需考虑千年虫问题而使用getyear()方法 if (birthday.getyear() != parsefloat(year) || birthday.getmonth() != parsefloat(month) - 1 || birthday.getdate() != parsefloat(day)) { return false; } } else if (18 == cardno.length) { year = cardno.substring(6, 10); month = cardno.substring(10, 12); day = cardno.substring(12, 14); sex = cardno.substring(14, 17); birthday = new date(year, parsefloat(month) - 1, parsefloat(day)); // 这里用getfullyear()获取年份,避免千年虫问题 if (birthday.getfullyear() != parsefloat(year) || birthday.getmonth() != parsefloat(month) - 1 || birthday.getdate() != parsefloat(day)) { return false; } cardnoarray = cardno.split(""); if (cardnoarray[17].tolowercase() == 'x') { cardnoarray[17] = 10; // 将最后位为x的验证码替换为10方便后续操作 } for (i = 0; i < 17; i++) { sum += wi[i] * cardnoarray[i]; // 加权求和 } i = sum % 11; // 得到验证码所位置 if (cardnoarray[17] != last[i]) { return false; } } return true; }; return this.optional(element) || isvalid(value); }); $.validator.unobtrusive.adapters.addbool('idcard'); //对车牌号码进行验证 $.validator.addmethod('licenseplatenumber', function (value, element) { var pattern = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][a-za-z](([0-9]{5}[dfdf])|([dfdf]([a-ha-hj-nj-np-zp-z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][a-za-z][a-ha-hj-nj-np-zp-z0-9]{4}[a-ha-hj-nj-np-zp-z0-9挂学警港澳使领]))$/i; return this.optional(element) || pattern.test(value); }); $.validator.unobtrusive.adapters.addbool('licenseplatenumber'); //添加自定义validator的对数据安全性进行验证 $.validator.addmethod('dangerous', function (value, element) { var pattern = /^(?!(.|\n)*<[a-z!\/?])(?!(.|\n)*&#)(.|\n)*$/i; return this.optional(element) || pattern.test(value); }); //添加自定义unobtrusive的对数据安全性进行验证 $.validator.unobtrusive.adapters.add('dangerous', [], function (options) { if (options.message) { options.rules['dangerous'] = options.params; options.messages['dangerous'] = '不允许含有潜在危险的html代码。'; } }); //添加强密码客户端验证 $.validator.addmethod('strongpassword', function (value, element) { var error = ''; var isvalid = function (password) { var blankreg = /\s/; if (blankreg.test(password)) { error = '密码不能包含空格'; $.validator.messages['strongpassword'] = error; return false; } var digitreg = /[0-9]/; if (!digitreg.test(password)) { error = '密码必须包含数字'; $.validator.messages['strongpassword'] = error; return false; } var lowcharreg = /[a-z]/; if (!lowcharreg.test(password)) { error = '密码必须包含小写字母'; $.validator.messages['strongpassword'] = error; return false; } var uppercharreg = /[a-z]/; if (!uppercharreg.test(password)) { error = '密码必须包含大写字母'; $.validator.messages['strongpassword'] = error; return false; } return true; }; return this.optional(element) || isvalid(value); }); $.validator.unobtrusive.adapters.add('strongpassword', [], function (options) { if (options.message) { options.rules['strongpassword'] = options.params; } }); //全局验证之前trim进行处理,然后再进行验证 //uncode 为什么要去掉前后空格再验证? 用户名不允许前后空格那么正则就验证不了因为这个地方去掉了 //$.each($.validator.methods, // function (key, value) { // $.validator.methods[key] = function () { // if (arguments.length > 0) { // arguments[0] = $.trim(arguments[0]); // } // return value.apply(this, arguments); // }; // }); }(jquery));