login-template-01/js/Validform_v5.3.2.js

1331 lines
43 KiB
JavaScript
Raw 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.

/*
通用表单验证方法
Validform version 5.3.2
By sean during April 7, 2010 - March 26, 2013
For more information, please visit http://validform.rjboy.cn
Validform is available under the terms of the MIT license.
Demo:
$(".demoform").Validform({//$(".demoform")指明是哪一表单需要验证,名称需加在form表单上;
btnSubmit:"#btn_sub", //#btn_sub是该表单下要绑定点击提交表单事件的按钮;如果form内含有submit按钮该参数可省略;
btnReset:".btn_reset",//可选项 .btn_reset是该表单下要绑定点击重置表单事件的按钮;
tiptype:1, //可选项 1=>pop box,2=>side tip(parent.next.find; with default pop),3=>side tip(siblings; with default pop),4=>side tip(siblings; none pop)默认为1也可以传入一个function函数自定义提示信息的显示方式可以实现你想要的任何效果具体参见demo页;
ignoreHidden:false,//可选项 true | false 默认为false当为true时对:hidden的表单元素将不做验证;
dragonfly:false,//可选项 true | false 默认false当为true时值为空时不做验证
tipSweep:true,//可选项 true | false 默认为false只在表单提交时触发检测blur事件将不会触发检测实时验证会在后台进行不会显示检测结果;
label:".label",//可选项 选择符在没有绑定nullmsg时查找要显示的提示文字默认查找".Validform_label"下的文字;
showAllError:false,//可选项 true | falsetrue提交表单时所有错误提示信息都会显示false一碰到验证不通过的就停止检测后面的元素只显示该元素的错误信息;
postonce:true, //可选项 表单是否只能提交一次true开启不填则默认关闭;
ajaxPost:true, //使用ajax方式提交表单数据默认false提交地址就是action指定地址;
datatype:{//传入自定义datatype类型可以是正则也可以是函数函数内会传入一个参数;
"*6-20": /^[^\s]{6,20}$/,
"z2-4" : /^[\u4E00-\u9FA5\uf900-\ufa2d]{2,4}$/,
"username":function(gets,obj,curform,regxp){
//参数gets是获取到的表单元素值obj为当前表单元素curform为当前验证的表单regxp为内置的一些正则表达式的引用;
var reg1=/^[\w\.]{4,16}$/,
reg2=/^[\u4E00-\u9FA5\uf900-\ufa2d]{2,8}$/;
if(reg1.test(gets)){return true;}
if(reg2.test(gets)){return true;}
return false;
//注意return可以返回true 或 false 或 字符串文字true表示验证通过返回字符串表示验证失败字符串作为错误提示显示返回false则用errmsg或默认的错误提示;
},
"phone":function(){
// 5.0 版本之后要实现二选一的验证效果datatype 的名称 不 需要以 "option_" 开头;
}
},
usePlugin:{
swfupload:{},
datepicker:{},
passwordstrength:{},
jqtransform:{
selector:"select,input"
}
},
beforeCheck:function(curform){
//在表单提交执行验证之前执行的函数curform参数是当前表单对象。
//这里明确return false的话将不会继续执行验证操作;
},
beforeSubmit:function(curform){
//在验证成功后表单提交前执行的函数curform参数是当前表单对象。
//这里明确return false的话表单将不会提交;
},
callback:function(data){
//返回数据data是json格式{"info":"demo info","status":"y"}
//info: 输出提示信息;
//status: 返回提交数据的状态,是否提交成功。如可以用"y"表示提交成功,"n"表示提交失败在ajax_post.php文件返回数据里自定字符主要用在callback函数里根据该值执行相应的回调操作;
//你也可以在ajax_post.php文件返回更多信息在这里获取进行相应操作
//ajax遇到服务端错误时也会执行回调这时的data是{ status:**, statusText:**, readyState:**, responseText:** }
//这里执行回调操作;
//注意如果不是ajax方式提交表单传入callback这时data参数是当前表单对象回调函数会在表单验证全部通过后执行然后判断是否提交表单如果callback里明确return false则表单不会提交如果return true或没有return则会提交表单。
}
});
Validform对象的方法和属性
tipmsg自定义提示信息通过修改Validform对象的这个属性值来让同一个页面的不同表单使用不同的提示文字
dataType获取内置的一些正则
eq(n)获取Validform对象的第n个元素;
ajaxPost(flag,sync,url)以ajax方式提交表单。flag为true时跳过验证直接提交sync为true时将以同步的方式进行ajax提交传入了url地址时表单会提交到这个地址
abort()终止ajax的提交
submitForm(flag,url)以参数里设置的方式提交表单flag为true时跳过验证直接提交传入了url地址时表单会提交到这个地址
resetForm():重置表单;
resetStatus()重置表单的提交状态。传入了postonce参数的话表单成功提交后状态会设置为"posted",重置提交状态可以让表单继续可以提交;
getStatus()获取表单的提交状态normal未提交posting正在提交posted已成功提交过
setStatus(status)设置表单的提交状态可以设置normalpostingposted三种状态不传参则设置状态为posting这个状态表单可以验证但不能提交
ignore(selector):忽略对所选择对象的验证;
unignore(selector)将ignore方法所忽略验证的对象重新获取验证效果
addRule(rule)可以通过Validform对象的这个方法来给表单元素绑定验证规则
check(bool,selector):对指定对象进行验证(默认验证当前整个表单)通过返回true否则返回false绑定实时验证的对象格式符合要求时返回true而不会等ajax的返回结果bool为true时则只验证不显示提示信息
config(setup):可以通过这个方法来修改初始化参数指定表单的提交地址给表单ajax和实时验证的ajax里设置参数
*/
(function($,win,undef){
var errorobj=null,//指示当前验证失败的表单元素;
msgobj=null,//pop box object
msghidden=true;//msgbox hidden?
var tipmsg={//默认提示文字;
tit:"提示信息",
w:{
"*":"不能为空!",
"*6-16":"请填写6到16位任意字符",
"n":"请填写数字!",
"n6-16":"请填写6到16位数字",
"s":"不能输入特殊字符!",
"s6-18":"请填写6到18位字符",
"p":"请填写邮政编码!",
"m":"请填写手机号码!",
"e":"邮箱地址格式不对!",
"url":"请填写网址!"
},
def:"请填写正确信息!",
undef:"datatype未定义",
reck:"两次输入的内容不一致!",
r:"通过信息验证!",
c:"正在检测信息…",
s:"请{填写|选择}{0|信息}",
v:"所填信息没有经过验证,请稍后…",
p:"正在提交数据…"
}
$.Tipmsg=tipmsg;
var Validform=function(forms,settings,inited){
var settings=$.extend({},Validform.defaults,settings);
settings.datatype && $.extend(Validform.util.dataType,settings.datatype);
var brothers=this;
brothers.tipmsg={w:{}};
brothers.forms=forms;
brothers.objects=[];
//创建子对象时不再绑定事件;
if(inited===true){
return false;
}
forms.each(function(){
//已经绑定事件时跳过,避免事件重复绑定;
if(this.validform_inited=="inited"){return true;}
this.validform_inited="inited";
var curform=this;
curform.settings=$.extend({},settings);
var $this=$(curform);
//防止表单按钮双击提交两次;
curform.validform_status="normal"; //normal | posting | posted;
//让每个Validform对象都能自定义tipmsg;
$this.data("tipmsg",brothers.tipmsg);
//bind the blur event;
$this.delegate("[datatype]","blur",function(){
//判断是否是在提交表单操作时触发的验证请求;
var subpost=arguments[1];
Validform.util.check.call(this,$this,subpost);
});
$this.delegate(":text","keypress",function(event){
if(event.keyCode==13 && $this.find(":submit").length==0){
$this.submit();
}
});
//点击表单元素,默认文字消失效果;
//表单元素值比较时的信息提示增强;
//radio、checkbox提示信息增强;
//外调插件初始化;
Validform.util.enhance.call($this,curform.settings.tiptype,curform.settings.usePlugin,curform.settings.tipSweep);
curform.settings.btnSubmit && $this.find(curform.settings.btnSubmit).bind("click",function(){
$this.trigger("submit");
return false;
});
$this.submit(function(){
var subflag=Validform.util.submitForm.call($this,curform.settings);
subflag === undef && (subflag=true);
return subflag;
});
$this.find("[type='reset']").add($this.find(curform.settings.btnReset)).bind("click",function(){
Validform.util.resetForm.call($this);
});
});
//预创建pop box;
if( settings.tiptype==1 || (settings.tiptype==2 || settings.tiptype==3) && settings.ajaxPost ){
creatMsgbox();
}
}
Validform.defaults={
tiptype:1,
tipSweep:false,
showAllError:false,
postonce:false,
ajaxPost:false
}
Validform.util={
dataType:{
"*":/[\w\W]+/,
"*6-16":/^[\w\W]{6,16}$/,
"n":/^\d+$/,
"n6-16":/^\d{6,16}$/,
"s":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]+$/,
"s6-18":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$/,
"p":/^[0-9]{6}$/,
"m":/^13[0-9]{9}$|14[0-9]{9}|15[0-9]{9}$|18[0-9]{9}$/,
"e":/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
"url":/^(\w+:\/\/)?\w+(\.\w+)+.*$/
},
toString:Object.prototype.toString,
isEmpty:function(val){
return val==="" || val===$.trim(this.attr("tip"));
},
getValue:function(obj){
var inputval,
curform=this;
if(obj.is(":radio")){
inputval=curform.find(":radio[name='"+obj.attr("name")+"']:checked").val();
inputval= inputval===undef ? "" : inputval;
}else if(obj.is(":checkbox")){
inputval="";
curform.find(":checkbox[name='"+obj.attr("name")+"']:checked").each(function(){
inputval +=$(this).val()+',';
})
inputval= inputval===undef ? "" : inputval;
}else{
inputval=obj.val();
}
inputval=$.trim(inputval);
return Validform.util.isEmpty.call(obj,inputval) ? "" : inputval;
},
enhance:function(tiptype,usePlugin,tipSweep,addRule){
var curform=this;
//页面上不存在提示信息的标签时,自动创建;
curform.find("[datatype]").each(function(){
if(tiptype==2){
if($(this).parent().next().find(".Validform_checktip").length==0){
$(this).parent().next().append("<span class='Validform_checktip' />");
$(this).siblings(".Validform_checktip").remove();
}
}else if(tiptype==3 || tiptype==4){
if($(this).siblings(".Validform_checktip").length==0){
$(this).parent().append("<span class='Validform_checktip' />");
$(this).parent().next().find(".Validform_checktip").remove();
}
}
})
//表单元素值比较时的信息提示增强;
curform.find("input[recheck]").each(function(){
//已经绑定事件时跳过;
if(this.validform_inited=="inited"){return true;}
this.validform_inited="inited";
var _this=$(this);
var recheckinput=curform.find("input[name='"+$(this).attr("recheck")+"']");
recheckinput.bind("keyup",function(){
if(recheckinput.val()==_this.val() && recheckinput.val() != ""){
if(recheckinput.attr("tip")){
if(recheckinput.attr("tip") == recheckinput.val()){return false;}
}
_this.trigger("blur");
}
}).bind("blur",function(){
if(recheckinput.val()!=_this.val() && _this.val()!=""){
if(_this.attr("tip")){
if(_this.attr("tip") == _this.val()){return false;}
}
_this.trigger("blur");
}
});
});
//hasDefaultText;
curform.find("[tip]").each(function(){//tip是表单元素的默认提示信息,这是点击清空效果;
//已经绑定事件时跳过;
if(this.validform_inited=="inited"){return true;}
this.validform_inited="inited";
var defaultvalue=$(this).attr("tip");
var altercss=$(this).attr("altercss");
$(this).focus(function(){
if($(this).val()==defaultvalue){
$(this).val('');
if(altercss){$(this).removeClass(altercss);}
}
}).blur(function(){
if($.trim($(this).val())===''){
$(this).val(defaultvalue);
if(altercss){$(this).addClass(altercss);}
}
});
});
//enhance info feedback for checkbox & radio;
curform.find(":checkbox[datatype],:radio[datatype]").each(function(){
//已经绑定事件时跳过;
if(this.validform_inited=="inited"){return true;}
this.validform_inited="inited";
var _this=$(this);
var name=_this.attr("name");
curform.find("[name='"+name+"']").filter(":checkbox,:radio").bind("click",function(){
//避免多个事件绑定时的取值滞后问题;
setTimeout(function(){
_this.trigger("blur");
},0);
});
});
//select multiple;
curform.find("select[datatype][multiple]").bind("click",function(){
var _this=$(this);
setTimeout(function(){
_this.trigger("blur");
},0);
});
//plugins here to start;
Validform.util.usePlugin.call(curform,usePlugin,tiptype,tipSweep,addRule);
},
usePlugin:function(plugin,tiptype,tipSweep,addRule){
/*
plugin:settings.usePlugin;
tiptype:settings.tiptype;
tipSweep:settings.tipSweep;
addRule:是否在addRule时触发;
*/
var curform=this,
plugin=plugin || {};
//swfupload;
if(curform.find("input[plugin='swfupload']").length && typeof(swfuploadhandler) != "undefined"){
var custom={
custom_settings:{
form:curform,
showmsg:function(msg,type,obj){
Validform.util.showmsg.call(curform,msg,tiptype,{obj:curform.find("input[plugin='swfupload']"),type:type,sweep:tipSweep});
}
}
};
custom=$.extend(true,{},plugin.swfupload,custom);
curform.find("input[plugin='swfupload']").each(function(n){
if(this.validform_inited=="inited"){return true;}
this.validform_inited="inited";
$(this).val("");
swfuploadhandler.init(custom,n);
});
}
//datepicker;
if(curform.find("input[plugin='datepicker']").length && $.fn.datePicker){
plugin.datepicker=plugin.datepicker || {};
if(plugin.datepicker.format){
Date.format=plugin.datepicker.format;
delete plugin.datepicker.format;
}
if(plugin.datepicker.firstDayOfWeek){
Date.firstDayOfWeek=plugin.datepicker.firstDayOfWeek;
delete plugin.datepicker.firstDayOfWeek;
}
curform.find("input[plugin='datepicker']").each(function(n){
if(this.validform_inited=="inited"){return true;}
this.validform_inited="inited";
plugin.datepicker.callback && $(this).bind("dateSelected",function(){
var d=new Date( $.event._dpCache[this._dpId].getSelected()[0] ).asString(Date.format);
plugin.datepicker.callback(d,this);
});
$(this).datePicker(plugin.datepicker);
});
}
//passwordstrength;
if(curform.find("input[plugin*='passwordStrength']").length && $.fn.passwordStrength){
plugin.passwordstrength=plugin.passwordstrength || {};
plugin.passwordstrength.showmsg=function(obj,msg,type){
Validform.util.showmsg.call(curform,msg,tiptype,{obj:obj,type:type,sweep:tipSweep});
};
curform.find("input[plugin='passwordStrength']").each(function(n){
if(this.validform_inited=="inited"){return true;}
this.validform_inited="inited";
$(this).passwordStrength(plugin.passwordstrength);
});
}
//jqtransform;
if(addRule!="addRule" && plugin.jqtransform && $.fn.jqTransSelect){
if(curform[0].jqTransSelected=="true"){return;};
curform[0].jqTransSelected="true";
var jqTransformHideSelect = function(oTarget){
var ulVisible = $('.jqTransformSelectWrapper ul:visible');
ulVisible.each(function(){
var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
//do not hide if click on the label object associated to the select
if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();}
});
};
/* Check for an external click */
var jqTransformCheckExternalClick = function(event) {
if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); }
};
var jqTransformAddDocumentListener = function (){
$(document).mousedown(jqTransformCheckExternalClick);
};
if(plugin.jqtransform.selector){
curform.find(plugin.jqtransform.selector).filter('input:submit, input:reset, input[type="button"]').jqTransInputButton();
curform.find(plugin.jqtransform.selector).filter('input:text, input:password').jqTransInputText();
curform.find(plugin.jqtransform.selector).filter('input:checkbox').jqTransCheckBox();
curform.find(plugin.jqtransform.selector).filter('input:radio').jqTransRadio();
curform.find(plugin.jqtransform.selector).filter('textarea').jqTransTextarea();
if(curform.find(plugin.jqtransform.selector).filter("select").length > 0 ){
curform.find(plugin.jqtransform.selector).filter("select").jqTransSelect();
jqTransformAddDocumentListener();
}
}else{
curform.jqTransform();
}
curform.find(".jqTransformSelectWrapper").find("li a").click(function(){
$(this).parents(".jqTransformSelectWrapper").find("select").trigger("blur");
});
}
},
getNullmsg:function(curform){
var obj=this;
var reg=/[\u4E00-\u9FA5\uf900-\ufa2da-zA-Z\s]+/g;
var nullmsg;
var label=curform[0].settings.label || ".Validform_label";
label=obj.siblings(label).eq(0).text() || obj.siblings().find(label).eq(0).text() || obj.parent().siblings(label).eq(0).text() || obj.parent().siblings().find(label).eq(0).text();
label=label.replace(/\s(?![a-zA-Z])/g,"").match(reg);
label=label? label.join("") : [""];
reg=/\{(.+)\|(.+)\}/;
nullmsg=curform.data("tipmsg").s || tipmsg.s;
if(label != ""){
nullmsg=nullmsg.replace(/\{0\|(.+)\}/,label);
if(obj.attr("recheck")){
nullmsg=nullmsg.replace(/\{(.+)\}/,"");
obj.attr("nullmsg",nullmsg);
return nullmsg;
}
}else{
nullmsg=obj.is(":checkbox,:radio,select") ? nullmsg.replace(/\{0\|(.+)\}/,"") : nullmsg.replace(/\{0\|(.+)\}/,"$1");
}
nullmsg=obj.is(":checkbox,:radio,select") ? nullmsg.replace(reg,"$2") : nullmsg.replace(reg,"$1");
obj.attr("nullmsg",nullmsg);
return nullmsg;
},
getErrormsg:function(curform,datatype,recheck){
var regxp=/^(.+?)((\d+)-(\d+))?$/,
regxp2=/^(.+?)(\d+)-(\d+)$/,
regxp3=/(.*?)\d+(.+?)\d+(.*)/,
mac=datatype.match(regxp),
temp,str;
//如果是值不一样而报错;
if(recheck=="recheck"){
str=curform.data("tipmsg").reck || tipmsg.reck;
return str;
}
var tipmsg_w_ex=$.extend({},tipmsg.w,curform.data("tipmsg").w);
//如果原来就有,直接显示该项的提示信息;
if(mac[0] in tipmsg_w_ex){
return curform.data("tipmsg").w[mac[0]] || tipmsg.w[mac[0]];
}
//没有的话在提示对象里查找相似;
for(var name in tipmsg_w_ex){
if(name.indexOf(mac[1])!=-1 && regxp2.test(name)){
str=(curform.data("tipmsg").w[name] || tipmsg.w[name]).replace(regxp3,"$1"+mac[3]+"$2"+mac[4]+"$3");
curform.data("tipmsg").w[mac[0]]=str;
return str;
}
}
return curform.data("tipmsg").def || tipmsg.def;
},
_regcheck:function(datatype,gets,obj,curform){
var curform=curform,
info=null,
passed=false,
reg=/\/.+\//g,
regex=/^(.+?)(\d+)-(\d+)$/,
type=3;//default set to wrong type, 2,3,4;
//datatype有三种情况正则函数和直接绑定的正则;
//直接是正则;
if(reg.test(datatype)){
var regstr=datatype.match(reg)[0].slice(1,-1);
var param=datatype.replace(reg,"");
var rexp=RegExp(regstr,param);
passed=rexp.test(gets);
//function;
}else if(Validform.util.toString.call(Validform.util.dataType[datatype])=="[object Function]"){
passed=Validform.util.dataType[datatype](gets,obj,curform,Validform.util.dataType);
if(passed === true || passed===undef){
passed = true;
}else{
info= passed;
passed=false;
}
//自定义正则;
}else{
//自动扩展datatype;
if(!(datatype in Validform.util.dataType)){
var mac=datatype.match(regex),
temp;
if(!mac){
passed=false;
info=curform.data("tipmsg").undef||tipmsg.undef;
}else{
for(var name in Validform.util.dataType){
temp=name.match(regex);
if(!temp){continue;}
if(mac[1]===temp[1]){
var str=Validform.util.dataType[name].toString(),
param=str.match(/\/[mgi]*/g)[1].replace("\/",""),
regxp=new RegExp("\\{"+temp[2]+","+temp[3]+"\\}","g");
str=str.replace(/\/[mgi]*/g,"\/").replace(regxp,"{"+mac[2]+","+mac[3]+"}").replace(/^\//,"").replace(/\/$/,"");
Validform.util.dataType[datatype]=new RegExp(str,param);
break;
}
}
}
}
if(Validform.util.toString.call(Validform.util.dataType[datatype])=="[object RegExp]"){
passed=Validform.util.dataType[datatype].test(gets);
}
}
if(passed){
type=2;
info=obj.attr("sucmsg") || curform.data("tipmsg").r||tipmsg.r;
//规则验证通过后还需要对绑定recheck的对象进行值比较;
if(obj.attr("recheck")){
var theother=curform.find("input[name='"+obj.attr("recheck")+"']:first");
if(gets!=theother.val()){
passed=false;
type=3;
info=obj.attr("errormsg") || Validform.util.getErrormsg.call(obj,curform,datatype,"recheck");
}
}
}else{
info=info || obj.attr("errormsg") || Validform.util.getErrormsg.call(obj,curform,datatype);
//验证不通过且为空时;
if(Validform.util.isEmpty.call(obj,gets)){
info=obj.attr("nullmsg") || Validform.util.getNullmsg.call(obj,curform);
}
}
return{
passed:passed,
type:type,
info:info
};
},
regcheck:function(datatype,gets,obj){
/*
datatype:datatype;
gets:inputvalue;
obj:input object;
*/
var curform=this,
info=null,
passed=false,
type=3;//default set to wrong type, 2,3,4;
//ignore;
if(obj.attr("ignore")==="ignore" && Validform.util.isEmpty.call(obj,gets)){
if(obj.data("cked")){
info="";
}
return {
passed:true,
type:4,
info:info
};
}
obj.data("cked","cked");//do nothing if is the first time validation triggered;
var dtype=Validform.util.parseDatatype(datatype);
var res;
for(var eithor=0; eithor<dtype.length; eithor++){
for(var dtp=0; dtp<dtype[eithor].length; dtp++){
res=Validform.util._regcheck(dtype[eithor][dtp],gets,obj,curform);
if(!res.passed){
break;
}
}
if(res.passed){
break;
}
}
return res;
},
parseDatatype:function(datatype){
/*
字符串里面只能含有一个正则表达式;
Datatype名称必须是字母数字、下划线或*号组成;
datatype="/regexp/|phone|tel,s,e|f,e";
==>[["/regexp/"],["phone"],["tel","s","e"],["f","e"]];
*/
var reg=/\/.+?\/[mgi]*(?=(,|$|\||\s))|[\w\*-]+/g,
dtype=datatype.match(reg),
sepor=datatype.replace(reg,"").replace(/\s*/g,"").split(""),
arr=[],
m=0;
arr[0]=[];
arr[0].push(dtype[0]);
for(var n=0;n<sepor.length;n++){
if(sepor[n]=="|"){
m++;
arr[m]=[];
}
arr[m].push(dtype[n+1]);
}
return arr;
},
showmsg:function(msg,type,o,triggered){
/*
msg:提示文字;
type:提示信息显示方式;
o:{obj:当前对象, type:1=>正在检测 | 2=>通过, sweep:true | false},
triggered:在blur或提交表单触发的验证中有些情况不需要显示提示文字如自定义弹出提示框的显示方式不需要每次blur时就马上弹出提示;
tiptype:1\2\3时都有坑能会弹出自定义提示框
tiptype:1时在triggered bycheck时不弹框
tiptype:2\3时在ajax时弹框
tipSweep为true时在triggered bycheck时不触发showmsg但ajax出错的情况下要提示
*/
//如果msg为undefined那么就没必要执行后面的操作ignore有可能会出现这情况;
if(msg==undef){return;}
//tipSweep为true且当前不是处于错误状态时blur事件不触发信息显示;
if(triggered=="bycheck" && o.sweep && (o.obj && !o.obj.is(".Validform_error") || typeof type == "function")){return;}
$.extend(o,{curform:this});
if(typeof type == "function"){
type(msg,o,Validform.util.cssctl);
return;
}
if(type==1 || triggered=="byajax" && type!=4){
msgobj.find(".Validform_info").html(msg);
}
//tiptypt=1时blur触发showmsg验证是否通过都不弹框提交表单触发的话只要验证出错就弹框;
if(type==1 && triggered!="bycheck" && o.type!=2 || triggered=="byajax" && type!=4){
msghidden=false;
msgobj.find(".iframe").css("height",msgobj.outerHeight());
msgobj.show();
setCenter(msgobj,100);
}
if(type==2 && o.obj){
o.obj.parent().next().find(".Validform_checktip").html(msg);
Validform.util.cssctl(o.obj.parent().next().find(".Validform_checktip"),o.type);
}
if((type==3 || type==4) && o.obj){
o.obj.siblings(".Validform_checktip").html(msg);
Validform.util.cssctl(o.obj.siblings(".Validform_checktip"),o.type);
}
},
cssctl:function(obj,status){
switch(status){
case 1:
obj.removeClass("Validform_right Validform_wrong").addClass("Validform_checktip Validform_loading");//checking;
break;
case 2:
obj.removeClass("Validform_wrong Validform_loading").addClass("Validform_checktip Validform_right");//passed;
break;
case 4:
obj.removeClass("Validform_right Validform_wrong Validform_loading").addClass("Validform_checktip");//for ignore;
break;
default:
obj.removeClass("Validform_right Validform_loading").addClass("Validform_checktip Validform_wrong");//wrong;
}
},
check:function(curform,subpost,bool){
/*
检测单个表单元素;
验证通过返回true否则返回false、实时验证返回值为ajax;
bool传入true则只检测不显示提示信息;
*/
var settings=curform[0].settings;
var subpost=subpost || "";
var inputval=Validform.util.getValue.call(curform,$(this));
//隐藏或绑定dataIgnore的表单对象不做验证;
if(settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore")==="dataIgnore"){
return true;
}
//dragonfly=true时没有绑定ignore值为空不做验证但验证不通过;
if(settings.dragonfly && !$(this).data("cked") && Validform.util.isEmpty.call($(this),inputval) && $(this).attr("ignore")!="ignore"){
return false;
}
var flag=Validform.util.regcheck.call(curform,$(this).attr("datatype"),inputval,$(this));
//值没变化不做检测这时要考虑recheck情况;
//不是在提交表单时触发的ajax验证;
if(inputval==this.validform_lastval && !$(this).attr("recheck") && subpost==""){
return flag.passed ? true : false;
}
this.validform_lastval=inputval;//存储当前值;
var _this;
errorobj=_this=$(this);
if(!flag.passed){
//取消正在进行的ajax验证;
Validform.util.abort.call(_this[0]);
if(!bool){
//传入"bycheck"指示当前是check方法里调用的当tiptype=1时blur事件不让触发错误信息显示;
Validform.util.showmsg.call(curform,flag.info,settings.tiptype,{obj:$(this),type:flag.type,sweep:settings.tipSweep},"bycheck");
!settings.tipSweep && _this.addClass("Validform_error");
}
return false;
}
//验证通过的话如果绑定有ajaxurl要执行ajax检测;
//当ignore="ignore"时为空值可以通过验证这时不需要ajax检测;
var ajaxurl=$(this).attr("ajaxurl");
if(ajaxurl && !Validform.util.isEmpty.call($(this),inputval) && !bool){
var inputobj=$(this);
//当提交表单时表单中的某项已经在执行ajax检测这时需要让该项ajax结束后继续提交表单;
if(subpost=="postform"){
inputobj[0].validform_subpost="postform";
}else{
inputobj[0].validform_subpost="";
}
if(inputobj[0].validform_valid==="posting" && inputval==inputobj[0].validform_ckvalue){return "ajax";}
inputobj[0].validform_valid="posting";
inputobj[0].validform_ckvalue=inputval;
Validform.util.showmsg.call(curform,curform.data("tipmsg").c||tipmsg.c,settings.tiptype,{obj:inputobj,type:1,sweep:settings.tipSweep},"bycheck");
Validform.util.abort.call(_this[0]);
var ajaxsetup=$.extend(true,{},settings.ajaxurl || {});
var localconfig={
type: "POST",
cache:false,
url: ajaxurl,
data: "param="+encodeURIComponent(inputval)+"&name="+encodeURIComponent($(this).attr("name")),
success: function(data){
if($.trim(data.status)==="y"){
inputobj[0].validform_valid="true";
data.info && inputobj.attr("sucmsg",data.info);
Validform.util.showmsg.call(curform,inputobj.attr("sucmsg") || curform.data("tipmsg").r||tipmsg.r,settings.tiptype,{obj:inputobj,type:2,sweep:settings.tipSweep},"bycheck");
_this.removeClass("Validform_error");
errorobj=null;
if(inputobj[0].validform_subpost=="postform"){
curform.trigger("submit");
}
}else{
inputobj[0].validform_valid=data.info;
Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:inputobj,type:3,sweep:settings.tipSweep});
_this.addClass("Validform_error");
}
_this[0].validform_ajax=null;
},
error: function(data){
if(data.status=="200"){
if(data.responseText=="y"){
ajaxsetup.success({"status":"y"});
}else{
ajaxsetup.success({"status":"n","info":data.responseText});
}
return false;
}
//正在检测时要检测的数据发生改变这时要终止当前的ajax。不是这种情况引起的ajax错误那么显示相关错误信息;
if(data.statusText!=="abort"){
var msg="status: "+data.status+"; statusText: "+data.statusText;
Validform.util.showmsg.call(curform,msg,settings.tiptype,{obj:inputobj,type:3,sweep:settings.tipSweep});
_this.addClass("Validform_error");
}
inputobj[0].validform_valid=data.statusText;
_this[0].validform_ajax=null;
//localconfig.error返回true表示还需要执行temp_err;
return true;
}
}
if(ajaxsetup.success){
var temp_suc=ajaxsetup.success;
ajaxsetup.success=function(data){
localconfig.success(data);
temp_suc(data,inputobj);
}
}
if(ajaxsetup.error){
var temp_err=ajaxsetup.error;
ajaxsetup.error=function(data){
//localconfig.error返回false表示不需要执行temp_err;
localconfig.error(data) && temp_err(data,inputobj);
}
}
ajaxsetup=$.extend({},localconfig,ajaxsetup,{dataType:"json"});
_this[0].validform_ajax=$.ajax(ajaxsetup);
return "ajax";
}else if(ajaxurl && Validform.util.isEmpty.call($(this),inputval)){
Validform.util.abort.call(_this[0]);
_this[0].validform_valid="true";
}
if(!bool){
Validform.util.showmsg.call(curform,flag.info,settings.tiptype,{obj:$(this),type:flag.type,sweep:settings.tipSweep},"bycheck");
_this.removeClass("Validform_error");
}
errorobj=null;
return true;
},
submitForm:function(settings,flg,url,ajaxPost,sync){
/*
flg===true时跳过验证直接提交;
ajaxPost==="ajaxPost"指示当前表单以ajax方式提交;
*/
var curform=this;
//表单正在提交时点击提交按钮不做反应;
if(curform[0].validform_status==="posting"){return false;}
//要求只能提交一次时;
if(settings.postonce && curform[0].validform_status==="posted"){return false;}
var beforeCheck=settings.beforeCheck && settings.beforeCheck(curform);
if(beforeCheck===false){return false;}
var flag=true,
inflag;
curform.find("[datatype]").each(function(){
//跳过验证;
if(flg){
return false;
}
//隐藏或绑定dataIgnore的表单对象不做验证;
if(settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore")==="dataIgnore"){
return true;
}
var inputval=Validform.util.getValue.call(curform,$(this)),
_this;
errorobj=_this=$(this);
inflag=Validform.util.regcheck.call(curform,$(this).attr("datatype"),inputval,$(this));
if(!inflag.passed){
Validform.util.showmsg.call(curform,inflag.info,settings.tiptype,{obj:$(this),type:inflag.type,sweep:settings.tipSweep});
_this.addClass("Validform_error");
if(!settings.showAllError){
_this.focus();
flag=false;
return false;
}
flag && (flag=false);
return true;
}
//当ignore="ignore"时为空值可以通过验证这时不需要ajax检测;
if($(this).attr("ajaxurl") && !Validform.util.isEmpty.call($(this),inputval)){
if(this.validform_valid!=="true"){
var thisobj=$(this);
Validform.util.showmsg.call(curform,curform.data("tipmsg").v||tipmsg.v,settings.tiptype,{obj:thisobj,type:3,sweep:settings.tipSweep});
_this.addClass("Validform_error");
thisobj.trigger("blur",["postform"]);//continue the form post;
if(!settings.showAllError){
flag=false;
return false;
}
flag && (flag=false);
return true;
}
}else if($(this).attr("ajaxurl") && Validform.util.isEmpty.call($(this),inputval)){
Validform.util.abort.call(this);
this.validform_valid="true";
}
Validform.util.showmsg.call(curform,inflag.info,settings.tiptype,{obj:$(this),type:inflag.type,sweep:settings.tipSweep});
_this.removeClass("Validform_error");
errorobj=null;
});
if(settings.showAllError){
curform.find(".Validform_error:first").focus();
}
if(flag){
var beforeSubmit=settings.beforeSubmit && settings.beforeSubmit(curform);
if(beforeSubmit===false){return false;}
curform[0].validform_status="posting";
if(settings.ajaxPost || ajaxPost==="ajaxPost"){
//获取配置参数;
var ajaxsetup=$.extend(true,{},settings.ajaxpost || {});
//有可能需要动态的改变提交地址所以把action所指定的url层级设为最低;
ajaxsetup.url=url || ajaxsetup.url || settings.url || curform.attr("action");
//byajaxajax时tiptye为1、2或3需要弹出提示框;
Validform.util.showmsg.call(curform,curform.data("tipmsg").p||tipmsg.p,settings.tiptype,{obj:curform,type:1,sweep:settings.tipSweep},"byajax");
//方法里的优先级要高;
//有undefined情况;
if(sync){
ajaxsetup.async=false;
}else if(sync===false){
ajaxsetup.async=true;
}
if(ajaxsetup.success){
var temp_suc=ajaxsetup.success;
ajaxsetup.success=function(data){
settings.callback && settings.callback(data);
curform[0].validform_ajax=null;
if($.trim(data.status)==="y"){
curform[0].validform_status="posted";
}else{
curform[0].validform_status="normal";
}
temp_suc(data,curform);
}
}
if(ajaxsetup.error){
var temp_err=ajaxsetup.error;
ajaxsetup.error=function(data){
settings.callback && settings.callback(data);
curform[0].validform_status="normal";
curform[0].validform_ajax=null;
temp_err(data,curform);
}
}
var localconfig={
type: "POST",
async:true,
data: curform.serializeArray(),
success: function(data){
if($.trim(data.status)==="y"){
//成功提交;
curform[0].validform_status="posted";
Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:curform,type:2,sweep:settings.tipSweep},"byajax");
}else{
//提交出错;
curform[0].validform_status="normal";
Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:curform,type:3,sweep:settings.tipSweep},"byajax");
}
settings.callback && settings.callback(data);
curform[0].validform_ajax=null;
},
error: function(data){
var msg="status: "+data.status+"; statusText: "+data.statusText;
Validform.util.showmsg.call(curform,msg,settings.tiptype,{obj:curform,type:3,sweep:settings.tipSweep},"byajax");
settings.callback && settings.callback(data);
curform[0].validform_status="normal";
curform[0].validform_ajax=null;
}
}
ajaxsetup=$.extend({},localconfig,ajaxsetup,{dataType:"json"});
curform[0].validform_ajax=$.ajax(ajaxsetup);
}else{
if(!settings.postonce){
curform[0].validform_status="normal";
}
var url=url || settings.url;
if(url){
curform.attr("action",url);
}
return settings.callback && settings.callback(curform);
}
}
return false;
},
resetForm:function(){
var brothers=this;
brothers.each(function(){
this.reset && this.reset();
this.validform_status="normal";
});
brothers.find(".Validform_right").text("");
brothers.find(".passwordStrength").children().removeClass("bgStrength");
brothers.find(".Validform_checktip").removeClass("Validform_wrong Validform_right Validform_loading");
brothers.find(".Validform_error").removeClass("Validform_error");
brothers.find("[datatype]").removeData("cked").removeData("dataIgnore").each(function(){
this.validform_lastval=null;
});
brothers.eq(0).find("input:first").focus();
},
abort:function(){
if(this.validform_ajax){
this.validform_ajax.abort();
}
}
}
$.Datatype=Validform.util.dataType;
Validform.prototype={
dataType:Validform.util.dataType,
eq:function(n){
var obj=this;
if(n>=obj.forms.length){
return null;
}
if(!(n in obj.objects)){
obj.objects[n]=new Validform($(obj.forms[n]).get(),{},true);
}
return obj.objects[n];
},
resetStatus:function(){
var obj=this;
$(obj.forms).each(function(){
this.validform_status="normal";
});
return this;
},
setStatus:function(status){
var obj=this;
$(obj.forms).each(function(){
this.validform_status=status || "posting";
});
return this;
},
getStatus:function(){
var obj=this;
var status=$(obj.forms)[0].validform_status;
return status;
},
ignore:function(selector){
var obj=this;
var selector=selector || "[datatype]"
$(obj.forms).find(selector).each(function(){
$(this).data("dataIgnore","dataIgnore").removeClass("Validform_error");
});
return this;
},
unignore:function(selector){
var obj=this;
var selector=selector || "[datatype]"
$(obj.forms).find(selector).each(function(){
$(this).removeData("dataIgnore");
});
return this;
},
addRule:function(rule){
/*
rule => [{
ele:"#id",
datatype:"*",
errormsg:"出错提示文字!",
nullmsg:"为空时的提示文字!",
tip:"默认显示的提示文字",
altercss:"gray",
ignore:"ignore",
ajaxurl:"valid.php",
recheck:"password",
plugin:"passwordStrength"
},{},{},...]
*/
var obj=this;
var rule=rule || [];
for(var index=0; index<rule.length; index++){
var o=$(obj.forms).find(rule[index].ele);
for(var attr in rule[index]){
attr !=="ele" && o.attr(attr,rule[index][attr]);
}
}
$(obj.forms).each(function(){
var $this=$(this);
Validform.util.enhance.call($this,this.settings.tiptype,this.settings.usePlugin,this.settings.tipSweep,"addRule");
});
return this;
},
ajaxPost:function(flag,sync,url){
var obj=this;
$(obj.forms).each(function(){
//创建pop box;
if( this.settings.tiptype==1 || this.settings.tiptype==2 || this.settings.tiptype==3 ){
creatMsgbox();
}
Validform.util.submitForm.call($(obj.forms[0]),this.settings,flag,url,"ajaxPost",sync);
});
return this;
},
submitForm:function(flag,url){
/*flag===true时不做验证直接提交*/
var obj=this;
$(obj.forms).each(function(){
var subflag=Validform.util.submitForm.call($(this),this.settings,flag,url);
subflag === undef && (subflag=true);
if(subflag===true){
this.submit();
}
});
return this;
},
resetForm:function(){
var obj=this;
Validform.util.resetForm.call($(obj.forms));
return this;
},
abort:function(){
var obj=this;
$(obj.forms).each(function(){
Validform.util.abort.call(this);
});
return this;
},
check:function(bool,selector){
/*
bool传入true只检测不显示提示信息;
*/
var selector=selector || "[datatype]",
obj=this,
curform=$(obj.forms),
flag=true;
curform.find(selector).each(function(){
Validform.util.check.call(this,curform,"",bool) || (flag=false);
});
return flag;
},
config:function(setup){
/*
config={
url:"ajaxpost.php",//指定了url后数据会提交到这个地址;
ajaxurl:{
timeout:1000,
...
},
ajaxpost:{
timeout:1000,
...
}
}
*/
var obj=this;
setup=setup || {};
$(obj.forms).each(function(){
var $this=$(this);
this.settings=$.extend(true,this.settings,setup);
Validform.util.enhance.call($this,this.settings.tiptype,this.settings.usePlugin,this.settings.tipSweep);
});
return this;
}
}
$.fn.Validform=function(settings){
return new Validform(this,settings);
};
function setCenter(obj,time){
var left=($(window).width()-obj.outerWidth())/2,
top=($(window).height()-obj.outerHeight())/2,
top=(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)+(top>0?top:0);
obj.css({
left:left
}).animate({
top : top
},{ duration:time , queue:false });
}
function creatMsgbox(){
if($("#Validform_msg").length!==0){return false;}
msgobj=$('<div id="Validform_msg"><div class="Validform_title">'+tipmsg.tit+'<a class="Validform_close" href="javascript:void(0);">&chi;</a></div><div class="Validform_info"></div><div class="iframe"><iframe frameborder="0" scrolling="no" height="100%" width="100%"></iframe></div></div>').appendTo("body");//提示信息框;
msgobj.find("a.Validform_close").click(function(){
msgobj.hide();
msghidden=true;
if(errorobj){
errorobj.focus().addClass("Validform_error");
}
return false;
}).focus(function(){this.blur();});
$(window).bind("scroll resize",function(){
!msghidden && setCenter(msgobj,400);
});
};
//公用方法显示&关闭信息提示框;
$.Showmsg=function(msg){
creatMsgbox();
Validform.util.showmsg.call(win,msg,1,{});
};
$.Hidemsg=function(){
msgobj.hide();
msghidden=true;
};
})(jQuery,window);