opsv2/static/js/formvalidator/formValidator.js
2020-12-01 16:31:04 +08:00

1456 lines
45 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//====================================================================================================
// [插件名称] 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) {
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.msie)
{
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)};
var parmArray = parmString.split("&");
var parmStringNew="";
$.each(parmArray,function(index,data){
var li_pos = data.indexOf("=");
if(li_pos >0){
var name = data.substring(0,li_pos);
var value = escape(decodeURIComponent(data.substr(li_pos+1)));
var parm = name+"="+value;
parmStringNew = parmStringNew=="" ? parm : parmStringNew + '&' + parm;
}
});
return parmStringNew;
},
//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<str.length;i++){
if(str.charCodeAt(i) != flag+1 && flag!=0)
return false;
else
flag = str.charCodeAt(i);
}
return true;
}
//是否字符都相同
function isSameChar(str){
var str = str.toLowerCase();
var flag = 0;
for(var i=0;i<str.length;i++){
if(str.charCodeAt(i) != flag && flag!=0)
return false;
else
flag = str.charCodeAt(i);
}
return true;
}
//获取标记所在的位置用1表示
function getFlag(val,sum,index)
{
if(sum==undefined){sum=[0,0,0,0]}
if(index==undefined){index=-1};
index ++;
sum[index] = val % 2;
val = Math.floor(val / 2);
if(val==1 || val==0){sum[index+1] = val;return sum}
sum = getFlag(val,sum,index);
return sum;
}
//判断密码各个位置的组成情况
if(pwd==""){return 0};
if(setting.onErrorContinueChar!="" && isContinuousChar(pwd)){return -1};
if(setting.onErrorSameChar!="" && isSameChar(pwd)){return -2};
if(setting.compareID!="" && $("#"+setting.compareID).val()==pwd){return -3};
var sum1 = [0, 0, 0, 0];
var specicalChars = "!,@,#,$,%,\^,&,*,?,_,~";
var len = pwd.length;
for (var i=0; i< len; i++) {
var c = pwd.charCodeAt(i);
if (c >=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 = $("<div style='position:absolute;' id='"+tip+"'></div>").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 = $("<div id='fvtt' style='position:absolute;z-index:56002'></div>");
$("body").append(fvtt);
fvtt.before("<iframe index=0 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").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;