jquery实现简易验证插件封装


Posted in jQuery onSeptember 13, 2020

本文实例为大家分享了封装jquery简易验证插件的具体代码,供大家参考,具体内容如下

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>jQuery数据校验插件开发</title>
 <link rel="stylesheet" href="css/register.css" />
 <link rel="stylesheet" href="css/validate.css" />
</head>
<body>
 <main>
 <section>
 <form method="post" action="result.html" ac id="register">
 <div class="register-wrap">
 <div class="register">
 <ul>
 <li>
 <label for="username">用户名:</label>
 <input type="text" id="username" name="username" tabindex="1" class="format-input" placeholder="请输入用户名" data-vt-required-msg="用户名不能为空" data-vt-regexp-msg="用户名必须是以字母、数字、下划线组成,且不能以数字开头(6-20位)" data-vt-required=true data-vt-regexp='^[\w_]\w{5,19}$' autofocus>
 </li>
 <li>
 <label for="pwd">密码:</label>
 <input type="password" id="pwd" name="password" tabindex="2" class="format-input" placeholder="请输入密码" data-vt-required=true data-vt-regexp="^[a-zA-Z_][\w_]{5,11}$" data-vt-required-msg="密码不能为空" data-vt-regexp-msg="密码必须是由字母、数字、下划线组成,且不能以数字开头(6-12位)" >
 </li>
 <li>
 <label for="confirmPwd">确认密码:</label>
 <input type="password" id="confirmPwd" name="password" tabindex="3" class="format-input" placeholder="请再次输入密码" data-vt-required=true data-vt-required-msg="密码不能为空" data-vt-equals=true data-vt-equals-msg="两次密码不一致">
 </li>
 <li>
 <label for="phone">手机号:</label>
 <input type="text" id="phone" name="phone" tabindex="4" class="format-input" placeholder="请输入手机号" data-vt-required=true data-vt-phone=true data-vt-required-msg="手机号不能为空" data-vt-phone-msg="手机号不合法">
 </li>
 <li>
 <label for="tel">座机:</label>
 <input type="text" id="tel" name="tel" tabindex="5" class="format-input" placeholder="请输入座机号码" data-vt-required=true data-vt-tel=true data-vt-required-msg="座机号不能为空" data-vt-tel-msg="座机号不合法">
 </li>
 <li>
 <label for="email">邮箱:</label>
 <input type="text" id="email" name="email" tabindex="6" class="format-input" placeholder="请输入邮箱地址" data-vt-required=true data-vt-email=true data-vt-required-msg="邮箱不能为空" data-vt-email-msg="邮箱不合法" >
 </li>
 <li>
 <label for="submitBtn"></label>
 <input type="submit" value="注册" id="submitBtn" tabindex="7" class="format-input submit-btn">
 </li>
 </ul>
 </div>
 </div>
 </form>
 </section>
 </main>
 <script src="js/jquery2.0.js"></script>
 <script src="js/formValidate.js"></script>
 <script>
 $(function(){
 $('#register').formValidate();
 });
 </script>
</body>
</html>

css部分

* {
 margin: 0;
 padding: 0;
 box-sizing: border-box;
 -webkit-box-sizing: border-box;
 -moz-box-sizing: border-box;
}
ul li {
 list-style: none;
 position: relative;
}
input {
 outline: 0;
}
.format-input {
 display: inline-block;
 width: 84%;
 height: 35px;
 padding: 0 0 0 3px;
 border: 1px solid #fff;
 vertical-align: baseline;
}
:focus {
 outline: 4px solid #007fff;
}
html,
body {
 width: 100%;
 height: 100%;
}
body {
 min-height: 100%;
 font: 12px/1.5 'Microsoft YaHei', arial, sans-serif;
 background: url(../image/bj.jpg) no-repeat;
 background-size: cover;
 overflow: hidden;
}
.register-wrap {
 position: absolute;
 top: 0;
 bottom: 0;
 left: 0;
 right: 0;
 width: 450px;
 height: 415px;
 margin: auto;
 background: rgba(0, 0, 0, 0.5);
}
.register {
 width: 100%;
 height: 100%;
 padding: 20px 30px;
 color: #fff;
}
.register > ul > li {
 font-size: 0;
 margin: 0 0 20px 0;
}
.register > ul > li label {
 display: inline-block;
 width: 16%;
 font-size: 12px;
}
.submit-btn {
 border: 1px solid transparent;
 font-size: 18px;
 font-weight: bold;
 color: #fff;
 background: #51a8ff;
 box-shadow: 1px 1px #AFC4EA,
  2px 2px #AFC4EA,
  3px 3px #AFC4EA;
}
.submit-btn:hover {
 cursor: pointer;
}
.submit-btn:focus {
 outline: none;
 border: 1px solid #f0f3f9;
}
.submit-btn:active {
 border: 1px solid #f0f3f9;
 transform: translate(1px, 1px);
 box-shadow: 1px 1px #AFC4EA,
   2px 2px #AFC4EA;
 
}

提示错误的tips样式:

.validate-error-tip {
 position: absolute;
 top: 0;
 left: 0;
 display: table;
 min-width: 150px;
 min-height: 35px;
 font-size: 12px;
 border: 1px solid lightblue;
 padding: 5px;
 background: #fff;
 color: #666;
 z-index: 9999;
}
.validate-error-tip:before {
 position: absolute;
 top: 0;
 left: -15px;
 display: block;
 content: '';
 width: 0;
 height: 0;
 border-color: transparent lightblue transparent transparent;
 /*1、下边框有颜色 对应着上边框没有宽度,是正三角形;2、上边框有颜色 对应着下边框没宽度,是倒三角形*/
 border-style: solid;
 border-width: 15px 15px 15px 0;
}

javascript部分:

(function($, factory, pluginName) {
 
 factory($, pluginName);
 
})(jQuery, function($, pluginName){
 
 //插件默认配置项
 var __DEFAULT__ = {
 
 //默认触发验证的事件为input事件
 initEvent: 'input',
 prefix: 'vt' //自定义属性前缀
 };
 
 //插件内部编写校验规则
 var __RULES__ = {
 
 //正则
 regexp: function(ruleData) {
  return new RegExp(ruleData).test(this.val());
 },
 
 //必填项
 required: function(ruleData) {
  return $.trim(this.val()).length > 0;
 },
 
 //最小值
 minLength: function(ruleData) {
  return $.trim(this.val()).length > ruleData ;
 },
 
 //最大值
 maxLength: function(ruleData) {
  return $.trim(this.val()).length < ruleData;
 },
 
 //验证两次密码是否一致
 isEquals: function(ruleData) {
  var pwd = $(':password').eq(0); //$(':password')[0]是什么对象呢?
  return pwd.val() === this.val();
 },
 
 //是否是邮箱
 isEmail: function(ruleData) {
  return /\w+@\w+\..+/g.test(this.val());
 },
 
 //是不是手机号
 isPhone: function(ruleData) {
  return /^1\d{10}$/g.test(this.val());
 },
 
 //是不是座机号码
 isTel: function(ruleData) {
  return /^0\d{2,3}-\d{7,8}$/g.test(this.val());
 }
 };
 
 $.fn[pluginName] = function(options) {
 
 //标识是否提交表单
 var $this = this;
 
 if(!$this.is('form')) { return; }
 
 //this: 这里的this是jQuery实例对象
 $this.$file = $this.find('input:not([type="button"][type="submit"])'); //给当前实例对象(也就是调用该插件的jquery对象)添加一个$file的属性
 
 $.extend($this, __DEFAULT__, options); //以默认配置为优先,以用户配置为覆盖
 
 //格式化rule规则。
 // 将一个字符串在每一个大写字母前加上一个'-',并且全部转为小写
 // vtEmailMsg > vt-email-msg
 $this.formatRule = function(str, connector) {
 
  if(typeof str !== 'string') {
  return str;
  }
 
  //使用replace、正则(匹配单个大写字母)
  str = str.replace(/[A-Z]/g,function(match, index) {
  if(index === 0) { return match.toLowerCase() }
  return connector + match.toLowerCase();
  });
  return str;
 };
 
 //显示错误信息
 $this.showErrorTip = function(errorMsg) {
  var $tip = $("<div class='validate-error-tip'> </div>"),
  offset = this.position(),
  elHeight = this.outerHeight(),
  elWidth = this.outerWidth();
 
  if(this.siblings('.validate-error-tip').length > 0){
  this.siblings('.validate-error-tip').eq(0).text(errorMsg).show();
  } else {
  $tip.text(errorMsg).
   css({
   top: offset.top,
   left: offset.left + elWidth + 15,
   width: $tip.width()
   });
  this.after($tip);
  $tip.show();
  }
 };
 
 //监听form表单里所有的input的事件
 $this.$file.on(this.initEvent, function(){
 
  var $input = $(this);
 
  //清除错误提示框
  $input.siblings('.validate-error-tip').remove();
 
  //注意这里是循环的我们插件的规则,而不是用户拥有的规则
  $.each(__RULES__, function(key, fn) {
  var rule = '',
   errorMsg = '';
 
  //如果key是以is字符开头、则去掉is
  if(key.indexOf('is') === 0) {
   key = key.slice(2);
  }
 
  key = $this.formatRule(key, '-'); //将规则格式化为html中书写的形式
  rule = $input.data(__DEFAULT__.prefix + '-' + key); //获取规则的值
  errorMsg = $input.data(__DEFAULT__.prefix + '-' + key + '-msg'); //规则对应的提示信息
 
  //如果当前input有这个规则,则执行这个规则
  if(rule) {
 
   //执行规则测试是否通过
   var isPassed = fn.call($input, rule); //改变规则函数fn执行时候的this,指向当前input jquery对象
 
   if(!isPassed) {
   //未通过、则错误提示
   $this.showErrorTip.call($input, errorMsg);
   }
  }
  });
 });
 
 //绑定提交表单的事件
 this.on('submit', function(e) {
  var isFormPassed = true;
 
  $this.$file.trigger($this.initEvent);
 
  $this.$file.each(function(index, current){
  var $current = $(current);
 
  if($current.siblings('.validate-error-tip').is(':visible')){
   isFormPassed = false;
   return false;
  }
 
  });
 
  if(!isFormPassed) {
  return isFormPassed;
  }
 });
 };
 
 //扩展新的验证规则(实际上就是扩展上面__RULES__对象)
 $.fn[pluginName].addRule = function(options) {
 
 $.extend(__RULES__, options);
 }
}, 'formValidate');

jquery实现简易验证插件封装

更多内容请参考《jquery表单验证大全》 ,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
Apr 10 jQuery
jQuery实现动态生成表格并为行绑定单击变色动作的方法
Apr 17 jQuery
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
利用jQuery+localStorage实现一个简易的计时器示例代码
Dec 25 jQuery
jQuery+ajax读取json数据并按照价格排序示例
Mar 28 jQuery
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
jQuery插件实现弹性运动完整示例
Jul 07 jQuery
jQuery常见的遍历DOM操作详解
Sep 05 jQuery
Javascript和jquery在selenium的使用过程
Oct 31 jQuery
js、jquery实现列表模糊搜索功能过程解析
Mar 27 jQuery
jquery实现两个div中的元素相互拖动的方法分析
Apr 05 jQuery
JavaScript枚举选择jquery插件代码实例
Nov 17 jQuery
jQuery实现朋友圈查看图片
Sep 11 #jQuery
jQuery实现日历效果
Sep 11 #jQuery
jquery实现简单每周轮换的日历
Sep 10 #jQuery
如何使用jQuery操作Cookies方法解析
Sep 08 #jQuery
jQuery实现简单三级联动效果
Sep 05 #jQuery
如何基于jQuery实现五角星评分
Sep 02 #jQuery
jQuery中getJSON跨域原理的深入讲解
Sep 02 #jQuery
You might like
常用的php ADODB使用方法集锦
2008/03/25 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
javascript复制对象使用说明
2011/06/28 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
python切片(获取一个子列表(数组))详解
2019/08/09 Python
python中对_init_的理解及实例解析
2019/10/11 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
总经理秘书工作职责
2013/12/26 职场文书
读书活动实施方案
2014/03/10 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
中职生自荐信范文
2014/06/15 职场文书
天气温馨提示语
2015/07/14 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript