You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1055 lines
41 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
通用表单验证方法
Validform version 5.2 beta
By sean during April 7, 2010 - July 31, 2012
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默认为1也可以传入一个function函数自定义提示信息的显示方式可以实现你想要的任何效果具体参见demo页;
ignoreHidden:false,//可选项 true | false 默认为false当为true时对:hidden的表单元素将不做验证;
dragonfly:false,//可选项 true | false 默认false当为true时值为空时不做验证
tipSweep:true,//可选项 true | false 默认为false当true时提示信息将只会在表单提交时触发显示各表单元素blur时不会被触发显示;
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方式提交表单传入callback这时data参数是当前表单对象回调函数会在表单验证全部通过后执行然后判断是否提交表单如果callback里明确return false则表单不会提交如果return true或没有return则会提交表单。
}
});
Validform对象的方法和属性
tipmsg自定义提示信息通过修改Validform对象的这个属性值来让同一个页面的不同表单使用不同的提示文字
dataType获取内置的一些正则
eq(n)获取Validform对象的第n个元素;
ajaxPost(flag,sync)以ajax方式提交表单。flag为true时跳过验证直接提交sync为true时将以同步的方式进行ajax提交
abort()终止ajax的提交
submitForm(flag)以参数里设置的方式提交表单flag为true时跳过验证直接提交
resetForm():重置表单;
resetStatus()重置表单的提交状态。传入了postonce参数的话表单成功提交后状态会设置为"posted",重置提交状态可以让表单继续可以提交;
getStatus()获取表单的提交状态normal未提交posting正在提交posted已成功提交过
setStatus(status)设置表单的提交状态可以设置normalpostingposted三种状态不传参则设置状态为posting这个状态表单可以验证但不能提交
ignore(selector):忽略对所选择对象的验证;
unignore(selector)将ignore方法所忽略验证的对象重新获取验证效果
addRule(rule)可以通过Validform对象的这个方法来给表单元素绑定验证规则
*/
(function($, win, undef) {
var errorobj = null, //指示当前验证失败的表单元素;
msgobj = null, //pop box object
msghidden = true; //msgbox hidden?
var tipmsg = {//默认提示文字;
tit: "提示信息",
w: "请输入正确信息!",
r: "通过信息验证!",
c: "正在检测信息…",
s: "请填入信息!",
v: "所填信息没有经过验证,请稍后…",
p: "正在提交数据…",
err: "出错了!请检查提交地址或返回数据格式是否正确!",
abort: "Ajax操作被取消"
}
$.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 = {};
brothers.settings = settings;
brothers.forms = forms;
brothers.objects = [];
//创建子对象时不再绑定事件;
if (inited === true) {
return false;
}
forms.each(function(n) {
var $this = $(this);
//防止表单按钮双击提交两次;
this.validform_status = "normal"; //normal | posting | posted;
//让每个Validform对象都能自定义tipmsg;
$this.data("tipmsg", brothers.tipmsg);
//bind the blur event;
$this.find("[datatype]").live("blur", function() {
//判断是否是在提交表单操作时触发的验证请求;
var subpost = arguments[1];
Validform.util.check.call(this, $this, brothers, subpost);
});
//点击表单元素,默认文字消失效果;
Validform.util.hasDefaultText.call($this);
//表单元素值比较时的信息提示增强;
Validform.util.recheckEnhance.call($this);
//plugins here to start;
if (settings.usePlugin) {
Validform.util.usePlugin.call($this, settings.usePlugin, settings.tiptype, settings.tipSweep, n);
}
//enhance info feedback for checkbox & radio;
$this.find(":checkbox[datatype],:radio[datatype]").each(function() {
var _this = $(this);
var name = _this.attr("name");
$this.find("[name='" + name + "']").filter(":checkbox,:radio").bind("click", function() {
//避免多个事件绑定时的取值滞后问题;
setTimeout(function() {
_this.trigger("blur");
}, 0);
});
});
settings.btnSubmit && $this.find(settings.btnSubmit).bind("click", function() {
var subflag = Validform.util.submitForm.call($this, settings);
subflag === undef && (subflag = true);
if (subflag === true) {
//$this[0].submit();
}
});
$this.submit(function() {
var subflag = Validform.util.submitForm.call($this, settings);
subflag === undef && (subflag = true);
return subflag;
});
$this.find("[type='reset']").add($this.find(settings.btnReset)).bind("click", function() {
Validform.util.resetForm.call($this);
});
});
//预创建pop box;
if (settings.tiptype == 1 || (settings.tiptype == 2 && settings.ajaxPost)) {
creatMsgbox();
}
}
Validform.defaults = {
tiptype: 1,
tipSweep: false,
showAllError: false,
postonce: false,
ajaxPost: false
}
Validform.util = {
dataType: {
"match": /^(.+?)(\d+)-(\d+)$/,
"*": /[\w\W]+/,
"*6-16": /^[\w\W]{6,16}$/,
"n": /^\d+$/,
"n6-16": /^\d{6,16}$/,
"n6-8": /^\d{6,8}$/,
"s": /^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]+$/,
"s6-18": /^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$/,
"p": /^[0-9]{6}$/,
"m": /^1[0-9]{10}$/,
"e": /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
"url": /^(\w+:\/\/)?\w+(\.\w+)+.*$/
},
toString: Object.prototype.toString,
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").val();
inputval = inputval === undef ? "" : inputval;
} else {
inputval = obj.val();
}
return $.trim(inputval);
},
isEmpty: function(val) {
return val === "" || val === $.trim(this.attr("tip"));
},
recheckEnhance: function() {
var curform = this;
curform.find("input[recheck]").each(function() {
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: function() {
this.find("[tip]").each(function() {//tip是表单元素的默认提示信息,这是点击清空效果;
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); }
}
});
});
},
usePlugin: function(plugin, tiptype, tipSweep, n) {
/*
plugin:settings.usePlugin;
tiptype:settings.tiptype;
tipSweep:settings.tipSweep;
n:当前表单的索引;
*/
var curform = this;
//swfupload;
if (plugin.swfupload) {
var swfuploadinput = curform.find("input[plugin='swfupload']").val(""),
custom = {
custom_settings: {
form: curform,
showmsg: function(msg, type) {
Validform.util.showmsg.call(curform, msg, tiptype, { obj: swfuploadinput, type: type, sweep: tipSweep });
}
}
};
custom = $.extend(true, {}, plugin.swfupload, custom);
if (typeof (swfuploadhandler) != "undefined") { swfuploadhandler.init(custom, n); }
}
//datepicker;
if (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;
}
var datepickerinput = curform.find("input[plugin='datepicker']");
plugin.datepicker.callback && datepickerinput.bind("dateSelected", function() {
var d = new Date($.event._dpCache[this._dpId].getSelected()[0]).asString(Date.format);
plugin.datepicker.callback(d, this);
});
datepickerinput.datePicker(plugin.datepicker);
}
//passwordstrength;
if (plugin.passwordstrength) {
plugin.passwordstrength.showmsg = function(obj, msg, type) {
Validform.util.showmsg.call(curform, msg, tiptype, { obj: obj, type: type, sweep: tipSweep }, "hide");
};
curform.find("input[plugin*='passwordStrength']").passwordStrength(plugin.passwordstrength);
}
//jqtransform;
if (plugin.jqtransform) {
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() {
curform.find("select").trigger("blur");
});
}
},
_regcheck: function(datatype, gets, obj, curform) {
var curform = curform,
info = null,
passed = false,
type = 3; //default set to wrong type, 2,3,4;
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;
type = 2;
info = curform.data("tipmsg").r || tipmsg.r;
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") || curform.data("tipmsg").w || tipmsg.w;
}
}
} else {
info = passed || obj.attr("errormsg") || curform.data("tipmsg").w || tipmsg.w;
passed = false;
if (gets === "") {//验证不通过且为空时;
return {
passed: false,
type: 3,
info: obj.attr("nullmsg") || curform.data("tipmsg").s || tipmsg.s
};
}
}
return {
passed: passed,
type: type,
info: info
};
}
if (!(datatype in Validform.util.dataType)) {
var mac = datatype.match(Validform.util.dataType["match"]),
temp;
if (!mac) {
return false;
}
for (var name in Validform.util.dataType) {
temp = name.match(Validform.util.dataType["match"]);
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 = curform.data("tipmsg").r || tipmsg.r;
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") || curform.data("tipmsg").w || tipmsg.w;
}
}
} else {
info = obj.attr("errormsg") || curform.data("tipmsg").w || tipmsg.w;
if (gets === "") {
return {
passed: false,
type: 3,
info: obj.attr("nullmsg") || curform.data("tipmsg").s || tipmsg.s
};
}
}
return {
passed: passed,
type: type,
info: info
};
}
return {
passed: false,
type: 3,
info: curform.data("tipmsg").w || tipmsg.w
};
},
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;
//default value;
if ($.trim(obj.attr("tip")) && gets === $.trim(obj.attr("tip"))) {
return {
passed: false,
type: 3,
info: obj.attr("nullmsg") || curform.data("tipmsg").s || tipmsg.s
};
}
var eithor = datatype.indexOf("|") == -1 ? false : true;
var datatype = datatype.split(/,|\|/);
var res;
for (var dtype = 0; dtype < datatype.length;dtype++) {
res = Validform.util._regcheck($.trim(datatype[dtype]), gets, obj, curform);
if (!res.passed && !eithor || res.passed && eithor) {
break;
}
}
return res;
},
showmsg: function(msg, type, o, show) {
/*
msg:提示文字;
type:提示信息显示方式;
o:{obj:当前对象, type:1=>正在检测 | 2=>通过},
show:在blur或提交表单触发的验证中有些情况不需要显示提示文字如自定义弹出提示框的显示方式不需要每次blur时就马上弹出提示;
*/
//如果msg为null那么就没必要执行后面的操作ignore有可能会出现这情况;
if (msg === null) { return false; }
//if(msg===null || o.sweep && show=="hide"){return false;}
$.extend(o, { curform: this });
if (typeof type == "function") {
if (!(o.sweep && show == "hide")) {
type(msg, o, Validform.util.cssctl);
}
return false;
}
if (type == 1 || show == "alwaysshow") {
msgobj.find(".Validform_info").html(msg);
}
if (type == 1 && show != "hide" || show == "alwaysshow") {
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);
}
},
showConfirm: function(_argument) {
(_argument.skinCss) ? msgobj.addClass(_argument.skinCss) : "";
if (_argument.caption) {
var tmpClose = msgobj.find(".Validform_title").find(".Validform_close").clone(true);
msgobj.find(".Validform_title").html(_argument.caption).andSelf().append(tmpClose);
}
var cfmBody = msgobj.find(".Validform_info");
//cfmBody.text(_argument.msg);
cfmBody.html(_argument.msg);
if (_argument.btn) {
var btnWrapCss = (_argument.btnWrapCss) ? "." + _argument.btnWrapCss : ".btns";
if (cfmBody.find(btnWrapCss).length != 0) {
cfmBody.find(btnWrapCss).empty();
}
else {
cfmBody.append("<div class=\"mt20 tc " + btnWrapCss.replace(".", "") + "\"></div>");
}
var hasBtnCss = (_argument.btnCss && _argument.btnCss.length > 0) ? true : false;
for (var i = 0; i < _argument.btn.length; i++) {
var btnCss = (hasBtnCss) ? _argument.btnCss[i] : "btn" + i;
var btn = $("<a class=\"btn btn_gray25 mr20 " + btnCss + "\" rel=\"" + i + "\" href=\"javascript:void(0)\"><span>" + _argument.btn[i] + "</span></a>").click(function() {
_argument.callback[this.rel].call(this, msgobj, this);
});
cfmBody.find(btnWrapCss).append(btn);
btn = null;
}
}
msgobj.find(".iframe").css("height", msgobj.height());
msghidden = false;
var left = ($(window).width() - msgobj.width()) / 2;
var top = ($(window).height() - msgobj.height()) / 2;
top = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + (top > 0 ? top : 0);
msgobj.css({
"left": left
}).show().animate({
top: top
}, 100, function() {
if (_argument.showedCallback) {
_argument.showedCallback.call(this, this);
}
});
},
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, brothers, subpost, bool) {
/*
检测单个表单元素;
验证通过返回true否则返回false、实时验证返回值为ajax;
bool传入true则只检测不显示提示信息;
*/
var $this = curform;
var settings = brothers.settings;
var subpost = subpost || "";
var inputval = Validform.util.getValue.call($this, $(this));
//绑定了dataIgnore属性的对象也忽略验证;
//dragonfly=true时值为空不做验证;
if ($(this).data("dataIgnore") === "dataIgnore" || settings.dragonfly && !$(this).data("cked") && Validform.util.isEmpty.call($(this), inputval)) {
return true;
}
var flag = true,
_this;
errorobj = _this = $(this);
flag = Validform.util.regcheck.call($this, $(this).attr("datatype"), inputval, $(this));
if (!flag.passed) {
//取消正在进行的ajax验证;
Validform.util.abort.call(_this[0]);
if (!bool) {
_this.addClass("Validform_error");
Validform.util.showmsg.call($this, flag.info, settings.tiptype, { obj: $(this), type: flag.type, sweep: settings.tipSweep }, "hide"); //当tiptype=1的情况下传入"hide"则让提示框不弹出,tiptype=2的情况下附加参数"hide"不起作用;
}
return false;
} else {
if ($(this).attr("ajaxurl") && !bool) {
var inputobj = $(this);
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($this, brothers.tipmsg.c || tipmsg.c, settings.tiptype, { obj: inputobj, type: 1, sweep: settings.tipSweep }, "hide");
Validform.util.abort.call(_this[0]);
_this[0].validform_ajax = $.ajax({
type: "POST",
cache: false,
url: inputobj.attr("ajaxurl"),
data: "param=" + inputval + "&name=" + $(this).attr("name"),
dataType: "text",
success: function(s) {
if ($.trim(s) == "y") {
inputobj[0].validform_valid = "true";
Validform.util.showmsg.call($this, brothers.tipmsg.r || tipmsg.r, settings.tiptype, { obj: inputobj, type: 2, sweep: settings.tipSweep }, "hide");
_this.removeClass("Validform_error");
errorobj = null;
if (subpost === "postform") {
$this.trigger("submit");
}
} else {
inputobj[0].validform_valid = s;
_this.addClass("Validform_error");
Validform.util.showmsg.call($this, s, settings.tiptype, { obj: inputobj, type: 3, sweep: settings.tipSweep });
}
_this[0].validform_ajax = null;
},
error: function(data) {
if (data.statusText !== "abort") {
_this.addClass("Validform_error");
Validform.util.showmsg.call($this, brothers.tipmsg.err || tipmsg.err, settings.tiptype, { obj: inputobj, type: 3, sweep: settings.tipSweep });
}
inputobj[0].validform_valid = brothers.tipmsg.err || tipmsg.err;
_this[0].validform_ajax = null;
}
});
return "ajax";
} else {
if (!bool) {
Validform.util.showmsg.call($this, flag.info, settings.tiptype, { obj: $(this), type: flag.type, sweep: settings.tipSweep }, "hide");
_this.removeClass("Validform_error");
}
errorobj = null;
return true;
}
}
},
submitForm: function(settings, flg, 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 sync = sync === true ? false : true;
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) {
_this.addClass("Validform_error");
Validform.util.showmsg.call(curform, inflag.info, settings.tiptype, { obj: $(this), type: inflag.type, sweep: settings.tipSweep });
if (!settings.showAllError) {
_this.focus();
flag = false;
return false;
}
flag && (flag = false);
return true;
}
if ($(this).attr("ajaxurl")) {
if (this.validform_valid !== "true") {
var thisobj = $(this);
_this.addClass("Validform_error");
Validform.util.showmsg.call(curform, curform.data("tipmsg").v || tipmsg.v, settings.tiptype, { obj: thisobj, type: 3, sweep: settings.tipSweep });
if (!msghidden || settings.tiptype != 1) {
setTimeout(function() {
thisobj.trigger("blur", ["postform"]); //continue the form post;
}, 1500);
}
if (!settings.showAllError) {
flag = false;
return false;
}
flag && (flag = false);
return true;
}
}
Validform.util.showmsg.call(curform, inflag.info, settings.tiptype, { obj: $(this), type: inflag.type, sweep: settings.tipSweep }, "hide");
_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") {
Validform.util.showmsg.call(curform, curform.data("tipmsg").p || tipmsg.p, settings.tiptype, { obj: curform, type: 1, sweep: settings.tipSweep }, "alwaysshow"); //传入"alwaysshow"则让提示框不管当前tiptye为1还是2都弹出;
curform[0].validform_ajax = $.ajax({
type: "POST",
dataType: "json",
async: sync,
url: curform.attr("action"),
//data: decodeURIComponent(curform.serialize(),true),
data: curform.serializeArray(),
success: function(data) {
if (data.status === "y") {
Validform.util.showmsg.call(curform, data.info, settings.tiptype, { obj: curform, type: 2, sweep: settings.tipSweep }, "alwaysshow");
} else {
curform[0].posting = false;
Validform.util.showmsg.call(curform, data.info, settings.tiptype, { obj: curform, type: 3, sweep: settings.tipSweep }, "alwaysshow");
}
settings.callback && settings.callback(data);
curform[0].validform_status = "posted";
curform[0].validform_ajax = null;
},
error: function(data) {
var msg = data.statusText === "abort" ?
curform.data("tipmsg").abort || tipmsg.abort :
curform.data("tipmsg").err || tipmsg.err;
curform[0].posting = false;
Validform.util.showmsg.call(curform, msg, settings.tiptype, { obj: curform, type: 3, sweep: settings.tipSweep }, "alwaysshow");
curform[0].validform_status = "normal";
curform[0].validform_ajax = null;
}
});
} else {
if (!settings.postonce) {
curform[0].validform_status = "normal";
}
return settings.callback && settings.callback(curform);
}
}
return false;
},
resetForm: function() {
var brothers = this;
brothers.each(function() {
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");
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(), obj.settings, 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";
});
},
getStatus: function() {
var obj = this;
var status = $(obj.forms)[0].validform_status;
return status;
},
ignore: function(selector) {
var obj = this;
$(obj.forms).find(selector).each(function() {
$(this).data("dataIgnore", "dataIgnore").removeClass("Validform_error");
});
},
unignore: function(selector) {
var obj = this;
$(obj.forms).find(selector).each(function() {
$(this).removeData("dataIgnore");
});
},
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 in rule) {
var o = $(obj.forms).find(rule[index].ele);
for (var attr in rule[index]) {
attr !== "ele" && o.attr(attr, rule[index][attr]);
}
}
},
ajaxPost: function(flag, sync) {
var obj = this;
//创建pop box;
if (obj.settings.tiptype == 1 || obj.settings.tiptype == 2) {
creatMsgbox();
}
Validform.util.submitForm.call($(obj.forms[0]), obj.settings, flag, "ajaxPost", sync);
},
submitForm: function(flag) {
/*flag===true时不做验证直接提交*/
var obj = this;
//让该对象的第一个表单提交;
var subflag = Validform.util.submitForm.call($(obj.forms[0]), obj.settings, flag);
subflag === undef && (subflag = true);
if (subflag === true) {
obj.forms[0].submit();
}
},
resetForm: function() {
var obj = this;
Validform.util.resetForm.call($(obj.forms));
},
abort: function() {
var obj = this;
$(obj.forms).each(function() {
Validform.util.abort.call(this);
});
},
check: function(selector, bool) {
/*
bool传入true只检测不显示提示信息;
*/
var selector = selector || "[datatype]",
obj = this,
curform = $(obj.forms),
flag = true;
curform.find(selector).each(function() {
Validform.util.check.call(this, curform, obj, "", bool) || (flag = false);
});
return flag;
}
}
$.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;
};
$.ShowConfirm = function() {
creatMsgbox();
Validform.util.showConfirm.call(win, arguments[0]);
};
$.HideConfirm = function() {
msgobj.hide();
msghidden = true;
};
})(jQuery, window);