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 tip提示插件(实例分享)
Apr 28 jQuery
JQuery实现图片轮播效果
May 08 jQuery
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
Dec 25 jQuery
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
Apr 12 jQuery
jQuery插件Validation表单验证详解
May 26 jQuery
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
jQuery md5加密插件jQuery.md5.js用法示例
Aug 24 jQuery
jQuery Datatables 动态列+跨列合并实现代码
Jan 30 jQuery
jQuery实现移动端笔触canvas电子签名
May 21 jQuery
jQuery实现评论模块
Aug 19 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将数据导入到Foxmail的实现代码
2010/09/05 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python struct.unpack
2008/09/06 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
派出所所长先进事迹
2014/05/19 职场文书
践行三严三实心得体会
2014/10/13 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
我收到了德劲DE1107
2022/04/05 无线电