📄 formvalidator.js
字号:
//====================================================================================================
// [插件名称] jQuery formValidator
//----------------------------------------------------------------------------------------------------
// [描 述] jQuery formValidator表单验证插件,它是基于jQuery类库,实现了js脚本于页面的分离。对一个表
// 单对象,你只需要写一行代码就可以轻松实现20种以上的脚本控制。现支持一个表单元素累加很多种
// 校验方式,采用配置信息的思想,而不是把信息写在表单元素上,能比较完美的实现ajax请求。
//----------------------------------------------------------------------------------------------------
// [作者网名] 猫冬
// [日 期] 2008-01-11
// [邮 箱] wzmaodong@126.com
// [作者博客] http://wzmaodong.cnblogs.com
//====================================================================================================
var jQuery_formValidator_initConfig;
(function($) {
$.formValidator =
{
//各种校验方式支持的控件类型
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":
if (srcTag == "INPUT" || srcTag == "TEXTAREA" || srcTag == "SELECT"){
return true;
}else{
return false;
}
case "CompareValidator":
if (srcTag == "INPUT" || srcTag == "TEXTAREA")
{
if (stype == "checkbox" || stype == "radio"){
return false;
}else{
return true;
}
}
return false;
case "AjaxValidator":
if (stype == "text" || stype == "textarea" || stype == "file" || stype == "select-one"){
return true;
}else{
return false;
}
case "RegexValidator":
if (srcTag == "INPUT" || srcTag == "TEXTAREA")
{
if (stype == "checkbox" || stype == "radio"){
return false;
}else{
return true;
}
}
return false;
case "FunctionValidator":
return true;
}
},
initConfig : function(controlOptions)
{
var settings =
{
debug:false,
validatorgroup : "1",
alertmessage:false,
validobjectids:"",
onsuccess: function() {return true;},
onerror:function() {},
submitonce:false,
formid:"",
autotip: false
};
controlOptions = controlOptions || {};
$.extend(settings, controlOptions);
if(settings.formid!=""){$("#"+settings.formid).submit(function(){return $.formValidator.pageIsValid("1");})};
if (jQuery_formValidator_initConfig == null ){jQuery_formValidator_initConfig = new Array();}
jQuery_formValidator_initConfig.push( settings );
},
//如果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 || srcjo.settings == undefined ){srcjo.settings = new Array();}
var len = srcjo.settings.push( setting );
srcjo.settings[len - 1].index = len - 1;
return len - 1;
},
//如果validator对象对应的element对象的validator属性追加要进行的校验。
getInitConfig : function( validatorgroup )
{
if(jQuery_formValidator_initConfig!=null)
{
for(i=0;i<jQuery_formValidator_initConfig.length;i++)
{
if(validatorgroup==jQuery_formValidator_initConfig[i].validatorgroup)
{
return jQuery_formValidator_initConfig[i];
}
}
}
return null;
},
//触发每个控件上的各种校验
triggerValidate : function(returnObj)
{
switch(returnObj.setting.validatetype)
{
case "InputValidator":
$.formValidator.inputValid(returnObj);
break;
case "CompareValidator":
$.formValidator.compareValid(returnObj);
break;
case "AjaxValidator":
$.formValidator.ajaxValid(returnObj);
break;
case "RegexValidator":
$.formValidator.regexValid(returnObj);
break;
case "FunctionValidator":
$.formValidator.functionValid(returnObj);
break;
}
},
//设置显示信息
setTipState : function(tipid,showclass,showmsg)
{
var tip = $("#"+tipid);
if(showmsg==null || showmsg==""){
tip.hide();
}else
{
tip.show();
tip.removeClass();
tip.addClass( showclass );
tip.html( "<nobr>"+showmsg+"</nobr>" );
}
},
//设置错误的显示信息
setFailState : function(tipid,showmsg)
{
var tip = $("#"+tipid);
tip.removeClass();
tip.addClass( "onError" );
tip.html( showmsg );
},
//根据单个对象,正确:正确提示,错误:错误提示
showMessage : function(returnObj)
{
var id = returnObj.id;
var isvalid = returnObj.isvalid;
var setting = returnObj.setting;//正确:setting[0],错误:对应的setting[i]
var showmsg = "";
var showclass = "";
var settings = $("#"+id).get(0).settings;
var intiConfig = $.formValidator.getInitConfig(settings[0].validatorgroup);
if (!isvalid)
{
if(setting.validatetype=="AjaxValidator")
{
if(setting.lastValid=="")
{
showclass = "onLoad";
showmsg = setting.onwait;
}
else
{
showclass = "onError";
showmsg = setting.onerror;
}
}
else
{
showmsg = (returnObj.errormsg==""? setting.onerror : returnObj.errormsg);
showclass = "onError";
}
if(intiConfig.alertmessage)
{
var elem = $("#"+id).get(0);
if(elem.validoldvalue!=$(elem).val()){alert(showmsg);}
}
else
{
$.formValidator.setTipState(settings[0].tipid,showclass,showmsg);
}
}
else
{
//验证成功后,如果没有设置成功提示信息,则给出默认提示,否则给出自定义提示;允许为空,值为空的提示
if(!intiConfig.alertmessage)
{
var showmsg = "";
if ( $.formValidator.isEmpty(id)){
showmsg = setting.onempty;
}else{
showmsg = setting.oncorrect;
}
$.formValidator.setTipState(setting.tipid,"onSuccess",showmsg);
}
}
},
//获取指定字符串的长度
getLength : function(id)
{
var srcjo = $("#"+id);
sType = srcjo.get(0).type;
var len = 0;
switch(sType)
{
case "text":
case "hidden":
case "password":
case "textarea":
case "file":
var val = srcjo.val();
for (var i = 0; i < val.length; i++)
{
if (val.charCodeAt(i) >= 0x4e00 && val.charCodeAt(i) <= 0x9fa5){
len += 2;
}else {
len++;
}
}
break;
case "checkbox":
case "radio":
len = $("input[@type='"+sType+"'][@name='"+srcjo.attr("name")+"'][@checked]").length;
break;
case "select-one":
len = srcjo.get(0).options ? srcjo.get(0).options.selectedIndex : -1;
break;
case "select-multiple":
len = $("select[@name="+srcjo.get(0).name+"] option[@selected]").length;
break;
}
return len;
},
//结合empty这个属性,判断仅仅是否为空的校验情况。
isEmpty : function(id)
{
if($("#"+id).get(0).settings[0].empty && $.formValidator.getLength(id)==0){
return true;
}else{
return false;
}
},
//对外调用:判断单个表单元素是否验证通过,不带回调函数
isOneValid : function(id)
{
return $.formValidator.oneIsValid(id,1).isvalid;
},
//验证单个是否验证通过,正确返回settings[0],错误返回对应的settings[i]
oneIsValid : function (id,index)
{
var returnObj = new Object();
returnObj.id = id;
returnObj.ajax = -1;
returnObj.errormsg = ""; //自定义错误信息
var elem = $("#"+id).get(0);
var settings = elem.settings;
var settingslen = settings.length;
//只有一个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];
if(settings[i].validatetype!="AjaxValidator") {
$.formValidator.triggerValidate(returnObj);
}else{
returnObj.ajax = i;
}
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;
},
resetTipState : function(validatorgroup)
{
var initConfig = $.formValidator.getInitConfig(validatorgroup);
var jqObjs = $(initConfig.validobjectids);
jqObjs.each(function(){
var setting0 = this.settings[0];
$.formValidator.setTipState(setting0.tipid,"onShow",setting0.onshow);
});
},
//验证所有需要验证的对象,并返回是否验证成功。
pageIsValid : function (validatorgroup)
{
if(validatorgroup == null || validatorgroup == undefined) validatorgroup = "1";
var isvalid = true;
var thefirstid = "",thefirsterrmsg;
var returnObj,setting;
var error_tip = "^";
var initConfig = $.formValidator.getInitConfig(validatorgroup);
var jqObjs = $(initConfig.validobjectids);
jqObjs.each(function(i,elem)
{
if(elem.settings[0].bind){
returnObj = $.formValidator.oneIsValid(elem.id,1);
if(returnObj)
{
var tipid = elem.settings[0].tipid;
//校验失败,获取第一个发生错误的信息和ID
if (!returnObj.isvalid) {
isvalid = false;
if (thefirstid == ""){
thefirstid = returnObj.id;
thefirsterrmsg = (returnObj.errormsg==""?returnObj.setting.onerror:returnObj.errormsg)
}
}
//为了解决使用同个TIP提示问题:后面的成功或失败都不覆盖前面的失败
if (!initConfig.alertmessage){
if (error_tip.indexOf("^" + tipid + "^") == -1) {
error_tip = error_tip + tipid + "^";
if (!returnObj.isvalid) {
error_tip = error_tip + tipid + "^";
}
$.formValidator.showMessage(returnObj);
}
}
}
}
});
//成功或失败后,进行回调函数的处理,以及成功后的灰掉提交按钮的功能
if(isvalid)
{
isvalid = initConfig.onsuccess();
if(initConfig.submitonce){$("input[@type='submit']").attr("disabled",true);}
}
else
{
var obj = $("#"+thefirstid).get(0);
initConfig.onerror(thefirsterrmsg,obj);
if(thefirstid!=""){$("#"+thefirstid).focus();}
}
return !initConfig.debug && isvalid;
},
//ajax校验
ajaxValid : function(returnObj)
{
var id = returnObj.id;
var srcjo = $("#"+id);
var setting = srcjo.get(0).settings[returnObj.ajax];
var ls_url = setting.url;
if (srcjo.size() == 0 && srcjo.get(0).settings[0].empty) {
returnObj.setting = $("#"+id).get(0).settings[0];
returnObj.isvalid = true;
$.formValidator.showMessage(returnObj);
setting.isvalid = true;
return;
}
if(setting.addidvalue)
{
var parm = "clientid="+id+"&"+id+"="+encodeURIComponent(srcjo.val());
ls_url = ls_url + ((ls_url).indexOf("?")>0?("&"+ parm) : ("?"+parm));
}
$.ajax(
{
mode : "abort",
type : setting.type,
url : ls_url,
cache : setting.cache,
data : setting.data,
async : setting.async,
dataType : setting.datatype,
success : function(data){
setting0 = srcjo.get(0).settings[0];
if(setting.success(data))
{
$.formValidator.setTipState(setting0.tipid,"onSuccess",setting0.oncorrect);
setting.isvalid = true;
}
else
{
$.formValidator.setTipState(setting0.tipid,"onError",setting.onerror);
setting.isvalid = false;
}
},
complete : function(){
if(setting.buttons && setting.buttons.length > 0) setting.buttons.attr({"disabled":false});
setting.complete;
},
beforeSend : function(xhr){
//再服务器没有返回数据之前,先回调提交按钮
if(setting.buttons && setting.buttons.length > 0) setting.buttons.attr({"disabled":true});
var isvalid = setting.beforesend(xhr);
if(isvalid) setting.isvalid = false; //如果前面ajax请求成功了,再次请求之前先当作错误处理
setting.lastValid = "-1";
return isvalid;
},
error : function(){
setting0 = srcjo.get(0).settings[0];
$.formValidator.setTipState(setting0.tipid,"onError",setting.onerror);
setting.isvalid = false;
setting.error();
},
processData : setting.processdata
});
},
//对正则表达式进行校验(目前只针对input和textarea)
regexValid : function(returnObj)
{
var id = returnObj.id;
var setting = returnObj.setting;
var srcTag = $("#"+id).get(0).tagName;
var elem = $("#"+id).get(0);
//如果有输入正则表达式,就进行表达式校验
if(elem.settings[0].empty && elem.value==""){
setting.isvalid = true;
}
else
{
var regexpress = setting.regexp;
if(setting.datatype=="enum"){regexpress = eval("regexEnum."+regexpress);}
if(regexpress==undefined || regexpress==""){
setting.isvalid = false;
return;
}
var exp = new RegExp(regexpress, setting.param);
if (exp.test($("#"+id).val())){
setting.isvalid = true;
}else {
setting.isvalid = false;
}
}
},
//函数校验。返回true/false表示校验是否成功;返回字符串表示错误信息,校验失败;如果没有返回值表示处理函数,校验成功
functionValid : function(returnObj)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -