/* Release: 2011-01-25: 1.添加 targetElement 参数: targetElement 为目标验证控件,如A为TextBox, 但是A是隐藏的, B为A的替身, 那么设置B.yz({ targetElement:[A的ID] });就可以通过B来验证A的目的 2.修改select 控件 列表为空时,val()方法返回值为null的bug. */ ;(function($){ // RequiredFieldValidator var oBody = $(document.body); // Validator Container var valContainer = []; var skipContainer = []; // 验证yz $.fn.yz = function(args) { args = args || {}; args = $.extend({}, defaults, args); var round = $.yz.getRound(args.type); if(!args.max) { args.max = round.max; } if(!args.min) { args.min = round.min; } //alert( args.max); var title = $.trim(args.title); if(title == "") { title = this.attr("title"); } title = $.trim(title); if(title != ""){ args.onError = "[" + title + "] " + args.onError; args.onOutOfRange = "[" + title + "] " + args.onOutOfRange; args.onEmpty = "[" + title + "] " + args.onEmpty; args.onOuOfDigits = "[" + title + "] " + args.onOuOfDigits; args.onSave = "[" + title + "] " + args.onSave; args.onLen = "[" + title + "] " + args.onSave; } //args.onOutOfRange += "(" + args.min + "~" + args.max + ")"; args.onLen += args.len; this.args = args; requiredFieldValidator(this); if(args.targetElement != undefined) { skipContainer.push(args.targetElement); } valContainer[this.attr("id")] = this; var ptr = $(this); return ptr; } var defaults = { group: "group1", title : "", // 提示信息的自段名称 其他提示信息 自动在开头累加上此属性 如 alert([title] + [onError]) onError: "输入格式错误", // 格式错误提示 onOutOfRange : "输入超出范围", // 超出范围提示 onEmpty: "输入不能为空", // 为空的时候的提示 onOuOfDigits : "小数位数太长", // 小数点位数太长的提示 onLen: "长度必须为", //固定长度 onSave : "禁止录入的字符 '", // 小数点位数太长的提示 canEmpty: false, // 是否允许为空 type : "string", // 要验证的数据类型 : string int float date(yyyy-MM-dd),datetime(yyyy-MM-dd 24h:mi) digits : 12, // 小数位数只对浮点型有效 isByte : false, // 字符长度的计算方式 true:字节长度, false : 字符个数 isShow : true, // 是否显示除了错误以外的提示图标 true : 始终提示 false: 不显示 isSave : false, // 是否检查为安全字符!=['"<>/] min : null, // 字符串为最大长度 其他类型为最大范围 minInclude : true, //大于最小值 len : null, //数据长度 max : null, // 字符串为最小长度 其他类型为最小范围 delay : null, // 漂浮提示显示的时间长,null : 不显示 cssClass : null // 格式错误后输入框的css样式,默认样式是背景色变红,字体变粗 ,targetObj: null //样式显示到其它对像上面。 }; function requiredFieldValidator(obj) { obj.blur(function(){ var val; if(obj.args.targetElement != undefined){ val = $.trim($("#" + obj.args.targetElement).val()); } else { val = obj.val(); } var result; if(val == undefined || val == "") { if(obj.args.canEmpty == false) { $.yz.addStyle(obj); } else { $.yz.removeStyle(obj); } } else if((result = ($.yz.validData(obj.args, val))) != true){ $.yz.addStyle(obj); } else { $.yz.removeStyle(obj); } }); } $.yz = { getErrorList : function (groupName) { groupName = groupName || "group1"; var errorList = []; errorList.push("信息提示:\n"); for(id in valContainer) { if(!skipContainer.contains(id)) { if(valContainer[id] && valContainer[id].args && groupName == valContainer[id].args.group) { var obj = valContainer[id]; var val; if(obj.args.targetElement != undefined){ var targetElement = $("#" + obj.args.targetElement); val = $.trim(targetElement.val()); } else { val = obj.val(); } var result; if(val == "") { if(obj.args.canEmpty == false) { $.yz.addStyle(obj); errorList.push(obj.args.onEmpty); } else { $.yz.removeStyle(obj); } } else if((result = ($.yz.validData(obj.args, val))) != true){ $.yz.addStyle(obj); errorList.push(result); } else { $.yz.removeStyle(obj); } } } } if(errorList.length > 1) { alert(errorList.join("\n * ")); return false; } return true; }, ValidError : function (groupName) { groupName = groupName || "group1"; var errorList = []; errorList.push("信息提示:\n"); for(id in valContainer) { if(!skipContainer.contains(id)) { if(valContainer[id] && valContainer[id].args && groupName == valContainer[id].args.group) { var obj = valContainer[id]; var val; if(obj.args.targetElement != undefined){ var targetElement = $("#" + obj.args.targetElement); val = $.trim(targetElement.val()); } else { val = obj.val(); } var result; if(val == "") { if(obj.args.canEmpty == false) { $.yz.addStyle(obj); errorList.push(obj.args.onEmpty); } else { $.yz.removeStyle(obj); } } else if((result = ($.yz.validData(obj.args, val))) != true){ $.yz.addStyle(obj); errorList.push(result); } else { $.yz.removeStyle(obj); } } } } if(errorList.length > 1) { //alert(errorList.join("\n * ")); return false; } return true; }, validData : function (args, value) { switch(args.type) { case "string" : var n=0; if(value) { n = args.isByte ? value.replace(/[.]/g,'a').replace(/[^x00-xff]/g,"aa").length : value.length; } if(n <= args.max && n >= args.min) { if(args.isSave && new RegExp(/\'/g).test(value)) { return args.onSave; } return true; } return args.onOutOfRange + "(" + (args.isByte ? "字节个数" : "字符个数") + ")"; case "int" : if($.yz.isInteger(value)) { var n = Number(value); if(args.len) { if(value.length == args.len) { return true } else { return args.onLen; } if(n <= args.max && n >= args.min) { return true; } } if(n <= args.max && n >= args.min) { return true; } return args.onOutOfRange; } return args.onError; case "float" : if($.yz.isFloat(value)) { value = value.replace(/,/g,""); var n = Number(value); if((n <= args.max && n >= args.min && args.minInclude) || (n < args.max && n > args.min && !args.minInclude)) { if(value.replace(/^-?[0-9]+\.?/g, "").length <= args.digits) { return true; } return args.onOuOfDigits; } return args.onOutOfRange; } if($.yz.isFloat_asp(value)) { var n = Number(value); if((n <= args.max && n >= args.min && args.minInclude) || (n < args.max && n > args.min && !args.minInclude)) { if(value.replace(/^-?[0-9]+\.?/g, "").length <= args.digits) { return true; } return args.onOuOfDigits; } return args.onOutOfRange; } return args.onError; case "date": if($.yz.isDate(value)) { var now = Date.parse(value.replace(/-/g,"/")); var max = Date.parse(args.max.replace(/-/g,"/")); var min = Date.parse(args.min.replace(/-/g,"/")); if(max - now >= 0 && now - min >= 0) { return true; } return args.onOutOfRange; } return args.onError + "正确时间格式:yyyy-MM-dd (如:2010-01-29)."; case "datetime" : if($.yz.isDateTime(value)) { try { var now = Date.parse((value+":00").replace(/-/g,"/")); var max = Date.parse(args.max.replace(/-/g,"/")); var min = Date.parse(args.min.replace(/-/g,"/")); if(max - now >= 0 && now - min >= 0) { return true; } return args.onOutOfRange; } catch(w){ return args.onOutOfRange; } } return args.onError + "正确时间格式:yyyy-MM-dd hh:mi(如:2010-01-29 05:50)."; case"ip": if($.yz.isIp(value)) return true; return args.onError; } }, isInteger : function (value) { return new RegExp('^([0-9]+)|(-[0-9]+)$').test(value); }, isFloat : function (value) { //return new RegExp("^-?((\\d+$)|(\\d+\.\\d+))$","g").test(value); return new RegExp("^-?((\\d{1,3}(,\\d\\d\\d)*(\.\\d+)?)|(\\d+(\.\\d+)?))$","g").test(value); }, isFloat_asp : function (value) { return new RegExp("(^\\d+$)|(^\.\\d+$)","g").test(value); }, isDate : function(value) { var ls_regex = "^((((((0[48])|([13579][26])|([2468][048]))00)|([0-9][0-9]((0[48])|([13579][26])|([2468][048]))))-02-29)|(((000[1-9])|(00[1-9][0-9])|(0[1-9][0-9][0-9])|([1-9][0-9][0-9][0-9]))-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8]))))))$"; //var ls_regex="^(\d{4})\-(\d{2})\-(\d{2})$" return new RegExp(ls_regex, "i").test(value); }, isDateTime : function(value) { var arr = value.split(' ', 2); if(arr.length == 2 && $.yz.isDate(arr[0])) { var ls_regex = "^([0-1]?[0-9]|2[0-3]):([0-5][0-9])$"; return new RegExp(ls_regex, "i").test(arr[1]); } return false; }, isIp : function(value){ 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])$/; return pattern.test(value); }, getRound : function (type) { switch(type) { case "string" : return { max:2000,min:0 }; case "int" : return { max:2147483647,min:0 }; case "float" : return { max:2147483647,min:-2147483647 }; case "date": return { max:"9999-12-31",min:"1900-01-01" }; case "datetime" : { return { max:"9999-12-31",min:"1900-01-01" }; } case "ip" : { return { max:"255.255.255.255",min:"0.0.0.0" }; } } }, addStyle : function(obj) { if(obj.args) { if(obj.args.targetObj) { if(obj.args.cssClass) { obj.args.targetObj.addClass(obj.args.cssClass); } else { obj.args.targetObj.css("background-color", "#FFCBCB"); } return; } if(obj.args.cssClass) { obj.addClass(obj.args.cssClass); return; } } obj.css("background-color", "#FFCBCB"); return; }, removeStyle : function(obj) { if(obj.args) { if(obj.args.targetObj) { if(obj.args.cssClass) { obj.args.targetObj.removeClass(obj.args.cssClass); } else { obj.args.targetObj.css("background-color", ""); } return; } if(obj.args.cssClass) { obj.removeClass(obj.args.cssClass); return; } } obj.css("background-color", ""); //obj.css("font-weight", ""); return; } }; Array.prototype.contains = function(e) { for(i=0;i