其他:
<form action="">
First name: <input type="text" name="FirstName" value="Bill" /><br />
Last name: <input type="text" name="LastName" value="Gates" /><br />
secret: <input type="text" name="secret" value="Yousecret" /><br />
</form> $("form").serialize(); //FirstName=Bill&LastName=Gates 一般用法:
$.ajax({
type: 'post',
url: 'your url',
data: $("form").serialize(),
success: function(data) {
// your code
}
});
serializeArray()读取form表单中的所有数据列表
var siginList = $('form').serializeArray();
<div contenteditable="true">我是一个可被编辑的DIV</div>
一.jqeuryvalidate
参数选项
$("form").validator({
debug :0, //调试 //0:关闭实时验证,只在提交表单的时候执行验证
//1:输入框失去焦点(focusout)时执行验证
//2:输入框改变值(input)时执行验证
//3:输入框失去焦点和改变值(综合 1 + 2) (v0.8.0+)
//8:同 2,并且详细提示每个规则的结果 (v0.9.0+)
//9:同 3,并且详细提示每个规则的结果 (v0.9.0+)
//大于 100 的数值:验证延迟时间
timely :1; //实时验证 theme :"default", //主题
stopOnError :false, //在第一次错误时停止验证 关闭此开关,以便一次性显示所有消息
focusInvalid :true, //第一个错误字段自动获得焦点
focusCleanup :false, //输入框获得焦点时清除验证消息
ignoreBlank :false, //不验证空值的字段(只针对实时验证)
ignore :"", // 默认忽略验证 jQuery 选择器选中的字段
ignore :':hidden', //任何不可见的元素,都不作验证
ignore :'#tab2', //id为tab2下的所有子元素都不作验证
display:'null', // 自定义消息中{0}的替换字符
display:Function(elem){ // 自定义消息中{0}的替换字符
return $(elem).closest('.form-item').children('label:eq(0)').text();
},
target :null, //默认 自定义消息的显示位置
target :'#myContainer', // 将所有消息全部提示在 id 为 myContainer 里面
target:Function(elem){// 自己指定消息容器位置
var $formitem = $(elem).closest('.form-item'),
$msgbox = $formitem.find('span.msg-box');
if (!$msgbox.length) {
$msgbox = $('<span class="msg-box"></span>').appendTo($formitem);
}
return $msgbox;
},
valid:null,// 默认 表单验证通过时调用此函数
invalid: function(form){//表单验证通过时调用此函数
// 表单验证通过,提交表单
$.post(url, $(form).serialize() ).done(function(d){
// some code
});
},
invalid:null,//表单验证失败后的回调。也可以使用 invalid.form 事件
invalid:function(){
//$('#form').on('invalid.form', function(e, form, errors){});
},
validation:null,//验证每个字段后调用此函数
validation: function(element, result){
$("#submitBtn").prop('disabled', !element.form.isValid)
},
rules:null,//自定义规则
rules: {//自定义用于当前实例的规则,支持两种定义方式
// 自定义验证函数,具有最大的灵活性
myRule: function(el, param, field){
//验证并返回布尔值
},
// 简单配置正则及错误消息
another: [/^\w*$/, 'Please enter the letters or underscore.']
},
messages:null,//自定义消息
messages: {
required: "不能为空",
email: "请填写正确的邮件地址",
myRule:"自定义规则的提示消息"
},
fields:null,//配置字段规则及参数
fields: {
//为input[name=foo]调用前面定义的两个规则
foo: 'required; myRule[param]; another',
username: {
//字段规则
rule: "姓名: required; myRule; rule2; rule3",
//(自定义字段中?)每个规则的错误消息
msg: {
myRule:"自定义规则的提示消息", #注意这里值为false和""则会显示默认的错误提示
required: "请填写姓名",
rule2: "xxxx",
rule3: "xxxx"
},
//自定义获得焦点时的友好提示信息
tip: "填写真实姓名有助于朋友找到你",
//自定义字段验证成功后显示的消息
ok: "{0}填写正确", //返回姓名填写正确
//是否启用实时验证,默认继承
timely: false,
//验证当前字段,但是实际上在 target 的元素上提示错误消息
//如果目标元素是输入框(input,textarea、select),将会以目标元素为基准点,插入一条消息;
//如果目标元素是消息占位(className 为 msg-box),这和直接使用消息占位没有区别
//其他情况下,直接显示在target指向的容器中
target: "#msg_holder",
//字段验证通过的回调
valid:function(form){},
//字段验证失败的回调
valid:function(form){},
//使用 dataFilter 回调可以转换 ajax 返回的结果为 nice-validator 支持的格式
dataFilter:function(form){},
must:true,//是否强制验证该字段
msgWrapper:"span",//自定义该字段的消息容器的标签名
msgMaker:"",//自定义该字段的消息生成器 参数?
msgClass:"",//自定义该字段的消息Class 在.msg-box消息容器标签上
msgStyle:"font-size:14px;",//自定义该字段的消息 CSS 样式 绑定在.msg-box消息容器标签上
getValue:function(){},//自定义 value 的 getter 参数?
setValue:function(){},//自定义 value 的 setter 参数?
},
},
beforeSubmit :null,//在提交表单之前调用此函数
beforeSubmit:function(form){
//一般在提交之前修改某些form元素
},
dataFilter:null,//转换服务端通过ajax返回的数据为插件支持的格式一般和remote默认规则搭配使用
dataFilter:function(data){
//假设服务端返回结果为: {"status":600, "msg":"名字已被占用"}
if (data.status === 200) return "";
else return data.msg;
},
//主题相关的参数
showOk:true,//默认 是否显示成功提示(前提是有传ok的消息) 返回布尔 或者字符串
showOk:false,//如果设置成false在字段验证通过后将只是简单的隐藏消息。
showOk:'正确',//如果传递一个字符串,在验证通过后将提示这个消息
showOk:'',//如果设置成空字符串,将只显示一个成功的图标
validClass:'has-succes', //为验证通过的form表单添加的class名
invalidClass:"has-error",//验证不通过的输入框添加的class名
bindClassTo:"#verifiable",//设置 validClass 和 invalidClass 添加到的位置
formClass:"n-default", //主题的 class 名称,添加在 form 上
msgClass: "n-top", //消息将自动显示在输入框上边
msgClass: "n-right", //默认 消息将自动显示在输入框右边
msgClass: "n-bottom", //消息将自动显示在输入框下边
msgClass: "n-left", //消息将自动显示在输入框左边
msgClass: "n-right myclass", //消息将自动显示在输入框右边,你还可以通过myclass来定义更多样式
msgStyle:"margin-left:-10px; margin-top:10px;",//为消息容器 自定义css
msgWrapper:"span",//消息容器的元素标签
msgMaker:null,//自定义消息 HTML 结构 为false则不生成提示消息
msgMaker: function(opt){
return '<span class="'+ opt.type +'">' + opt.msg + '</span>';
/* opt包含的子属性
type
:消息类型(可能的值为:error / ok / tip / loading)
cls
: 即msgClass参数的值
style
: 即msgStyle参数的值
icon
: 即msgIcon参数的值
arrow
: 即msgArrow参数的值
show
: 即msgShow参数的值
hide
: 即msgHide参数的值
以上 msgMaker 配置,将生成如下消息结构
<div class="msg-box n-right" for="user[name]">
<span class="n-error">Please fill this field.</span>
</div>
*/
},
msgIcon:"<span class="n-icon"></span>",//自定义消息图标的 HTML 模板
msgArrow:"", //自定义消息箭头的 HTML 模板
msgShow:null, //消息提示之前调用此函数
msgShow:function($msgbox, type){
//
},
msgHide:null,//消息隐藏之前调用此函数
msgHide:function($msgbox, type){
//
} });
消息体html结构:
<span class="msg-box" for="quanxian" style="">
<span role="alert" class="msg-wrap n-error">
<span class="n-icon"></span>
<span class="n-msg">协议必选</span>
</span>
</span>
事件:
.on("validation"):描述:每次验证完一个字段,都会触发 validation
事件,通过该事件可以获取到当前验证字段的验证结果。
$('#form').on('validation', function(e, current){
var form = this;
// form 中是否所有字段都验证通过
console.log(form.isValid);
// 当前验证字段是否通过
console.log(current.isValid); // 打印其他属性
console.log(current.element);
console.log(current.value);
console.log(current.msg);
});
.on("valid.form"):在表单验证通过后触发
$('#form').on('valid.form', function(e, form){
//do something...
});
.on("invalid.form"):在表单验证不通过后触发
$('#form').on('invalid.form', function(e, form, errors){
//do something...
});
.on("valid.field"):在字段验证通过后触发
$('#username').on('valid.field', function(e, result){
//do something...
});
.on("invalid.field"):在字段验证不通过后触发
$('#username').on('invalid.field', function(e, result){
//do something...
});
.on("valid.rule"):在规则验证通过后触发
$('#username').on('valid.rule', function(e, ruleName){
if (ruleName === 'remote') {
//do something...
}
});
.on("invalid.rule"):在规则验证不通过后触发
$('#username').on('invalid.rule', function(e, ruleName){
if (ruleName === 'remote') {
//do something...
}
});
发布:
.trigger("validate"):手动触发字段执行验证
触发类型
//①$input.trigger("validate"); 手动触发元素进行验证
//如:手动调用username字段验证
$('input[name="username"]').trigger("validate"); //②$form.trigger("validate"); v0.7.0+ 手动触发表单进行验证,验证通过后不会自动提交
//如:手动调用表单验证
$('#form').trigger("validate"); //③$form.trigger("submit"); 手动触发表单提交,在提交前会自动验证
//如:手动调用表单提交
$('#form').trigger("submit"); //④$input.trigger("showtip"); v0.5.0+ 触发元素显示tip消息
//手动调用验证初始化完成后,立即显示所有字段的提示
$('#form').validator().trigger("showtip");
.trigger("showmsg", [type, message]):触发字段提示消息
// 手动调用字段验证成功消息
$("#username").trigger("showmsg", ["ok", "Great name"]);
// 手动调用input字段验证错误消息
$("#username").trigger("showmsg", ["error", "Name is already taken"]);
// 手动调用(input聚焦选中)友好的提示消息
$("#username").trigger("showmsg", ["tip", "Others make a good name for you impressed"]);
// 手动调用已经绑定的提示消息 (data-tip)
$("#username").trigger("showmsg", ["tip"]);
// 手动调用所有提示消息
$("#form").trigger("showmsg", ["tip"]);
.trigger("hidemsg"):触发字段隐藏消息
// 手动调用隐藏指定字段的消息
$("#username").trigger("hidemsg");
// 手动调用隐藏整个表单的提示消息
$("#form").trigger("hidemsg");
插件方法:
$('#form1')
.validator({选项参数}) : 根据参数初始化验证,验证 jQuery 选中的表单
$('#form1')
.validator(function(){}) : 初始化验证,验证 jQuery 选中的表单,验证通过后执行回调
// 等同于 $('#form1').validator({ valid: function(){}, });
$('#form1')
.validator(instanceMethod, arg1, arg2... ) :通过.validator()
方法调用实例方法?
// 清空表单验证消息
$('#form1').validator("cleanUp");
// 销毁表单验证
$('#form1').validator("destroy");
$('#form1')
.isValid( callback ) 判断某个区域或者某个字段是否验证通过,如果字段中有异步 ajax 验证,需要通过 callback 获取验证结果
// 使用回调函数获取验证结果
$('#mobile').isValid(function(v){
if (v) {
// do something
}
});
// v0.10.5+ 还支持下面这种写法,即回调不带参数,就是验证通过的回调
$('#mobile').isValid(function(){
// do something
});
// 如果验证的字段中没有 ajax 异步验证,直接获取结果也是可以的
if ( $('#mobile').isValid() ) {
// do something
}
静态方法
$.validator(selector, options)
// 即使 "#form1" 这个表单被动态加载,也可以验证
$.validator("#form1", {
timely: 2,
stopOnError: true,
fields: {
email: "required;email",
password: "required;length(6~16)",
mobile: "required;mobile"
}
});
$.validator.config(options):配置全局选项 建议配置在 local 配置文件(如:zh-CN.js)中
$.validator.config({
timely: 2
});
$.validator.config(
rules: {
mobile: [/^1[3-9]\d{9}$/, "请填写有效的手机号"],
chinese: [/^[\u0391-\uFFE5]+$/, "请填写中文字符"]
}
);
$.validator.setTheme(name, options):配置全局主题 参考配置选项
$.validator.setTheme("myTheme", {
formClass: "nice-flat",
msgClass: "n-right",
timely: 2,
stopOnError: true
});
instance (实例方法)
.test(elem, rule):验证字段是否符合指定的规则 返回布尔
$("#myForm").validator({
rules: {
loginName: function(element) {
return /^[a-zA-Z]\w{3,}/.test(element.value)
|| this.test(element, "mobile")
|| this.test(element, "email")
|| 'Please fill user name, phone number or E-mail';
}
},
fields: {
username: "required; loginName",
password: "required; length(6~16)"
}
});
.setField(key, field):动态配置字段参数
$('form').validator("setField", "username", "required;");
// Remove the field's verification.
$('form').validator("setField", "username", null);
.setField(obj):动态配置字段参数
$('form').validator("setField", {
username: "required;username",
pwd: "required;password"
});
.showMsg(elem, obj):使字段提示消息(不推荐),推荐使用.trigger("showmsg")
.hideMsg(elem):使字段隐藏消息(不推荐),推荐使用.trigger("hidemsg")
.holdSubmit(hold):防止表单重复提交的措施
$("#myForm").validator({
valid: function(form){
var me = this;
// Before submitting the form, hold form, to prevent duplicate submission.
me.holdSubmit();
$.ajax({
url: "xxx.php",
data: $(form).serialize(),
type: "POST",
success: function(){
// After the form is submitted successfully, release hold.
me.holdSubmit(false);
}
});
}
});
.cleanUp():清除表单中的全部验证消息
$('#form1').validator('cleanUp');
.destroy():销毁表单验证实例
$('#form1').validator('destroy');
内置规则:
required - 使字段必填 适用于 input、textarea、select(注意 :":filled" 是一个jquey的选择器扩展,匹配填充值了的表单元素,用法和:checked、:radio、:checkbox一致)
①required
②required("input:filled" )、required(#id:checked)、required(#id:enabled)、...
③required(ruleName) 满足规则(某个默认规则自定义规则) ruleName 则字段必填
④required(from, class, count) :className 为 contact 的字段至少填写一个
eg:
<input class="contact" name="mobile" placeholder="手机号"
data-rule="required(from, .contact); mobile"
data-msg-required="请至少填写一种联系方式"> <input class="contact" name="tel" placeholder="电话"
data-rule="required(from, .contact); tel"> <input class="contact" name="email" placeholder="邮箱"
data-rule="required(from, .contact); email"> ⑤required(not, value) 必填但排除value
规则 描述
checked 必选
checked(n) 必选 n 项
checked(n~) 至少选择 n 项
checked(~n) 最多选择 n 项
checked(n1~n2) 选择 n1 到 n2 项
规则 描述
match(name) 当前字段值必须和 name 字段的值匹配
match(eq, name) 同上
match(neq, name) 当前字段值必须和 name 字段值不同
match(lt, name) 当前字段值必须小于 name 字段值
match(gt, name) 当前字段值必须大于 name 字段值
match(lte, name) 当前字段值必须小于等于 name 字段值
match(gte, name) 当前字段值必须大于等于 name 字段值
match(gte, name, date) 当前日期值必须大 于等于 name 字段日期值
match(gte, name, datetime) 当前时间值必须大于等于 name 字段时间值
remote(url)
remote(get:URL) 默认post
remote(cors:post:/user/checkName) 强制跨域 <input type="text" name="username"
data-rule="required;remote({:U('User/test')})"
> 然后经过user控制器test方法处理后返回
返回是字符串:返回" ":通过; 不为空 则 将作为错误信息输出 返回json时: // 验证通过
{"ok": "名字很棒"} //$msg['ok']="名字很棒";echo json_encode($msg);
// 验证不通过
{"error": "名字已被占用"} //$msg['error']="名字已被占用";echo json_encode($msg); // 结果在第二级 data
{"status": 200, "data": {"error": "名字已被占用"}}
规则 描述
integer 整数
integer(+) 正整数
integer(+0) 正整数和零
integer(-) 负整数
integer(-0) 负整数和零
规则 描述
range(n~) 请填写不小于 n 的数
range(~n) 请填写不大于 n 的数
range(n1~n2) 请填写 n1 到 n2 的数
range(n1~n2, false) 请填写 n1 到 n2 的数(不包含边界值)(v0.9.0+)
规则 描述
length(n) 请填写 n 个字符
length(n~) 请至少填写 n 个字符
length(~n) 请最多填写 n 个字符
length(n1~n2) 请填写 n1 到 n2 个字符
length(n~, true) 请至少填写 n 个字符(全角字符计算双字符)
规则 描述
filter 过滤 <>`"' 和字符实体编码的字符
filter(RegExp) 自定义过滤正则
验证方式:
例1. DOM传参 DOM 绑定规则,无需 JS 代码
1. 要验证一个表单,只需要给字段绑定规则“data-rule”就可以了
2. 字段可以有多条规则,规则之间用分号(;)分隔
3. js初始化不是必要的,只要是字段并且带有“data-rule”属性,即使是新插入的一段DOM也可以立马验证
4. 其中:required是内置规则(核心自带),username、password是配置文件中设置的全局规则(配置文件) <form id="demo_11" action="results.php" method="post" autocomplete="off">
<fieldset>
<p><input name="user[name]" data-rule="required;username" placeholder="用户名"></p>
<p><input name="user[pwd]" data-rule="required;password" placeholder="密码"></p>
</fieldset>
<button type="submit">提交</button>
</form>
<input type="text" name="username" data-rule="required;"> :提示 此处不能为空
<input type="text" name="username" data-rule="用户名:required;"> :提示 用户名不能为空 <input type="text" name="username"
data-rule="required;"
data-tip="输入你的名字与姓氏。" 可选:聚焦提示
data-ok="名字很棒。" 可选:默认为一个绿色的勾
data-msg-required="全名必填!" 可选:data-msg-指定的规则 默认错误只显示红色的X
>
例2. js传参(这和上面的DOM传参等价) JS 配置规则,无侵入 DOM
HTML
<form id="demo_12" action="results.php" method="post" autocomplete="off">
<fieldset>
<p><input name="user[name]" placeholder="用户名"></p>
<p><input name="user[pwd]" placeholder="密码"></p>
</fieldset>
<!--button type="submit">提交</button-->
<a href="javascript:" class="submit-btn">提交</a>
</form> Javascript
$('#demo_12').validator({
fields: {
'user[name]': 'required; username;'
,'user[pwd]': 'required; password;'
}
})
// 使用链接代替submit按钮(注意:这种情况下输入框里面的回车键不能触发submit事件)
$("#xxoo").on("click", "a.submit-btn", function(e){
$(e.delegateTarget).trigger("submit");
});
例3. radio的必选
1. 对于checkbox和radio,要“必填”的话,不能使用“required”,而是使用“checked”
2. 你只需要在第一个checkbox或者radio上面绑定规则就可以了
3. 消息会自动生成,并且显示在最后面,你无需关注消息怎么显示 <form id="demo_51" action="results.php" method="post" autocomplete="off">
<fieldset>
<label class="form-label">性别:</label>
<label><input type="radio" name="gender" value="1" data-rule="checked">男</label>
<label><input type="radio" name="gender" value="2">女</label>
<label><input type="radio" name="gender" value="0">保密</label>
</fieldset>
<div class="form-submit">
<button type="submit">提交</button>
</div>
</form> <form id="demo_52" action="results.php" method="post" autocomplete="off">
<fieldset>
<label class="form-label">兴趣:</label>
<label><input type="checkbox" name="interest[]" value="0" data-rule="checked">看书</label>
<label><input type="checkbox" name="interest[]" value="1">上网</label>
<label><input type="checkbox" name="interest[]" value="2">睡觉</label>
<label><input type="checkbox" name="interest[]" value="3">运动</label>
<label><input type="checkbox" name="interest[]" value="4">发呆</label>
</fieldset>
<div class="form-submit">
<button type="submit">提交</button>
</div>
</form>
控制选中项目数
1. checked[2~]
表示选择的项目要在2项以上
2. 不要对:radio
使用参数,因为本身就是单选,直接checked
就可以了
<form id="demo_53" action="results.php" method="post" autocomplete="off">
<fieldset>
<label class="form-label">兴趣:</label>
<label><input type="checkbox" name="interest[]" value="0" data-rule="checked[2~]">看书</label>
<label><input type="checkbox" name="interest[]" value="1">上网</label>
<label><input type="checkbox" name="interest[]" value="2">睡觉</label>
<label><input type="checkbox" name="interest[]" value="3">运动</label>
<label><input type="checkbox" name="interest[]" value="4">发呆</label>
</fieldset>
<div class="form-submit">
<button type="submit">提交</button>
</div>
</form>
例4. Ajax提交表单
1. 可以通过valid
参数传入回调,参见配置
2. 也可以直接接收valid.form
事件(下面例子采用接收事件的方式),参见事件
HTML
<div id="result_14" class="tip-ok" style="display:none">提交成功</div>
<form id="demo_14" autocomplete="off"
data-validator-option="{theme:'simple_right'}"
>
<fieldset>
<p><input name="username" data-rule="用户名:required;username" placeholder="用户名"></p>
<p><input name="password" data-rule="密码:required;password" placeholder="密码"></p>
</fieldset>
<button type="submit">提交</button>
</form> Javascript
//接收表单验证通过的事件
$('#demo_14').bind('valid.form', function(){
$.ajax({
url: 'results.php',
type: 'POST',
data: $(this).serialize(),
success: function(d){
$('#result_14').fadeIn(300).delay(2000).fadeOut(500);
}
});
});
自定义规则:
注意:自定义规则如果与内置规则同名,则自定义规则优先
通过 DOM 方式自定义规则(只对当前字段有效)
<input name="demo" data-rule="required; xxx" data-rule-xxx="[/^\d{6}$/, '请输入6位数字']">
通过 rules 配置规则(当前表单实例有效)
<input name="demo"> $('#form1').validator({
rules: {
// 使用正则表达式定义规则
mobile: [/^1[3-9]\d{9}$/, "请填写有效的手机号"],
// 使用函数定义规则
xxx: function(elem, param) {
return /^1[3458]\d{9}$/.test($(elem).val()) || '请检查手机号格式';
}
},
fields: {
// 对字段 username 应用规则 mobile
'username': 'required;mobile'
}
});
全局规则:
提交方式:
提交方式1:表单验证通过后自动原生方式提交
<form id="form1" action="register.php">
<label>Email</label>
<input type="email" name="email" data-rule="required;email">
<label>Password</label>
<input type="password" name="pwd" data-rule="required;length(6~16)">
<button type="submit">提交</button>
</form>
提交方式2:js使用验证通过回调
$('#form1').validator({
valid: function(form) {
// do something
// use native submit.
form.submit();
}
});
提交方式3:绑定表单验证通过的事件(参考:valid.form事件)
$('#form1').on('valid.form', function(e){
// You can do something, then submit form by native
// this.submit();
// or use ajax submit
$.post("path/to/server", $(this).serialize())
.done(function(d){
// some code
});
});