jQuery学习总结
1,看到一些好东西,先收藏着,等学完了js就学习jquery。
jquery
//==================================================================================================== // [插件名称] jQuery formValidator //---------------------------------------------------------------------------------------------------- // [描 述] jQuery formValidator表单验证插件,它是基于jQuery类库,实现了js脚本于页面的分离。对一个表 // 单对象,你只需要写一行代码就可以轻松实现20种以上的脚本控制。现支持一个表单元素累加很多种 // 校验方式,采用配置信息的思想,而不是把信息写在表单元素上,能比较完美的实现ajax请求。 //---------------------------------------------------------------------------------------------------- // [作者网名] 猫冬 // [邮 箱] wzmaodong@126.com // [作者博客] http://wzmaodong.cnblogs.com // [QQ群交流] 74106519 // [更新日期] 2011-05-22 // [版 本 号] ver4.0.1 //==================================================================================================== (function($) { $.formValidator = { //全局配置 initConfig : function(controlOptions) { var settings = { debug:false, //调试模式 validatorGroup : "1", //分组号 alertMessage:false, //是否为弹出窗口提示模式 validObjects:[], //参加校验的控件集合 ajaxObjects:"", //传到服务器的控件列表 ajaxKeyOfObject:"", // 要校验的ajax对象的值存在哪个key中。 forceValid:false, //控件输入正确之后,才允许失去焦点 onSuccess: function() {return true;}, //提交成功后的回调函数 onError: $.noop, //提交失败的回调函数 submitOnce:false, //页面是否提交一次,不会停留 formID:"", //表单ID submitButtonID:"", //提交按钮ID autoTip: false, //是否自动构建提示层 tidyMode:false, //精简模式 errorFocus:true, //第一个错误的控件获得焦点 wideWord:true, //一个汉字当做2个长度 status:"", //提交的状态:submited、sumbiting、sumbitingWithAjax submitAfterAjaxPrompt : "当前有数据正在进行服务器端校验,请稍候", //控件失去焦点后,触发ajax校验,没有返回结果前的错误提示 validCount:0, //含ajaxValidator的控件个数 ajaxCountSubmit:0, //提交的时候触发的ajax验证个数 ajaxCountValid:0, //失去焦点时候触发的ajax验证个数 inIframe:false }; controlOptions = controlOptions || {}; $.extend(settings, controlOptions); //如果是精简模式,发生错误的时候,第一个错误的控件就不获得焦点 if(settings.tidyMode){settings.errorFocus=false}; //如果填写了表单和按钮,就注册验证事件 if(settings.formID!=""){ $("#"+settings.formID).submit(function(){return $.formValidator.bindSubmit(settings);}); } else if(settings.submitButtonID!="") { $("#"+settings.submitButtonID).click(function(){return $.formValidator.bindSubmit(settings);}); } $('body').data(settings.validatorGroup, settings); }, //调用验证函数 bindSubmit : function(settings) { //if (settings.ajaxCountValid > 0 && settings.submitAfterAjaxPrompt != "") { // alert(settings.submitAfterAjaxPrompt); // return false; //} return $.formValidator.pageIsValid(settings.validatorGroup); }, //各种校验方式支持的控件类型 sustainType : function(id,setting) { var elem = $("#"+id).get(0); var srcTag = elem.tagName; var stype = elem.type; switch(setting.validateType) { case "InitValidator": 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; } }, //如果validator对象对应的element对象的validator属性追加要进行的校验。 appendValid : function(id, setting ) { //如果是各种校验不支持的类型,就不追加到。返回-1表示没有追加成功 if(!$.formValidator.sustainType(id,setting)) return -1; var srcjo = $("#"+id).get(0); //重新初始化 if (setting.validateType=="InitValidator" || srcjo.settings == undefined ){srcjo.settings = new Array();} var len = srcjo.settings.push( setting ); srcjo.settings[len - 1].index = len - 1; return len - 1; }, //设置显示信息 setTipState : function(elem,showclass,showmsg) { var initConfig = $('body').data(elem.validatorGroup); var tip = $("#"+elem.settings[0].tipID); // 当元素为text时,错误的时候加上红框。 if (showclass == 'onError' && (elem.type == 'text' || elem.type == 'password')) { $(elem).removeClass('rightColor').addClass('wrongColor'); } if (showclass != 'onError' && (elem.type == 'text' || elem.type == 'password')) { $(elem).removeClass('wrongColor').addClass('rightColor'); } if(showmsg==null || showmsg=="") { tip.hide(); } else { showmsg = (showmsg == 'correct') ? '' : showmsg; if(initConfig.tidyMode) { //显示和保存提示信息 $("#fv_content").html(showmsg); elem.Tooltip = showmsg; if(showclass!="onError"){tip.hide();} } else { tip.show().removeClass().addClass( showclass ).html( showmsg ); } } }, //把提示层重置成原始提示(如果有defaultPassed,应该设置为onCorrect) resetTipState : function(validatorGroup) { if(validatorGroup == undefined){validatorGroup = "1"}; var initConfig = $('body').data(validatorGroup); $.each(initConfig.validObjects,function(){ var elem = this.get(0); var setting = elem.settings[0]; var passed = setting.defaultPassed; $.formValidator.setTipState(elem, passed ? "onCorrect" : "onShow", passed ? setting.onCorrect : setting.onShow); }); }, //设置错误的显示信息 setFailState : function(tipID,showmsg) { var tip = $("#"+tipID); tip.removeClass().addClass("onError").html(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 = setting.onError; } } else { showmsg = (returnObj.errormsg==""? setting.onError : returnObj.errormsg); } if(intiConfig.alertMessage) { if(elem.validValueOld!=$(elem).val()){alert(showmsg);} } else { $.formValidator.setTipState(elem,showclass,showmsg); } } else { //验证成功后,如果没有设置成功提示信息,则给出默认提示,否则给出自定义提示;允许为空,值为空的提示 if ($.formValidator.isEmpty(id)) { showmsg = setting.onEmpty; $.formValidator.setTipState(elem,"onShow",showmsg); } else { showmsg = setting.onCorrect; $.formValidator.setTipState(elem,"onCorrect",showmsg); } //showmsg = $.formValidator.isEmpty(id) ? setting.onEmpty : setting.onCorrect; //$.formValidator.setTipState(elem,"onCorrect",showmsg); } return showmsg; }, showAjaxMessage : function(returnObj) { var elem = $("#"+returnObj.id).get(0); var setting = elem.settings[returnObj.ajax]; var validValueOld = elem.validValueOld; var validvalue = $(elem).val(); returnObj.setting = setting; //defaultPassed还未处理 if(validValueOld!= validvalue || validValueOld == validvalue && !elem.onceValided) { $.formValidator.ajaxValid(returnObj); } else { if(setting.isValid!=undefined && !setting.isValid){ elem.lastshowclass = "onError"; elem.lastshowmsg = 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 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 returnObj = new Object(); var elem = $("#"+id).get(0); returnObj.initConfig = $('body').data(elem.validatorGroup); returnObj.id = id; returnObj.ajax = -1; returnObj.errormsg = ""; //自定义错误信息 var settings = elem.settings; var settingslen = settings.length; var validateType; //只有一个formValidator的时候不检验 if (settingslen==1){settings[0].bind=false;} if(!settings[0].bind){return null;} for ( var i = 0 ; i < settingslen ; i ++ ) { if(i==0){ //如果为空,直接返回正确 if($.formValidator.isEmpty(id)){ returnObj.isValid = true; returnObj.setting = settings[0]; break; } continue; } returnObj.setting = settings[i]; validateType = settings[i].validateType; //根据类型触发校验 switch(validateType) { case "InputValidator": $.formValidator.inputValid(returnObj); break; case "CompareValidator": $.formValidator.compareValid(returnObj); break; case "RegexValidator": $.formValidator.regexValid(returnObj); break; case "FunctionValidator": $.formValidator.functionValid(returnObj); break; case "AjaxValidator": //如果是ajax校验,这里直接取上次的结果值 returnObj.ajax = i; //$.formValidator.ajaxValid(returnObj); break; } //校验过一次 elem.onceValided = true; if(!settings[i].isValid) { returnObj.isValid = false; returnObj.setting = settings[i]; break; }else{ returnObj.isValid = true; returnObj.setting = settings[0]; if (settings[i].validateType == "AjaxValidator"){break}; } } return returnObj; }, //验证所有需要验证的对象,并返回是否验证成功(如果曾经触发过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() { // pageOnceValided控制需要在pageisValid中检查一次ajax。 if (this.validatorAjaxIndex != undefined && this.pageOnceValided == undefined) { this.onceValided = undefined; } this.pageOnceValided = undefined; if (this.settings[0].bind && this.validatorAjaxIndex!=undefined && this.onceValided == undefined) { returnObj = $.formValidator.oneIsValid(this.id); this.pageOnceValided = true; 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.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.alertMessage) { var tipID = this.settings[0].tipID; if (error_tip.indexOf("^" + tipID + "^") == -1) { if (!returnObj.isValid) {error_tip = error_tip + tipID + "^"}; $.formValidator.showMessage(returnObj); } } } } } }); //成功或失败进行回调函数的处理,以及成功后的灰掉提交按钮的功能 if(isValid) { initConfig.onSuccess(); if(initConfig.submitOnce){$(":submit,:button,:reset").attr("disabled",true);} } else { initConfig.onError(firstErrorMessage, $("#" + thefirstid).get(0), errorlist); if (thefirstid && initConfig.errorFocus) { $("#" + thefirstid).focus(); $("#" + thefirstid).blur(); //$("#"+ firstTipId).removeClass().addClass("onError").html(firstErrorMessage); }; } initConfig.status="init"; return !initConfig.debug && isValid; }, //ajax校验 ajaxValid : function(returnObj) { var id = returnObj.id; var srcjo = $("#"+id); var elem = srcjo.get(0); var initConfig = returnObj.initConfig; var settings = elem.settings; var setting = settings[returnObj.ajax]; var ls_url = setting.url; //获取要传递的参数 var validatorGroup = elem.validatorGroup; var initConfig = $('body').data(validatorGroup); var parm = $(initConfig.ajaxObjects).serialize(); //添加触发的控件名、随机数、传递的参数 if (initConfig.ajaxKeyOfObject != "") { parm = initConfig.ajaxKeyOfObject + "=" + encodeURI($(initConfig.ajaxObjects).val()); } else { parm = "clientid=" + id + "&" +(setting.randNumberName ? setting.randNumberName+"="+((new Date().getTime())+Math.round(Math.random() * 10000)) : "") + (parm.length > 0 ? "&" + parm : ""); } ls_url = ls_url + (ls_url.indexOf("?") > -1 ? ("&" + parm) : ("?" + parm)); //发送ajax请求 $.ajax( { type : setting.type, url : ls_url, cache : setting.cache, data : setting.data, async : setting.async, timeout : setting.timeout, dataType : setting.dataType, success : function(data, textStatus, jqXHR){ var lb_ret,ls_status,ls_msg; $.formValidator.dealAjaxRequestCount(validatorGroup,-1); //根据业务判断设置显示信息 lb_ret = setting.success(data, textStatus, jqXHR); setting.isValid = lb_ret; if(lb_ret){ ls_status = "onCorrect"; ls_msg = settings[0].onCorrect; }else{ ls_status = "onError"; ls_msg = setting.onError; } $.formValidator.setTipState(elem,ls_status,ls_msg); //提交的时候触发了ajax校验,等ajax校验完成,无条件重新校验 if(returnObj.initConfig.status=="sumbitingWithAjax" && returnObj.initConfig.ajaxCountSubmit == 0) { if (initConfig.formID != "") { $('#' + initConfig.formID).trigger('submit'); }else if (initConfig.formID != ""){ $('#' + initConfig.submitButtonID).trigger('click'); } } }, 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 isValid = setting.beforeSend(jqXHR,configs); if(isValid) { setting.isValid = false; //如果前面ajax请求成功了,再次请求之前先当作错误处理 $.formValidator.setTipState(elem,"onLoad",settings[returnObj.ajax].onWait); } setting.lastValid = "-1"; if(isValid){$.formValidator.dealAjaxRequestCount(validatorGroup,1);} return isValid; }, error : function(jqXHR, textStatus, errorThrown){ $.formValidator.dealAjaxRequestCount(validatorGroup,-1); $.formValidator.setTipState(elem,"onError",setting.onError); setting.isValid = false; 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; } } }, //对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": val = val.replace(/^[ \s]+/, ''); val = val.replace(/[ \s]+$/, ''); $("#" + id).val(val); len = val.length; case "hidden": case "password": case "textarea": val = val.replace(/^[ \s]+/, ''); val = val.replace(/[ \s]+$/, ''); $("#" + id).val(val); len = val.length; 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; } }, //定位漂浮层 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.autoTip && !initConfig.tidyMode) { //获取层的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"}); } }); } }; //每个校验控件必须初始化的 $.fn.formValidator = function(cs) { var setting = { validatorGroup : "1", empty :false, autoModify : false, onShow :"", onFocus: "请输入内容", onCorrect: "输入正确", onEmpty: "", defaultValue : null, bind : true, ajax : false, validateType : "InitValidator", tipCss : { "left" : "10px", "top" : "1px", "height" : "20px", "width":"250px" }, triggerEvent:"blur", forceValid : false, tipID : null, relativeID : null, index : 0 }; //获取该校验组的全局配置信息 cs = cs || {}; if(cs.validatorGroup == undefined){cs.validatorGroup = "1"}; var initConfig = $('body').data(cs.validatorGroup); //校验索引号,和总记录数 initConfig.validCount += 1; //如果为精简模式,tipCss要重新设置初始值 if(initConfig.tidyMode){setting.tipCss = {"left" : "2px","width":"22px","height":"22px","display":"none"}}; //弹出消息提示模式,自动修复错误 if(initConfig.alertMessage){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); var tip = setting_temp.tipID ? setting_temp.tipID : this.id+"Tip"; if(initConfig.autoTip) { if(!initConfig.tidyMode) { //获取层的ID、相对定位控件的ID和坐标 if($("body [id="+tip+"]").length==0) { var relativeID = setting_temp.relativeID ? setting_temp.relativeID : this.id; var offset = $("#"+relativeID ).position(); var y = offset.top; var x = $("#"+relativeID ).width() + offset.left; var formValidateTip = $("<div class='formValidateTip'></div>"); if(initConfig.inIframe){formValidateTip.hide();} formValidateTip.appendTo($("body")).css({left: x+"px", top: y+"px"}).prepend($('<div id="'+tip+'"></div>').css(setting_temp.tipCss)); setting.relativeID = relativeID ; } } else { jqobj.showTooltips(); } } //每个控件都要保存这个配置信息、为了取数方便,冗余一份控件总体配置到控件上 if (this.type == 'radio') { tip = this.name + 'Tip'; } setting.tipID = tip; $.formValidator.appendValid(this.id,setting); //保存控件ID if($.inArray(jqobj,initConfig.validObjects) == -1) { if (setting_temp.ajax) { var ajax = initConfig.ajaxObjects; initConfig.ajaxObjects = ajax + (ajax != "" ? ",#" : "#") + this.id; } initConfig.validObjects.push(this); } //初始化显示信息 if(!initConfig.alertMessage){ $.formValidator.setTipState(this,"onShow",setting.onShow); } var srcTag = this.tagName.toLowerCase(); var stype = this.type; var defaultval = setting.defaultValue; //处理默认值 if(defaultval){ jqobj.val(defaultval); } if(srcTag == "input" || srcTag=="textarea") { if (this.type == 'radio') { //注册失去焦点的事件。进行校验,改变提示对象的文字和样式;出错就提示处理 jqobj.change(function(){ var settings = this.settings; var returnObj = $.formValidator.oneIsValid(this.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 && (this.type=="text" || this.type=="textarea" || this.type=="file"); if(auto) { $(this).val(this.validValueOld); if(!initConfig.alertMessage){$.formValidator.setTipState(this,"onShow",setting.onShow)}; } else { if(initConfig.forceValid || setting.forceValid){ alert(showmsg);this.focus(); } } } } }); } else { //注册获得焦点的事件。改变提示对象的文字和样式,保存原值 jqobj.focus(function() { if(!initConfig.alertMessage){ //保存原来的状态 var tipjq = $("#"+tip); this.lastshowclass = tipjq.attr("class"); this.lastshowmsg = tipjq.html(); $.formValidator.setTipState(this,"onFocus",setting.onFocus); } if (stype == "password" || stype == "text" || stype == "textarea" || stype == "file") { // 暂时清除validValueOld的值,不好的地方是当用户blurajax控件时,需要重新请求一次,优点是避免提示的不一致。Jxc //this.validValueOld = jqobj.val(); } }); //注册失去焦点的事件。进行校验,改变提示对象的文字和样式;出错就提示处理 jqobj.bind(setting.triggerEvent, function(){ var settings = this.settings; var returnObj = $.formValidator.oneIsValid(this.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 && (this.type=="text" || this.type=="textarea" || this.type=="file"); if(auto) { $(this).val(this.validValueOld); if(!initConfig.alertMessage){$.formValidator.setTipState(this,"onShow",setting.onShow)}; } else { if(initConfig.forceValid || setting.forceValid){ alert(showmsg);this.focus(); } } } } }); } } else if (srcTag == "select") { jqobj.bind({ //获得焦点 focus: function(){ if (!initConfig.alertMessage) { $.formValidator.setTipState(this, "onFocus", setting.onFocus) }; }, //失去焦点 blur: function(){$(this).trigger("change")}, //选择项目后触发 change: function(){ var returnObj = $.formValidator.oneIsValid(this.id); if(returnObj==null){return;} if ( returnObj.ajax >= 0){ $.formValidator.showAjaxMessage(returnObj); }else{ $.formValidator.showMessage(returnObj); } } }); } }); }; $.fn.inputValidator = function(controlOptions) { var settings = { isValid : false, min : 0, max : 99999999999999, type : "size", onError:"输入错误", validateType:"InputValidator", empty:{leftEmpty:true,rightEmpty:true,leftEmptyError:null,rightEmptyError:null} }; controlOptions = controlOptions || {}; $.extend(true, settings, controlOptions); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.compareValidator = function(controlOptions) { var settings = { isValid : false, desID : "", operateor :"=", onError:"输入错误", validateType:"CompareValidator" }; controlOptions = controlOptions || {}; $.extend(true, settings, controlOptions); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.regexValidator = function(controlOptions) { var settings = { isValid : false, regExp : "", param : "i", dataType : "string", compareType : "||", onError:"输入的格式不正确", validateType:"RegexValidator" }; controlOptions = controlOptions || {}; $.extend(true, settings, controlOptions); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.functionValidator = function(controlOptions) { var settings = { isValid : true, fun : function(){this.isValid = true;}, validateType:"FunctionValidator", onError:"输入错误" }; controlOptions = controlOptions || {}; $.extend(true, settings, controlOptions); return this.each(function(){ $.formValidator.appendValid(this.id,settings); }); }; $.fn.ajaxValidator = function(controlOptions) { var settings = { type : "GET", url : "", dataType : "html", timeout : 100000, data : null, async : true, cache : false, beforeSend : function(){return true;}, success : function(){return true;}, complete : function(){}, processData : true, error : function(){}, isValid : false, lastValid : "", buttons : null, oneceValid : false, randNumberName : "rand", onError:"服务器校验没有通过", onWait:"正在等待服务器返回数据", ajaxExistsError:"前面的校验尚未完成,请稍候...", validateType:"AjaxValidator" }; controlOptions = controlOptions || {}; $.extend(true, settings, controlOptions); return this.each(function() { var initConfig = $('body').data(this.validatorGroup); var ajax = initConfig.ajaxObjects; if((ajax+",").indexOf("#"+this.id+",") == -1) { initConfig.ajaxObjects = ajax + (ajax != "" ? ",#" : "#") + this.id; } this.validatorAjaxIndex = $.formValidator.appendValid(this.id,settings); }); }; //指定控件显示通过或不通过样式 $.fn.defaultPassed = function(onShow) { return this.each(function() { var settings = this.settings; settings[0].defaultPassed = true; for ( var i = 1 ; i < settings.length ; i ++ ) { settings[i].isValid = true; if(!$('body').data(settings[0].validatorGroup).alertMessage){ var ls_style = onShow ? "onShow" : "onCorrect"; $.formValidator.setTipState(this,ls_style,settings[0].onCorrect); } } }); }; //指定控件不参加校验 $.fn.unFormValidator = function(unbind) { return this.each(function() { 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 = $("<div id='fvtt' style='position:absolute;z-index:56002'></div>"); $("body").append(fvtt); fvtt.before("<iframe src='about:blank' class='fv_iframe' scrolling='no' frameborder='0'></iframe>"); } return this.each(function() { jqobj = $(this); s = $("<span class='top' id=fv_content style='display:block'></span>"); b = $("<b class='bottom' style='display:block' />"); this.tooltip = $("<span class='fv_tooltip' style='display:block'></span>").append(s).append(b).css({"filter":"alpha(opacity:95)","KHTMLOpacity":"0.95","MozOpacity":"0.95","opacity":"0.95"}); //注册事件 jqobj.bind({ mouseover : function(e){ $("#fvtt").append(this.tooltip); $("#fv_content").html(this.Tooltip); $.formValidator.localTooltip(e); }, mouseout : function(){ $("#fvtt").empty(); }, mousemove: function(e){ $("#fv_content").html(this.Tooltip); $.formValidator.localTooltip(e); } }); }); } })(jQuery);