jQuery插件之validation插件


Posted in jQuery onMarch 29, 2017

前面的话

最常使用javascript的场合就是表单的验证,而jQuery作为一个优秀的javascript库,也提供了一个优秀的表单验证插件——Validation。Validation是历史最悠久的jQuery插件之一,经过了全球范围内不同项目的验证,并得到了许多Web开发者的好评。本文将详细介绍validation插件

概述

jQuery Validate插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求。该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自定义方法的 API。所有的捆绑方法默认使用英语作为错误信息,且已翻译成其他 37 种语言

作为一个标准的验证方法库,Validation拥有以下特点:

1、内置验证规则:拥有必填、数字、E-Mail、URL和信用卡号等19类内置验证规则

2、自定义验证规则:可以很方便地自定义验证规则

3、简单强大的验证信息提示:默认了验证信息提示,并提供自定义覆盖默认提示信息的功能

4、实时验证:可以通过keyup或blur事件触发验证

validation作为jQuery的一个插件,使用时需要同jQuery一起引入,注意要先引入jquery

<script src="http://files.cnblogs.com/files/xiaohuochai/jquery-1.10.0.js"></script>
<script src="http://files.cnblogs.com/files/xiaohuochai/jquery.validate-1.13.1.js"></script>

快速上手

validation功能强大且API众多,如果要快速上手,只要掌握常用功能即可

<form id="demoForm">
 <p>
  <label for="username">用户名:</label>
  <input type="text" id="username" name="username"/>
 </p>
 <p>
  <label for="password">密码:</label>
  <input type="password" id="password" name="password"/>
 </p>
 <p>
  <input type="submit" value="登录"/>
 </p>
</form> 
<script>
$('#demoForm').validate({
 rules:{
  username:{
   required: true,
   minlength: 2,
   maxlength: 10
  },
  password:{
   required: true,
   minlength: 2,
   maxlength:10
  }
 }
})
</script>

上述代码主要对name为'username'和'password'这两个input控件进行了校验,这两个控件必须填写内容,且字符长度必须在2-10之间

校验规则

在快速上手的例子中,使用了required、minlength和maxlength这三个校验规则。实际上validation的校验规则有17个之多

序号   规则      描述
   required:true    必须输入的字段
   remote:"check.php"  使用 ajax 方法调用 check.php 验证输入值
   email:true    必须输入正确格式的电子邮件
   url:true     必须输入正确格式的网址
   date:true     必须输入正确格式的日期,内部调用Date.parse()方法进行校验
   dateISO:true    必须输入正确格式的日期(ISO),如:2009-06-23,1998/01/22
   number:true    必须输入合法的数字(负数,小数)
   digits:true    必须输入整数
   creditcard:    必须输入合法的信用卡号
   equalTo:"#field"   输入值必须和 #field 相同
   accept:     输入拥有合法后缀名的字符串(上传文件的后缀)
   maxlength:5    输入长度最多是 5 的字符串(汉字算一个字符)
   minlength:10    输入长度最小是 10 的字符串(汉字算一个字符)
   rangelength:[5,10]  输入长度必须介于 5 和 10 之间的字符串(汉字算一个字符)
   range:[5,10]    输入值必须介于 5 和 10 之间
   max:5      输入值不能大于 5
   min:10     输入值不能小于 10

下面使用一个更详细的例子,对上面的17个规则进行应用

<form id="demoForm">
 <p>
  <label for="username">用户名:</label>
  <input type="text" id="username" name="username"/>
 </p>
 <p>
  <label for="password">密码:</label>
  <input type="password" id="password" name="password"/>
 </p>
 <p>
  <label for="confirm-password">确认密码</label>
  <input type="password" id="confirm-password" name="confirm-password"/>
 </p>
 <p>
  <label for="email">电子邮件:</label>
  <input id="email" name="email"/>
 </p>
 <p>
  <label for="url">网址:</label>
  <input id="url" name="url"/>
 </p>
 <p>
  <label for="date">生日:</label>
  <input id="date" name="date"/>
 </p>
 <p>
  <label for="num">随机数(0-9):</label>
  <input id="num" name="num"/>
 </p>
 <p>
  <label for="card">信用卡号:</label>
  <input id="card" name="card"/>
 </p>
 <p>
  <input type="submit" value="登录"/>
 </p>
</form> 
<script>
$('#demoForm').validate({
 rules:{
  username:{
   required: true,
   maxlength: 10
  },
  password:{
   required: true,
   range:[5,10]
  },
  'confirm-password':{
   equalTo: "#password"
  },
  email:{
   email:true
  },
  url:{
   url:true
  },
  date:{
   dateISO:true
  },
  num:{
   min:0,
   max:9
  },
  card:{
   creditcard:true
  }
 }
})
</script>

默认提示

由上面的例子中看出,validate的默认提示是英文的

messages: {
 required: "This field is required.",
 remote: "Please fix this field.",
 email: "Please enter a valid email address.",
 url: "Please enter a valid URL.",
 date: "Please enter a valid date.",
 dateISO: "Please enter a valid date ( ISO ).",
 number: "Please enter a valid number.",
 digits: "Please enter only digits.",
 creditcard: "Please enter a valid credit card number.",
 equalTo: "Please enter the same value again.",
 maxlength: $.validator.format( "Please enter no more than {0} characters." ),
 minlength: $.validator.format( "Please enter at least {0} characters." ),
 rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
 range: $.validator.format( "Please enter a value between {0} and {1}." ),
 max: $.validator.format( "Please enter a value less than or equal to {0}." ),
 min: $.validator.format( "Please enter a value greater than or equal to {0}." )
}

不过可以将其修改为中文,只要加入以下代码

$.extend($.validator.messages, {
 required: "这是必填字段",
 remote: "请修正此字段",
 email: "请输入有效的电子邮件地址",
 url: "请输入有效的网址",
 date: "请输入有效的日期",
 dateISO: "请输入有效的日期 (YYYY-MM-DD)",
 number: "请输入有效的数字",
 digits: "只能输入数字",
 creditcard: "请输入有效的信用卡号码",
 equalTo: "你的输入不相同",
 extension: "请输入有效的后缀",
 maxlength: $.validator.format("最多可以输入 {0} 个字符"),
 minlength: $.validator.format("最少要输入 {0} 个字符"),
 rangelength: $.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),
 range: $.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),
 max: $.validator.format("请输入不大于 {0} 的数值"),
 min: $.validator.format("请输入不小于 {0} 的数值")
});

使用方式

上面的例子中,validate控件的使用,都是通过使用validate()方法完成的,由于这种方法将HTML结构和javascript逻辑分离,使得代码更加优化

实际上,还有另一种方法就是通过添加HTML属性的方式或添加class类名的方式来进行验证,类似于HTML5新增的input类控件的功能

由于已经将验证规则添加到HTML元素中,所以调用validate()方法时,参数为空

<form id="demoForm">
 <p>
  <label for="username">用户名:</label>
  <input type="text" id="username" name="username" class="required" minlength="2"/>
 </p>
 <p>
  <label for="email">电子邮件:</label>
  <input id="email" name="email" class="required email"/>
 </p>
 <p>
  <label for="url">网址:</label>
  <input id="url" name="url" class="url"/>
 </p>
 <p>
  <input type="submit" value="登录"/>
 </p>
</form> 
<script>
$('#demoForm').validate({})
</script>

更改提示

无论是validate插件自带的英文提示,或者是其扩展的中文提示,可能与实际项目的需求不相符。这时,就需要我们对错误提示进行更改

而更改错误提示的方法也很简单,只需要使用validate()函数里的,messages()方法即可。如果某个控件没有使用messages()方法,则使用默认的错误提示信息。如下所示

在messages()方法中,{0}代表rules()方法当前规则的属性值

<form id="demoForm">
 <p>
  <label for="username">用户名:</label>
  <input type="text" id="username" name="username" />
 </p>
 <p>
  <label for="email">电子邮件:</label>
  <input id="email" name="email" />
 </p>
 <p>
  <label for="url">网址:</label>
  <input id="url" name="url"/>
 </p>
 <p>
  <input type="submit" value="登录"/>
 </p>
</form> 
<script>
$('#demoForm').validate({
 rules:{
  username:{
   required: true,
   minlength: 2,
   maxlength: 10
  },
  email:{
   required: true,
   email:true
  },
  url:{
   required: true,
   url:true   
  }
 },
 messages:{
  username:{
   required:"请输入用户名",
   minlength:"至少输入{0}个字符"
  },
  email:{
   required:"请输入邮箱",
   email:"邮箱格式不正确"
  },
  url:{
   required:"请输入网址",
   url:"网址格式不正确(完整的网址应包括http://或https://)"
  }
 }
})
</script>

美化样式

实际上,validate插件输出错误信息的方式是通过增加一个label控件实现的,该label控件的id名为'输入控件的id名-error',类名为'error',且位于输入控件的右侧

jQuery插件之validation插件

下表中列出了关于错误信息的相关属性的方法

参数    类型  
默认值  
描述 
errorClass    String  "error"  指定错误提示的css类名 
errorElement  
String  "label"  用什么标签标记错误 
errorContainer   Selector 
 无   显示或者隐藏验证信息,可以自动实现有错误信息出现时把容器属性变为显示,无错误时隐藏,用处不大。如errorContainer: "#messageBox1, #messageBox2" 
errorLabelContainer Selector 
无   把错误信息统一放在一个容器里面 
wrapper    String    无   用什么标签再把上边的errorELement包起来

【成功样式】

validate插件有一个success()方法,用来设置要验证的元素通过验证后的动作,如果跟一个字符串,会当作一个css类,也可跟一个函数

success:String,Callback

success: function(label) {
 label.html(" ").addClass("success");
} 

success: "success"

但实际上,validate插件只是将label标签添加了一个'success'类,且原先的'error'类并没有删除。且经过实际测试,'error'类名无法删除,删除之后,每次验证成功时,validate插件都会自动再生成一个label标签

所以,success的效果无法正常使用,这应该是validate插件的一个bug

<style>
label.error{background: no-repeat 0 4px;background-image:url('unchecked.gif');margin-left:6px;padding-left:14px;color:red;}
</style>
<body>
<form id="demoForm">
 <p>
  <label for="username">用户名:</label>
  <input type="text" id="username" name="username" />
 </p>
 <p>
  <label for="email">电子邮件:</label>
  <input id="email" name="email" />
 </p>
 <p>
  <label for="url">网址:</label>
  <input id="url" name="url"/>
 </p>
 <p>
  <input type="submit" value="登录"/>
 </p>
</form> 
<script>
$('#demoForm').validate({
 rules:{
  username:{
   required: true,
   minlength: 2,
   maxlength: 10
  },
  email:{
   required: true,
   email:true
  },
  url:{
   required: true,
   url:true   
  }
 },
 messages:{
  username:{
   required:"请输入用户名",
   minlength:"至少输入{0}个字符",
   maxlength:"最多输入{0}个字符"
  },
  email:{
   required:"请输入邮箱",
   email:"邮箱格式不正确"
  },
  url:{
   required:"请输入网址",
   url:"网址格式不正确(完整的网址应包括http://或https://)"
  }
 } 
})
</script>

自定义验证

由于需求的需要,除提供的默认验证规则外,还需要自定义验证规则,满足业务需要。这时就需要使用addMethod()方法

【addMethod(】

addMethod(name,method,message)方法用来添加一个新的验证方法

参数 name 是添加的方法的名字。参数 method 是一个函数,接收三个参数 (value,element,param)。value 是元素的值,element 是元素本身,param 是参数

以验证手机号为例,手机号一般是11位,前3位是号段,后8位一般没有限制。而且,在手机开头很可能有0或+86

//开头
(0|\+86)?
//前3位
13\d|14[579]|15[0-35-9]|17[0135-8]|18\d
//后8位
\d{8}
//手机号码
var phone = /^(0|\+86)?(13\d|14[579]|15[0-35-9]|17[0135-8]|18\d)\d{8}$/;
$.validator.addMethod({
 'phone',
 function(value,element,param){
  var reg = /^(0|\+86)?(13\d|14[579]|15[0-35-9]|17[0135-8]|18\d)\d{8}$/;
  return value.test(reg);
 },
 '请输入正确的手机号码'
})
<style>
label.error{margin-left:6px;padding-left:14px;color:red;background: no-repeat 0 4px;background-image:url('data:image/gif;base64,R0lGODlhDgAOAMQAAOpSAPWpgPvf0O5zMPGIUPe+n////+tdEPjJsP718POecO1oIPrUwPzq4Pa0kPKTYPSof////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUABEALAAAAAAOAA4AAAVcYCQm0AAAA5SIbHGcMHAULazEJ528AGIsgADDIUsEYAYDopBsAAOmXDLpOkVPB0ETFxskpjeY6fD4GhrJBAF1zCYDBx/jFYi8DoEH9yAqcGM0fTwxMywsUFZ1LCEAOw==');}
</style>
<form id="demoForm">
 <p>
  <label for="phone">手机号码:</label>
  <input type="text" id="phone" name="phone" />
 </p>
 <p>
  <input type="button" value="提交">
 </p>
</form> 
<script>
$.validator.addMethod(
 'phone',
 function(value,element,param){
  var reg = /^(0|\+86)?(13\d|14[579]|15[0-35-9]|17[0135-8]|18\d)\d{8}$/;
  return reg.test(value);
 },
 '请输入正确的手机号码'
);
$('#demoForm').validate({
 rules:{
  phone:{
   required: true,
   phone:true   
  }
 },
 messages:{
  phone:{
   required:"请输入手机号码"
  }
 } 
})
</script>

修改触发方式

下面的虽然是 boolean 型的,但建议除非要改为 false,否则别乱添加

触发方式 
 类型 
描述 











默认值
onsubmit 
  Boolean 提交时验证。设置为 false 就用其他方法去验证 

true
onfocusout 
 Boolean 失去焦点时验证(不包括复选框/单选按钮) 


  true
onkeyup 

Boolean 在 keyup 时验证。 








true
onclick 

Boolean 在点击复选框和单选按钮时验证 





 true
focusInvalid  Boolean 提交表单后,未通过验证的表单会获得焦点 


   true
focusCleanup  Boolean 如果是true,当未通过验证的元素获得焦点时,移除错误提示 false

远程校验

使用 ajax 方式进行验证,默认会提交当前验证的值到远程地址,如果需要提交其他的值,可以使用 data 选项

[注意]远程地址只能输出 "true" 或 "false",不能有其他输出

remote: {
 url: "check-email.php",  //后台处理程序
 type: "post",    //数据发送方式
 dataType: "json",   //接受数据格式 
 data: {      //要传递的数据
  username: function() {
   return $("#username").val();
  }
 }
}
<style>
label.error{margin-left:6px;padding-left:14px;color:red;background: no-repeat 0 4px;background-image:url('data:image/gif;base64,R0lGODlhDgAOAMQAAOpSAPWpgPvf0O5zMPGIUPe+n////+tdEPjJsP718POecO1oIPrUwPzq4Pa0kPKTYPSof////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUABEALAAAAAAOAA4AAAVcYCQm0AAAA5SIbHGcMHAULazEJ528AGIsgADDIUsEYAYDopBsAAOmXDLpOkVPB0ETFxskpjeY6fD4GhrJBAF1zCYDBx/jFYi8DoEH9yAqcGM0fTwxMywsUFZ1LCEAOw==');}
</style>
<form id="demoForm">
  <p>
    <label for="num">请选择数字</label>
    <select name="num" id="num">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </p>
  <p>
    <input type="button" value="提交">
  </p>
</form> 
<script>
$('#demoForm').validate({
  rules:{
    num:{
      remote:"validateTest.php"
    }
  },
  messages:{
    num:{
      remote:"选择的数字不正确"
    }
  }
});
</script>
<?php
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
$data = test_input($_REQUEST['num']);
if($data == '2'){
  echo "true";
}else{
  echo "false";
}
?>

最后

validation插件的功能不只于此,但本文基本上把常用的功能进行了详细的介绍。如果要了解validation更高级的功能,请移步官方网站

最后介绍一个比较有趣的知识——validate、validation和validator,它们的中文意思是验证。validation插件的js文件名是validate.js,validation插件中最常用的方法就是validate()方法,基本上所有的验证操作都通过该方法进行。如果要进行自定义验证的话,则需要用到validator对象下的静态方法addMethod()

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

jQuery 相关文章推荐
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
基于jQuery的表单填充实例
Aug 22 jQuery
解决jquery appaend元素中id绑定事件失效的问题
Sep 12 jQuery
jQuery中extend函数简单用法示例
Oct 11 jQuery
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
jQuery模拟12306城市选择框功能简单实现方法示例
Aug 13 jQuery
jQuery序列化form表单数据为JSON对象的实现方法
Sep 20 jQuery
jQuery+Datatables实现表格批量删除功能【推荐】
Oct 24 jQuery
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
jquery html添加元素/删除元素操作实例详解
May 20 jQuery
jQuery实现广告显示和隐藏动画
Jul 04 jQuery
jquery实现静态搜索功能(可输入搜索文字)
Mar 28 #jQuery
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 #jQuery
BootStrap中jQuery插件Carousel实现轮播广告效果
Mar 27 #jQuery
jQuery中的deferred使用方法
Mar 27 #jQuery
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 #jQuery
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 #jQuery
jQuery实现鼠标经过显示动画边框特效
Mar 24 #jQuery
You might like
一个php作的文本留言本的例子(四)
2006/10/09 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
php 分页原理详解
2009/08/21 PHP
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
php数组去重的函数代码
2013/02/03 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
JS日历 推荐
2006/12/03 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
Python lxml模块安装教程
2015/06/02 Python
python使用super()出现错误解决办法
2017/08/14 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
python实现简单井字棋游戏
2020/03/04 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
税务专业毕业生自荐信
2013/11/10 职场文书
社区娱乐活动方案
2014/08/21 职场文书
公务员政审个人总结
2015/02/12 职场文书
端午节寄语2015
2015/03/23 职场文书
护士自我推荐信范文
2015/03/24 职场文书