//==================================================================================================== // [插件名称] jQuery formValidator //---------------------------------------------------------------------------------------------------- // [描 述] jQuery formValidator表单验证插件,它是基于jQuery类库,实现了js脚本于页面的分离。对一个表 // 单对象,你只需要写一行代码就可以轻松实现20种以上的脚本控制。现支持一个表单元素累加很多种 // 校验方式,采用配置信息的思想,而不是把信息写在表单元素上,能比较完美的实现ajax请求。 //---------------------------------------------------------------------------------------------------- // [作者网名] 猫冬 // [邮 箱] wzmaodong@126.com // [作者博客] http://wzmaodong.cnblogs.com // [插件主页] http://www.yhuan.com // [QQ群交流] 72280458、74106519 // [更新日期] 2011-07-24 // [版 本 号] ver4.1.3 内部测试版 // [开源协议] LGPL //==================================================================================================== (function($) { $.formValidator = { //全局配置 initConfig : function(controlOptions) { var settings = {}; $.extend(true, settings, initConfig_setting, controlOptions || {}); //如果是精简模式,发生错误的时候,第一个错误的控件就不获得焦点 if(settings.mode == "SingleTip"){settings.errorFocus=false}; //如果填写了表单和按钮,就注册验证事件 if(settings.formID!=""){ $("#"+settings.formID).submit(function(){ if(settings.ajaxForm!=null){ $.formValidator.ajaxForm(settings.validatorGroup,settings.ajaxForm); return false; } else { if (settings.ajaxCountValid > 0) { if (settings.ajaxPrompt && settings.ajaxPrompt.length>0){ //settings.onAlert(settings.ajaxPrompt); } return false; } return $.formValidator.pageIsValid(settings.validatorGroup); } }); } $("body").data(settings.validatorGroup, settings); if(settings.theme==""){return} //读取主题对应的脚本 var scriptSrcArray = fv_scriptSrc.split('/'); var jsName = scriptSrcArray[scriptSrcArray.length-1]; var themedir = fv_scriptSrc.replace(jsName,''); $.ajax({async:false,type: "GET",url: themedir + "themes/"+settings.theme+"/js/theme.js",dataType: "script", error :function(){alert('当前皮肤加载出错,请确认皮肤【'+settings.theme+'】是否存在')} }); //读取主题对应的样式 if($.browser) { var css=document.createElement("link"); css.rel="stylesheet"; css.type="text/css"; css.href=themedir+"themes/"+settings.theme+"/style/style.css"; document.getElementsByTagName("head")[0].appendChild(css); } else { var style=document.createElement('style'); style.setAttribute("type", "text/css"); var styCss = "@import url('"+themedir+"themes/"+settings.theme+"/style/style.css');"; if (style.styleSheet) {style.styleSheet.cssText=styCss} else {style.appendChild(document.createTextNode(styCss))} document.getElementsByTagName("head")[0].appendChild(style); } }, //各种校验方式支持的控件类型 sustainType : function(elem,validateType) { var srcTag = elem.tagName; var stype = elem.type; switch(validateType) { case "formValidator": return true; case "inputValidator": return (srcTag == "INPUT" || srcTag == "TEXTAREA" || srcTag == "SELECT"); case "compareValidator": return ((srcTag == "INPUT" || srcTag == "TEXTAREA") ? (stype != "checkbox" && stype != "radio") : false); case "ajaxValidator": return (stype == "text" || stype == "textarea" || stype == "file" || stype == "password" || stype == "select-one"); case "regexValidator": return ((srcTag == "INPUT" || srcTag == "TEXTAREA") ? (stype != "checkbox" && stype != "radio") : false); case "functionValidator": return true; case "passwordValidator": return stype == "password"; } }, //如果validator对象对应的element对象的validator属性追加要进行的校验。 appendValid : function(id, setting ) { //如果是各种校验不支持的类型,就不追加到。返回-1表示没有追加成功 var elem = $("#"+id).get(0); var validateType = setting.validateType; if(!$.formValidator.sustainType(elem,validateType)){return -1} //重新初始化 if (validateType=="formValidator" || elem.settings == undefined ){elem.settings = new Array()} var len = elem.settings.push( setting ); elem.settings[len - 1].index = len - 1; return len - 1; }, //设置显示信息 setTipState : function(elem,showclass,showmsg) { var initConfig = $("body").data(elem.validatorGroup); if(initConfig.mode == "SingleTip") { //显示和保存提示信息 $("#fv_content").html(showmsg); elem.Tooltip = showmsg; if(showclass!="onError"){tip.hide()} } else { var tip = $("#"+elem.settings[0].tipID); var html = showclass == "onShow" ? onShowHtml : (showclass == "onFocus" ? onFocusHtml : (showclass == "onCorrect" ? onCorrectHtml : onErrorHtml)); if(html.length = 0) { tip.hide() } else { if(elem.validatorPasswordIndex > 0 && showclass =="onCorrect"){ var setting = elem.settings[elem.validatorPasswordIndex]; var level = $.formValidator.passwordValid(elem); showmsg = ""; if(level==-1 && setting.onErrorContinueChar!=""){ showmsg=setting.onErrorContinueChar }else if(level==-2 && setting.onErrorSameChar!=""){ showmsg=setting.onErrorSameChar }else if(level==-3 && setting.onErrorCompareSame!=""){ showmsg=setting.onErrorCompareSame } if(showmsg!="") { $.formValidator.setTipState(elem,'onError',showmsg); return } showmsg = passwordStrengthText[level<=0?0:level - 1]; } html = html.replace(/\$class\$/g, showclass).replace(/\$data\$/g, showmsg); if(showclass!=""){ tip.html(html).removeClass().addClass(showclass).show(); }else{ tip.html(html).show(); } } var stype = elem.type; if(stype == "password" || stype == "text" || stype == "file") { jqobj = $(elem); if(onShowClass!="" && showclass == "onShow"){jqobj.removeClass().addClass(onShowClass)}; if(onFocusClass!="" && showclass == "onFocus"){jqobj.removeClass().addClass(onFocusClass)}; if(onCorrectClass!="" && showclass == "onCorrect"){jqobj.removeClass().addClass(onCorrectClass)}; if(onErrorClass!="" && showclass == "onError"){jqobj.removeClass().addClass(onErrorClass)}; } } }, //把提示层重置成原始提示(如果有defaultPassed,应该设置为onCorrect) resetTipState : function(validatorGroup) { if(validatorGroup == undefined){validatorGroup = "1"}; var initConfig = $("body").data(validatorGroup); $.each(initConfig.validObjects,function(){ var setting = this.settings[0]; var passed = setting.defaultPassed; $.formValidator.setTipState(this, passed ? "onCorrect" : "onShow", passed ? $.formValidator.getStatusText(this,setting.onCorrect) : setting.onShow ); }); }, //设置错误的显示信息 setFailState : function(tipID,showmsg) { $.formValidator.setTipState($("#"+tipID).get(0), "onError", showmsg); }, //根据单个对象,正确:正确提示,错误:错误提示 showMessage : function(returnObj) { var id = returnObj.id; var elem = $("#"+id).get(0); var isValid = returnObj.isValid; var setting = returnObj.setting;//正确:setting[0],错误:对应的setting[i] var showmsg = "",showclass = ""; var intiConfig = $("body").data(elem.validatorGroup); if (!isValid) { showclass = "onError"; if(setting.validateType=="ajaxValidator") { if(setting.lastValid=="") { showclass = "onLoad"; showmsg = setting.onWait; } else { showmsg = $.formValidator.getStatusText(elem,setting.onError); } } else { showmsg = (returnObj.errormsg==""? $.formValidator.getStatusText(elem,setting.onError) : returnObj.errormsg); } if(intiConfig.mode == "AlertTip") { if(elem.validValueOld!=$(elem).val()){intiConfig.onAlert(showmsg);} } else { $.formValidator.setTipState(elem,showclass,showmsg); } } else { //验证成功后,如果没有设置成功提示信息,则给出默认提示,否则给出自定义提示;允许为空,值为空的提示 showmsg = $.formValidator.isEmpty(id) ? setting.onEmpty : $.formValidator.getStatusText(elem,setting.onCorrect); $.formValidator.setTipState(elem,"onCorrect",showmsg); } return showmsg; }, showAjaxMessage : function(e) { var elem = $("#"+e.id).get(0); var setting = elem.settings[e.ajax]; var validValueOld = elem.validValueOld; var validvalue = $(elem).val(); e.setting = setting; //defaultPassed还未处理 if(validValueOld!= validvalue || validValueOld == validvalue && elem.onceValided == undefined) { $.formValidator.ajaxValid(e); } else { if(setting.isValid!=undefined && !setting.isValid){ elem.lastshowclass = "onError"; elem.lastshowmsg = $.formValidator.getStatusText(elem,setting.onError); } $.formValidator.setTipState(elem,elem.lastshowclass,elem.lastshowmsg); } }, //获取指定字符串的长度 getLength : function(id) { var srcjo = $("#"+id); var elem = srcjo.get(0); var sType = elem.type; var len = 0; switch(sType) { case "text": case "hidden": case "password": case "textarea": case "file": var val = srcjo.val(); var setting = elem.settings[0]; //如果有显示提示内容的,要忽略掉 if(elem.isInputControl && elem.value == setting.onShowText){val=""} var initConfig = $("body").data(elem.validatorGroup); if (initConfig.wideWord) { for (var i = 0; i < val.length; i++) { len = len + ((val.charCodeAt(i) >= 0x4e00 && val.charCodeAt(i) <= 0x9fa5) ? 2 : 1); } } else{ len = val.length; } break; case "checkbox": case "radio": len = $("input[type='"+sType+"'][name='"+srcjo.attr("name")+"']:checked").length; break; case "select-one": len = elem.options ? elem.options.selectedIndex : -1; break; case "select-multiple": len = $("select[name="+elem.name+"] option:selected").length; break; } return len; }, //结合empty这个属性,判断仅仅是否为空的校验情况。 isEmpty : function(id) { return ($("#"+id).get(0).settings[0].empty && $.formValidator.getLength(id)==0); }, //对外调用:判断单个表单元素是否验证通过,不带回调函数 isOneValid : function(id) { return $.formValidator.oneIsValid(id).isValid; }, //验证单个是否验证通过,正确返回settings[0],错误返回对应的settings[i] oneIsValid : function (id) { var e = {}; e.id = id; e.dom = $("#"+id).get(0); e.initConfig = $("body").data(e.dom.validatorGroup); e.ajax = -1; e.errormsg = ""; //自定义错误信息 e.settings = e.dom.settings; var settingslen = e.settings.length; var validateType; //只有一个formValidator的时候不检验 if (settingslen==1){e.settings[0].bind=false;} if(!e.settings[0].bind){return null;} $.formValidator.resetInputValue(true,e.initConfig,id); for ( var i = 0 ; i < settingslen ; i ++ ) { if(i==0){ //如果为空,直接返回正确 if($.formValidator.isEmpty(id)){ e.isValid = true; e.setting = e.settings[0]; break; } continue; } e.setting = e.settings[i]; validateType = e.settings[i].validateType; //根据类型触发校验 switch(validateType) { case "inputValidator": $.formValidator.inputValid(e); break; case "compareValidator": $.formValidator.compareValid(e); break; case "regexValidator": $.formValidator.regexValid(e); break; case "functionValidator": $.formValidator.functionValid(e); break; case "ajaxValidator": //如果是ajax校验,这里直接取上次的结果值 e.ajax = i; break; case "passwordValidator": break; } if(!e.settings[i].isValid) { e.isValid = false; e.setting = e.settings[i]; break; }else{ e.isValid = true; e.setting = e.settings[0]; if (e.settings[i].validateType == "ajaxValidator"){break}; } } $.formValidator.resetInputValue(false,e.initConfig,id); return e; }, //验证所有需要验证的对象,并返回是否验证成功(如果曾经触发过ajaxValidator,提交的时候就不触发校验,直接读取结果) pageIsValid : function (validatorGroup) { if(validatorGroup == undefined){validatorGroup = "1"}; var isValid = true,returnObj,firstErrorMessage="",errorMessage; var error_tip = "^",thefirstid,name,name_list="^"; var errorlist = new Array(); //设置提交状态、ajax是否出错、错误列表 var initConfig = $("body").data(validatorGroup); initConfig.status = "sumbiting"; initConfig.ajaxCountSubmit = 0; //遍历所有要校验的控件,如果存在ajaxValidator就先直接触发 $.each(initConfig.validObjects,function() { if($(this).length==0){return true}; if (this.settings[0].bind && this.validatorAjaxIndex!=undefined && this.onceValided == undefined) { returnObj = $.formValidator.oneIsValid(this.id); if (returnObj.ajax == this.validatorAjaxIndex) { initConfig.status = "sumbitingWithAjax"; $.formValidator.ajaxValid(returnObj); } } }); //如果有提交的时候有触发ajaxValidator,所有的处理都放在ajax里处理 if(initConfig.ajaxCountSubmit > 0){return false} //遍历所有要校验的控件 $.each(initConfig.validObjects,function() { //只校验绑定的控件 if($(this).length==0){return true}; if(this.settings[0].bind){ name = this.name; //相同name只校验一次 if (name_list.indexOf("^"+name+"^") == -1) { onceValided = this.onceValided == undefined ? false : this.onceValided; if(name){name_list = name_list + name + "^"}; returnObj = $.formValidator.oneIsValid(this.id); if (returnObj) { //校验失败,获取第一个发生错误的信息和ID if (!returnObj.isValid) { //记录不含ajaxValidator校验函数的校验结果 isValid = false; errorMessage = returnObj.errormsg == "" ? returnObj.setting.onError : returnObj.errormsg; errorlist[errorlist.length] = errorMessage; if (thefirstid == null) {thefirstid = returnObj.id}; if(firstErrorMessage==""){firstErrorMessage=errorMessage}; } //为了解决使用同个TIP提示问题:后面的成功或失败都不覆盖前面的失败 if (initConfig.mode != "AlertTip") { var tipID = this.settings[0].tipID; if (error_tip.indexOf("^" + tipID + "^") == -1) { if (!returnObj.isValid) {error_tip = error_tip + tipID + "^"}; $.formValidator.showMessage(returnObj); } } //如果是逐个校验的,且当前校验失败,就直接返回 if(initConfig.oneByOneVerify && !returnObj.isValid){return false} } } } }); //成功或失败进行回调函数的处理,以及成功后的灰掉提交按钮的功能 if(isValid) { if(!initConfig.onSuccess()){return false}; if(initConfig.submitOnce){$(":submit,:button,:reset").attr("disabled",true);} } else { initConfig.onError(firstErrorMessage, $("#" + thefirstid).get(0), errorlist); if (thefirstid && initConfig.errorFocus) {$("#" + thefirstid).focus()}; } initConfig.status="init"; if(isValid && initConfig.debug){alert("现在正处于调试模式(debug:true),不能提交");} return !initConfig.debug && isValid; }, //整个表单 ajaxForm : function(validatorGroup,option,formid) { if(validatorGroup == undefined){validatorGroup = "1"}; var setting = {}; $.extend(true, setting, ajaxForm_setting, option || {}); var initConfig = $("body").data(validatorGroup); if(formid==undefined){ formid = initConfig.formID; if(formid==""){alert('表单ID未传入');return false;}; }; if(!$.formValidator.pageIsValid(validatorGroup)){return false}; var ls_url = setting.url; var ls_data = setting.data; var parm = $.formValidator.serialize('#'+formid); if(setting.type=="POST"){ ls_data = ls_data + (ls_data != "" ? ("&" + parm) : parm) }else{ ls_url = ls_url + (ls_url.indexOf("?") > -1 ? ("&" + parm) : ("?" + parm)) } $.ajax( { type : setting.type, url : ls_url, cache : setting.cache, data : ls_data, async : setting.async, timeout : setting.timeout, dataType : setting.dataType, beforeSend : function(jqXHR, configs){//再服务器没有返回数据之前,先回调提交按钮 if(setting.buttons && setting.buttons.length > 0){setting.buttons.attr({"disabled":true})}; return setting.beforeSend(jqXHR, configs); }, success : function(data, textStatus, jqXHR){setting.success(data, textStatus, jqXHR);}, complete : function(jqXHR, textStatus){ if(setting.buttons && setting.buttons.length > 0){setting.buttons.attr({"disabled":false})}; setting.complete(jqXHR, textStatus); }, error : function(jqXHR, textStatus, errorThrown){setting.error(jqXHR, textStatus, errorThrown);} }); }, //把编码decodeURIComponent反转之后,再escape serialize : function(objs,initConfig) { if(initConfig!=undefined){$.formValidator.resetInputValue(true,initConfig)}; var parmString = $(objs).serialize(); if(initConfig!=undefined){$.formValidator.resetInputValue(false,initConfig)}; return parmString; }, //ajax校验 ajaxValid : function(e) { var id = e.id; var srcjo = $("#"+id); var elem = srcjo.get(0); var initConfig = e.initConfig; var settings = elem.settings; var setting = settings[e.ajax]; var ls_url = setting.url; var ls_data = setting.data; //获取要传递的参数 var validatorGroup = elem.validatorGroup; var initConfig = $("body").data(validatorGroup); var parm = $.formValidator.serialize(initConfig.ajaxObjects); //添加触发的控件名、随机数、传递的参数 parm = "clientid=" + id + "&" +(setting.randNumberName ? setting.randNumberName+"="+((new Date().getTime())+Math.round(Math.random() * 10000)) : "") + (parm.length > 0 ? "&" + parm : ""); if(setting.type=="POST"){ ls_data = ls_data + (ls_data != "" ? ("&" + parm) : parm) }else{ ls_url = ls_url + (ls_url.indexOf("?") > -1 ? ("&" + parm) : ("?" + parm)) } //发送ajax请求 $.ajax( { type : setting.type, url : ls_url, cache : setting.cache, data : ls_data, async : setting.async, timeout : setting.timeout, dataType : setting.dataType, success : function(data, textStatus, jqXHR){ var lb_ret,ls_status,ls_msg,lb_isValid = false; $.formValidator.dealAjaxRequestCount(validatorGroup,-1); e.dom.onceValided = true; //根据业务判断设置显示信息 lb_ret = setting.success(data, textStatus, jqXHR); if((typeof lb_ret)=="string") { ls_status = "onError"; ls_msg = lb_ret; } else if(lb_ret){ lb_isValid = true; ls_status = "onCorrect"; ls_msg = settings[0].onCorrect; }else{ ls_status = "onError"; ls_msg = $.formValidator.getStatusText(elem,setting.onError); } setting.isValid = lb_isValid; $.formValidator.setTipState(elem,ls_status,ls_msg); //提交的时候触发了ajax校验,等ajax校验完成,无条件重新校验 if(e.initConfig.status=="sumbitingWithAjax" && e.initConfig.ajaxCountSubmit == 0) { if (initConfig.formID != "") { $('#' + initConfig.formID).trigger('submit'); } } }, complete : function(jqXHR, textStatus){ if(setting.buttons && setting.buttons.length > 0){setting.buttons.attr({"disabled":false})}; setting.complete(jqXHR, textStatus); }, beforeSend : function(jqXHR, configs){ //本控件如果正在校验,就中断上次 if (this.lastXMLHttpRequest) {this.lastXMLHttpRequest.abort()}; this.lastXMLHttpRequest = jqXHR; //再服务器没有返回数据之前,先回调提交按钮 if(setting.buttons && setting.buttons.length > 0){setting.buttons.attr({"disabled":true})}; var lb_ret = setting.beforeSend(jqXHR,configs); var isValid = false; //无论是否成功都当做失败处理 setting.isValid = false; if((typeof lb_ret)=="boolean" && lb_ret) { isValid = true; $.formValidator.setTipState(elem,"onLoad",settings[e.ajax].onWait); }else { isValid = false; $.formValidator.setTipState(elem,"onError",lb_ret); } setting.lastValid = "-1"; if(isValid){$.formValidator.dealAjaxRequestCount(validatorGroup,1);} return isValid; }, error : function(jqXHR, textStatus, errorThrown){ $.formValidator.dealAjaxRequestCount(validatorGroup,-1); $.formValidator.setTipState(elem,"onError",$.formValidator.getStatusText(elem,setting.onError)); setting.isValid = false; e.dom.onceValided = true; setting.error(jqXHR, textStatus, errorThrown); }, processData : setting.processData }); }, //处理ajax的请求个数 dealAjaxRequestCount : function(validatorGroup,val) { var initConfig = $("body").data(validatorGroup); initConfig.ajaxCountValid = initConfig.ajaxCountValid + val; if (initConfig.status == "sumbitingWithAjax") { initConfig.ajaxCountSubmit = initConfig.ajaxCountSubmit + val; } }, //对正则表达式进行校验(目前只针对input和textarea) regexValid : function(returnObj) { var id = returnObj.id; var setting = returnObj.setting; var srcTag = $("#"+id).get(0).tagName; var elem = $("#"+id).get(0); var isValid; //如果有输入正则表达式,就进行表达式校验 if(elem.settings[0].empty && elem.value==""){ setting.isValid = true; } else { var regexArray = setting.regExp; setting.isValid = false; if((typeof regexArray)=="string") regexArray = [regexArray]; $.each(regexArray, function() { var r = this; if(setting.dataType=="enum"){r = eval("regexEnum."+r);} if(r==undefined || r=="") { return false; } isValid = (new RegExp(r, setting.param)).test($(elem).val()); if(setting.compareType=="||" && isValid) { setting.isValid = true; return false; } if(setting.compareType=="&&" && !isValid) { return false } }); if(!setting.isValid) setting.isValid = isValid; } }, //函数校验。返回true/false表示校验是否成功;返回字符串表示错误信息,校验失败;如果没有返回值表示处理函数,校验成功 functionValid : function(returnObj) { var id = returnObj.id; var setting = returnObj.setting; var srcjo = $("#"+id); var lb_ret = setting.fun(srcjo.val(),srcjo.get(0)); if(lb_ret != undefined) { if((typeof lb_ret) === "string"){ setting.isValid = false; returnObj.errormsg = lb_ret; }else{ setting.isValid = lb_ret; } }else{ setting.isValid = true; } }, //对input和select类型控件进行校验 inputValid : function(returnObj) { var id = returnObj.id; var setting = returnObj.setting; var srcjo = $("#"+id); var elem = srcjo.get(0); var val = srcjo.val(); var sType = elem.type; var len = $.formValidator.getLength(id); var empty = setting.empty,emptyError = false; switch(sType) { case "text": case "hidden": case "password": case "textarea": case "file": if (setting.type == "size") { empty = setting.empty; if(!empty.leftEmpty){ emptyError = (val.replace(/^[ \s]+/, '').length != val.length); } if(!emptyError && !empty.rightEmpty){ emptyError = (val.replace(/[ \s]+$/, '').length != val.length); } if(emptyError && empty.emptyError){returnObj.errormsg= empty.emptyError} } case "checkbox": case "select-one": case "select-multiple": case "radio": var lb_go_on = false; if(sType=="select-one" || sType=="select-multiple"){setting.type = "size";} var type = setting.type; if (type == "size") { //获得输入的字符长度,并进行校验 if(!emptyError){lb_go_on = true} if(lb_go_on){val = len} } else if (type =="date" || type =="datetime") { var isok = false; if(type=="date"){lb_go_on = isDate(val)}; if(type=="datetime"){lb_go_on = isDate(val)}; if(lb_go_on){val = new Date(val);setting.min=new Date(setting.min);setting.max=new Date(setting.max);}; }else{ stype = (typeof setting.min); if(stype =="number") { val = (new Number(val)).valueOf(); if(!isNaN(val)){lb_go_on = true;} } if(stype =="string"){lb_go_on = true;} } setting.isValid = false; if(lb_go_on) { if(val < setting.min || val > setting.max){ if(val < setting.min && setting.onErrorMin){ returnObj.errormsg= setting.onErrorMin; } if(val > setting.min && setting.onErrorMax){ returnObj.errormsg= setting.onErrorMax; } } else{ setting.isValid = true; } } break; } }, //对两个控件进行比较校验 compareValid : function(returnObj) { var id = returnObj.id; var setting = returnObj.setting; var srcjo = $("#"+id); var desjo = $("#"+setting.desID ); var ls_dataType = setting.dataType; curvalue = srcjo.val(); ls_data = desjo.val(); if(ls_dataType=="number") { if(!isNaN(curvalue) && !isNaN(ls_data)){ curvalue = parseFloat(curvalue); ls_data = parseFloat(ls_data); } else{ return; } } if(ls_dataType=="date" || ls_dataType=="datetime") { var isok = false; if(ls_dataType=="date"){isok = (isDate(curvalue) && isDate(ls_data))}; if(ls_dataType=="datetime"){isok = (isDateTime(curvalue) && isDateTime(ls_data))}; if(isok){ curvalue = new Date(curvalue); ls_data = new Date(ls_data) } else{ return; } } switch(setting.operateor) { case "=": setting.isValid = (curvalue == ls_data); break; case "!=": setting.isValid = (curvalue != ls_data); break; case ">": setting.isValid = (curvalue > ls_data); break; case ">=": setting.isValid = (curvalue >= ls_data); break; case "<": setting.isValid = (curvalue < ls_data); break; case "<=": setting.isValid = (curvalue <= ls_data); break; default : setting.isValid = false; break; } }, //获取密码校验等级 passwordValid : function(elem) { var setting = elem.settings[elem.validatorPasswordIndex]; var pwd = elem.value; //是否为连续字符 function isContinuousChar(str){ var str = str.toLowerCase(); var flag = 0; for(var i=0;i=48 && c <=57){ //数字 sum1[0] += 1; }else if (c >=97 && c <=122){ //小写字母 sum1[1] += 1; }else if (c >=65 && c <=90){ //大写字母 sum1[2] += 1; }else if(specicalChars.indexOf(pwd.substr(i,1))>=0){ //特殊字符 sum1[3] += 1; } } //遍历json变量获取字符串 var returnLevel = 0; var hasFind = true; $.each(passwordStrengthRule,function(j,n){ var level = n.level; var rules = n.rule; $.each(rules,function(i,rule){ var index = 0; //依次编译所有的、有配置(该位置==1)的节点 hasFind = true; $.each(getFlag(rule.flag),function(k,value){ if(value==1){ val = rule.value[index++]; var val = val == 0 ? len : (val > len ? len : val); if(sum1[k] < val){hasFind = false;return false;} } }); if(hasFind){returnLevel = level;return false;} }); if(hasFind){returnLevel = level;} }); return returnLevel; }, //定位漂浮层 localTooltip : function(e) { e = e || window.event; var mouseX = e.pageX || (e.clientX ? e.clientX + document.body.scrollLeft : 0); var mouseY = e.pageY || (e.clientY ? e.clientY + document.body.scrollTop : 0); $("#fvtt").css({"top":(mouseY+2)+"px","left":(mouseX-40)+"px"}); }, reloadAutoTip : function(validatorGroup) { if(validatorGroup == undefined) validatorGroup = "1"; var initConfig = $("body").data(validatorGroup); $.each(initConfig.validObjects,function() { if(initConfig.mode == "AutoTip") { //获取层的ID、相对定位控件的ID和坐标 var setting = this.settings[0]; var relativeID = "#"+setting.relativeID; var offset = $(relativeID ).offset(); var y = offset.top; var x = $(relativeID ).width() + offset.left; $("#"+setting.tipID).parent().show().css({left: x+"px", top: y+"px"}); } }); }, getStatusText : function(elem,obj) { return ($.isFunction(obj) ? obj($(elem).val()) : obj); }, resetInputValue : function(real,initConfig,id) { var showTextObjects; if(id){ showTextObjects = $("#"+id); }else{ showTextObjects = $(initConfig.showTextObjects); } showTextObjects.each(function(index,elem){ if(elem.isInputControl){ var showText = elem.settings[0].onShowText; if(real && showText==elem.value){elem.value = ""}; if(!real && showText!="" && elem.value == ""){elem.value = showText}; } }); } }; //每个校验控件必须初始化的 $.fn.formValidator = function(cs) { cs = cs || {}; var setting = {}; //获取该校验组的全局配置信息 if(cs.validatorGroup == undefined){cs.validatorGroup = "1"}; //先合并整个配置(深度拷贝) $.extend(true,setting, formValidator_setting); var initConfig = $("body").data(cs.validatorGroup); //校验索引号,和总记录数 initConfig.validCount += 1; //如果为精简模式,tipCss要重新设置初始值 if(initConfig.mode == "SingleTip"){setting.tipCss = {left:10,top:1,width:22,height:22,display:"none"}}; //弹出消息提示模式,自动修复错误 if(initConfig.mode == "AlertTip"){setting.autoModify=true}; //先合并整个配置(深度拷贝) $.extend(true,setting, cs || {}); return this.each(function(e) { //记录该控件的校验顺序号和校验组号 this.validatorIndex = initConfig.validCount - 1; this.validatorGroup = cs.validatorGroup; var jqobj = $(this); //自动形成TIP var setting_temp = {}; $.extend(true,setting_temp, setting); //判断是否有ID var id = jqobj.attr('id'); if(!id) { id = Math.ceil(Math.random()*50000000); jqobj.attr('id', id); } var tip = setting_temp.tipID ? setting_temp.tipID : id+"Tip"; if(initConfig.mode == "AutoTip" || initConfig.mode == "FixTip") { var tipDiv = $("#"+tip); //获取层的ID、相对定位控件的ID和坐标 if(initConfig.mode == "AutoTip" && tipDiv.length==0) { var relativeID = setting_temp.relativeID ? setting_temp.relativeID : id; var offset = $("#"+relativeID ).offset(); setting_temp.tipCss.top = offset.top + setting_temp.tipCss.top; setting_temp.tipCss.left = $("#"+relativeID ).width() + offset.left + setting_temp.tipCss.left; tipDiv = $("
").appendTo($("body")); tipDiv.css(setting_temp.tipCss); setting.relativeID = relativeID ; } tipDiv.css("margin","0px").css("padding","0px").css("background","transparent"); }else if(initConfig.mode == "SingleTip"){ jqobj.showTooltips(); } //每个控件都要保存这个配置信息、为了取数方便,冗余一份控件总体配置到控件上 setting.tipID = tip; setting.pwdTipID = setting_temp.pwdTipID ? setting_temp.pwdTipID : setting.tipID; setting.fixTipID = setting_temp.fixTipID ? setting_temp.fixTipID : id+"FixTip"; $.formValidator.appendValid(id,setting); //保存控件ID var validIndex = $.inArray(jqobj,initConfig.validObjects); if(validIndex == -1) { if (setting_temp.ajax) {initConfig.ajaxObjects.push(this)} initConfig.validObjects.push(this); }else{ initConfig.validObjects[validIndex] = this; } //初始化显示信息 if(initConfig.mode != "AlertTip"){ $.formValidator.setTipState(this,"onShow",setting.onShow); } var srcTag = this.tagName.toLowerCase(); var stype = this.type; var defaultval = setting.defaultValue; var isInputControl = stype == "password" || stype == "text" || stype == "textarea"; this.isInputControl = isInputControl; //处理默认值 if(defaultval){ jqobj.val(defaultval); } //固定提示内容 var fixTip = $("#"+setting.fixTipID); var showFixText = setting.onShowFixText; if(fixTip.length==1 && onMouseOutFixTextHtml!="" && onMouseOnFixTextHtml!="" && showFixText != "") { jqobj.hover( function () { fixTip.html(onMouseOnFixTextHtml.replace(/\$data\$/g, showFixText)); }, function () { fixTip.html(onMouseOutFixTextHtml.replace(/\$data\$/g, showFixText)); } ); fixTip.css("padding","0px 0px 0px 0px").css("margin","0px 0px 0px 0px").html(onMouseOutFixTextHtml.replace(/\$data\$/g, setting.onShowFixText)); } //获取输入框内的提示内容 var showText = setting.onShowText; if(srcTag == "input" || srcTag=="textarea") { if (isInputControl) { if(showText !="" && jqobj.val() == ""){ showObjs = initConfig.showTextObjects; initConfig.showTextObjects = showObjs + (showObjs != "" ? ",#" : "#") + id; jqobj.val(showText); jqobj.css("color",setting.onShowTextColor.mouseOutColor); } } //注册获得焦点的事件。改变提示对象的文字和样式,保存原值 jqobj.focus(function() { if (isInputControl) { var val = jqobj.val(); this.validValueOld = val; if(showText==val){ this.value = ""; jqobj.css("color",setting.onShowTextColor.mouseOnColor); } }; if(initConfig.mode != "AlertTip"){ //保存原来的状态 var tipjq = $("#"+tip); this.lastshowclass = tipjq.attr("class"); this.lastshowmsg = tipjq.text(); $.formValidator.setTipState(this,"onFocus",setting.onFocus); }; if(this.validatorPasswordIndex > 0){$("#"+setting.pwdTipID).show();jqobj.trigger('keyup');} }); //按键时候触发校验 jqobj.bind("keyup",function(){ if(this.validatorPasswordIndex > 0) { try{ var returnObj = $.formValidator.oneIsValid(id); var level = $.formValidator.passwordValid(this); if(level < 0){level=0}; if(!returnObj.isValid){level = 0}; $("#"+setting.pwdTipID).show(); $("#"+setting.pwdTipID).html(passwordStrengthStatusHtml[level]); }catch(e) { alert("密码强度校验失败,错误原因:变量passwordStrengthStatusHtml语法错误或者为设置)"); } } }); //注册失去焦点的事件。进行校验,改变提示对象的文字和样式;出错就提示处理 jqobj.bind(setting.triggerEvent, function(){ var settings = this.settings; //根据配置截掉左右的空格 if(settings[0].leftTrim){this.value = this.value.replace(/^\s*/g, "")} if(settings[0].rightTrim){this.value = this.value.replace(/\s*$/g, "")} //恢复默认值 if(isInputControl){ if(this.value == "" && showText != ""){this.value = showText} if(this.value == showText){jqobj.css("color",setting.onShowTextColor.mouseOutColor)} } //进行有效性校验 var returnObj = $.formValidator.oneIsValid(id); if(returnObj==null){return} if(returnObj.ajax >= 0) { $.formValidator.showAjaxMessage(returnObj); } else { var showmsg = $.formValidator.showMessage(returnObj); if(!returnObj.isValid) { //自动修正错误 var auto = setting.autoModify && isInputControl; if(auto) { $(this).val(this.validValueOld); if(initConfig.mode != "AlertTip"){$.formValidator.setTipState(this,"onShow",$.formValidator.getStatusText(this,setting.onCorrect))}; } else { if(initConfig.forceValid || setting.forceValid){ intiConfig.onAlert(showmsg);this.focus(); } } } } }); } else if (srcTag == "select") { jqobj.bind({ //获得焦点 focus: function(){ if (initConfig.mode != "AlertTip") { $.formValidator.setTipState(this, "onFocus", setting.onFocus) }; }, //失去焦点 blur: function(){ if(this.validValueOld==undefined || this.validValueOld==jqobj.val()){$(this).trigger("change")} }, //选择项目后触发 change: function(){ var returnObj = $.formValidator.oneIsValid(id); if(returnObj==null){return;} if ( returnObj.ajax >= 0){ $.formValidator.showAjaxMessage(returnObj); }else{ $.formValidator.showMessage(returnObj); } } }); } }); }; $.fn.inputValidator = function(controlOptions) { var settings = {}; $.extend(true, settings, inputValidator_setting, controlOptions || {}); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.compareValidator = function(controlOptions) { var settings = {}; $.extend(true, settings, compareValidator_setting, controlOptions || {}); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.regexValidator = function(controlOptions) { var settings = {}; $.extend(true, settings, regexValidator_setting, controlOptions || {}); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.functionValidator = function(controlOptions) { var settings = {}; $.extend(true, settings, functionValidator_setting, controlOptions || {}); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.ajaxValidator = function(controlOptions) { var settings = {}; $.extend(true, settings, ajaxValidator_setting, controlOptions || {}); return this.each(function() { var initConfig = $("body").data(this.validatorGroup); if($.inArray(this,initConfig.ajaxObjects) == -1) { initConfig.ajaxObjects.push(this); } this.validatorAjaxIndex = $.formValidator.appendValid(this.id,settings); }); }; $.fn.passwordValidator = function(controlOptions) { //默认配置 var settings = {}; $.extend(true, settings, passwordValidator_setting, controlOptions || {}); return this.each(function() { this.validatorPasswordIndex = $.formValidator.appendValid(this.id,settings); }); }; //指定控件显示通过或不通过样式 $.fn.defaultPassed = function(onShow) { return this.each(function() { var settings = this.settings; settings[0].defaultPassed = true; this.onceValided = true; for ( var i = 1 ; i < settings.length ; i ++ ) { settings[i].isValid = true; if(!($("body").data(settings[0].validatorGroup).mode == "AlertTip")){ this.lastshowclass = onShow ? "onShow" : "onCorrect"; this.lastshowmsg = onShow ? settings[0].onShow : settings[0].onCorrect; $.formValidator.setTipState(this,this.lastshowclass, this.lastshowmsg); } } }); }; //指定控件不参加校验 $.fn.unFormValidator = function(unbind) { return this.each(function() { if(this.settings) { this.settings[0].bind = !unbind; if(unbind){ $("#"+this.settings[0].tipID).hide(); }else{ $("#"+this.settings[0].tipID).show(); } } }); }; //显示漂浮显示层 $.fn.showTooltips = function() { if($("body [id=fvtt]").length==0){ fvtt = $("
"); $("body").append(fvtt); fvtt.before(""); } return this.each(function() { jqobj = $(this); s = $(""); b = $(""); this.tooltip = $("").append(s).append(b).css({"filter":"alpha(opacity:95)","KHTMLOpacity":"0.95","MozOpacity":"0.95","opacity":"0.95"}); //注册事件 jqobj.bind({ mouseover : function(e){ $("#fvtt").empty().append(this.tooltip).show(); $("#fv_content").html(this.Tooltip); $.formValidator.localTooltip(e); }, mouseout : function(){ $("#fvtt").hide(); }, mousemove: function(e){ $.formValidator.localTooltip(e); } }); }); } })(jQuery); var initConfig_setting = { theme:"Default", validatorGroup : "1", //分组号 formID:"", //表单ID submitOnce:false, //页面是否提交一次,不会停留 ajaxForm : null, //如果不为null,表示整个表单ajax提交 mode : "FixTip", //显示模式 errorFocus:true, //第一个错误的控件获得焦点 wideWord:true, //一个汉字当做2个长 forceValid:false, //控件输入正确之后,才允许失去焦 debug:false, //调试模式点 inIframe:false, onSuccess: function() {return true}, //提交成功后的回调函数 onError: $.noop, //提交失败的回调函数度 onAlert: function() {alert(arguments[0])}, status:"", //提交的状态:submited、sumbiting、sumbitingWithAjax ajaxPrompt : "当前有数据正在进行服务器端校验,请稍候", //控件失去焦点后,触发ajax校验,没有返回结果前的错误提示 validCount:0, //含ajaxValidator的控件个数 ajaxCountSubmit:0, //提交的时候触发的ajax验证个数 ajaxCountValid:0, //失去焦点时候触发的ajax验证个数 validObjects:[], //参加校验的控件集合 ajaxObjects:[], //传到服务器的控件列表 showTextObjects:"", validateType : "initConfig", offsetChrome : {left:42,top:0}, oneByOneVerify : false }; var formValidator_setting = { validatorGroup : "1", onShowText : "", onShowTextColor:{mouseOnColor:"#000000",mouseOutColor:"#999999"}, onShowFixText:"", onShow :"请输入内容", onFocus: "请输入内容", onCorrect: "输入正确", onEmpty: "输入内容为空", empty :false, autoModify : false, defaultValue : null, bind : true, ajax : false, validateType : "formValidator", tipCss : { left:10, top:-4, height:20, width:280 }, triggerEvent:"blur", forceValid : false, tipID : null, pwdTipID : null, fixTipID : null, relativeID : null, index : 0, leftTrim : false, rightTrim : false }; var inputValidator_setting = { isValid : false, type : "size", min : 0, max : 99999, onError:"输入错误", validateType:"inputValidator", empty:{leftEmpty:true,rightEmpty:true,leftEmptyError:null,rightEmptyError:null} }; var compareValidator_setting = { isValid : false, desID : "", operateor :"=", onError:"输入错误", validateType:"compareValidator" }; var regexValidator_setting = { isValid : false, regExp : "", param : "i", dataType : "string", compareType : "||", onError:"输入的格式不正确", validateType:"regexValidator" }; var ajaxForm_setting = { type : "GET", url : window.location.href, dataType : "html", timeout : 100000, data : null, type : "GET", async : true, cache : false, buttons : null, beforeSend : function(){return true;}, success : function(){return true;}, complete : $.noop, processData : true, error : $.noop }; var ajaxValidator_setting = { isValid : false, lastValid : "", oneceValid : false, randNumberName : "rand", onError:"服务器校验没有通过", onWait:"正在等待服务器返回数据", validateType:"ajaxValidator" }; $.extend(true,ajaxValidator_setting,ajaxForm_setting); var functionValidator_setting = { isValid : true, fun : function(){this.isValid = true;}, validateType:"functionValidator", onError:"输入错误" }; var passwordValidator_setting = { isValid : true, compareID : "", validateType:"passwordValidator", onErrorContinueChar:"密码字符为连续字符不被允许", onErrorSameChar:"密码字符都相同不被允许", onErrorCompareSame:"密码于用户名相同不被允许" }; var fv_scriptSrc = document.getElementsByTagName('script')[document.getElementsByTagName('script').length - 1].src;