拥有一个属于自己的javascript表单验证插件


Posted in Javascript onMarch 24, 2016

自己编写了一个表单验证插件,使用起来很简单,以后还可以扩展更多的功能,比如ajax验证。

每个需要验证的表单元素下面有一个span标签,这个标签的class有一个valid表示需要验证,如果有nullable则表示可为空;rule表示验证规则,msg表示错误提示信息;to表示要验证的元素的name值,如果元素是单个的,to可以不写。该插件会遍历每个有valid的span标签,找出它前面需要验证的元素,根据rule验证,如果验证不通过,则显示边框为红色,鼠标放在元素上时显示错误信息。

 验证时机:1、点击提交按钮时显式调用验证方法;2、当元素触发blur时验证。

插件代码:

CSS:

.failvalid
{
 border: solid 2px red !important;
}

JS:

/**
* 验证插件
*/

SimpoValidate = {
 //验证规则
 rules: {
 int: /^[1-9]\d*$/,
 number: /^[+-]?\d*\.?\d+$/
 },

 //初始化
 init: function () {
 $("span[class*='valid']").each(function () { //遍历span
 var validSpan = $(this);
 var to = validSpan.attr("to");
 var target;
 if (to) {
 target = $("input[name='" + to + "'],select[name='" + to + "'],textarea[name='" + to + "']");
 } else {
 var target = validSpan.prev();
 }
 if (target) {
 target.blur(function () {
  SimpoValidate.validOne(target, validSpan);
 });
 }
 });
 },

 //验证全部,验证成功返回true
 valid: function () {
 var bl = true;

 $("span[class*='valid']").each(function () { //遍历span
 var validSpan = $(this);
 var to = validSpan.attr("to");
 var target;
 if (to) {
 target = $("input[name='" + to + "'],select[name='" + to + "'],textarea[name='" + to + "']");
 } else {
 target = validSpan.prev();
 }
 if (target) {
 if (!SimpoValidate.validOne(target, validSpan)) {
  bl = false;
 }
 }
 });

 return bl;
 },

 //单个验证,验证成功返回true
 validOne: function (target, validSpan) {
 SimpoValidate.removehilight(target, msg);

 var rule = SimpoValidate.getRule(validSpan);
 var msg = validSpan.attr("msg");
 var nullable = validSpan.attr("class").indexOf("nullable") == -1 ? false : true; //是否可为空
 var to = validSpan.attr("to");

 if (target) {
 //checkbox或radio
 if (target[0].tagName.toLowerCase() == "input" && target.attr("type") && (target.attr("type").toLowerCase() == "checkbox" || target.attr("type").toLowerCase() == "radio")) {
 var checkedInput = $("input[name='" + to + "']:checked");
 if (!nullable) {
  if (checkedInput.length == 0) {
  SimpoValidate.hilight(target, msg);
  return false;
  }
 }
 }

 //input或select
 if (target[0].tagName.toLowerCase() == "input" || target[0].tagName.toLowerCase() == "select") {
 var val = target.val();
 if (!nullable) {
  if ($.trim(val) == "") {
  SimpoValidate.hilight(target, msg);
  return false;
  }
 }
 else {
  if ($.trim(val) == "") {
  SimpoValidate.removehilight(target, msg);
  return true;
  }
 }

 if (rule) {
  var reg = new RegExp(rule);
  if (!reg.test(val)) {
  SimpoValidate.hilight(target, msg);
  return false;
  }
 }
 }
 else if (target[0].tagName.toLowerCase() == "textarea") {
 var val = target.text();
 if (!nullable) {
  if ($.trim(val) == "") {
  SimpoValidate.hilight(target, msg);
  return false;
  }
 }
 else {
  if ($.trim(val) == "") {
  SimpoValidate.removehilight(target, msg);
  return true;
  }
 }

 if (rule) {
  var reg = new RegExp(rule);
  if (!reg.test(val)) {
  SimpoValidate.hilight(target, msg);
  return false;
  }
 }
 }
 }

 return true;
 },

 //获取验证规则
 getRule: function (validSpan) {
 var rule = validSpan.attr("rule");
 switch ($.trim(rule)) {
 case "int":
 return this.rules.int;
 case "number":
 return this.rules.number;
 default:
 return rule;
 break;
 }
 },

 //红边框及错误提示
 hilight: function (target, msg) {
 target.addClass("failvalid");
 target.bind("mouseover", function (e) {
 SimpoValidate.tips(target, msg, e);
 });
 target.bind("mouseout", function () {
 SimpoValidate.removetips();
 });
 },

 //取消红边框及错误提示
 removehilight: function (target) {
 target.unbind("mouseover");
 target.unbind("mouseout");
 target.removeClass("failvalid");
 SimpoValidate.removetips();
 },

 //显示提示
 tips: function (target, text, e) {
 var divtipsstyle = "position: absolute; left: 0; top: 0; background-color: #dceaf2; padding: 3px; border: solid 1px #6dbde4; visibility: hidden; line-height:20px; ";
 $("body").append("<div class='div-tips' style='" + divtipsstyle + "'>" + text + "</div>");

 var divtips = $(".div-tips");
 divtips.css("visibility", "visible");

 var top = e.clientY + $(window).scrollTop() - divtips.height() - 18;
 var left = e.clientX;
 divtips.css("top", top);
 divtips.css("left", left);

 $(target).mousemove(function (e) {
 var top = e.clientY + $(window).scrollTop() - divtips.height() - 18;
 var left = e.clientX;
 divtips.css("top", top);
 divtips.css("left", left);
 });
 },

 //移除提示
 removetips: function () {
 $(".div-tips").remove();
 }
};

$(function () {
 SimpoValidate.init();
});

如何使用:

1、引用CSS和JS(必须引用jQuery):

<link type="text/css" href="~/Scripts/SimpoValidate.css" rel="stylesheet" />
<script type="text/javascript" src="~/Scripts/jquery-1.8.2.js"></script>
<script type="text/javascript" src="~/Scripts/ValidateUtil.js"></script>

2、表单HTML代码(部分代码):

<table class="table-test" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 100%;">
 <tr>
 <td>
 <input name="c" value="" type="text" />
 <span class="valid nullable" rule="int" msg="可为空,请填写正整数"></span>
 </td>
 </tr>
 <tr>
 <td>
 <input name="d" value="" type="text" />
 <span class="valid" rule="number" msg="必填,请填写数字"></span>
 </td>
 </tr>
 <tr>
 <td>
 <select>
 <option value="-1">==请选择==</option>
 <option value="1">是</option>
 <option value="2">否</option>
 </select>
 <span class="valid" rule="^(?!-1$).+$" msg="必选"></span>
 </td>
 </tr>
 <tr>
 <td>
 <input name="a" value="1" type="checkbox" />
 <span>多</span>
 <input name="a" value="2" type="checkbox" />
 <span>少</span>
 <span class="valid" rule="" msg="必选" to="a"></span>
 </td>
 </tr>
 <tr>
 <td>
 <input name="b" value="1" type="radio" />
 <span>狗</span>
 <input name="b" value="2" type="radio" />
 <span>猫</span>
 <span class="valid" rule="" msg="必选" to="b"></span>
 </td>
 </tr>
 <tr>
 <td>
 <textarea cols="20" rows="5" style="height: 50px; width: 300px;"></textarea>
 <span class="valid nullable" rule="^(.|\n){5,100}$" msg="可为空,长度必须大于等于5小于等于100"></span>
 </td>
 </tr>
</table>

3、执行验证JS代码:

//保存数据
function save() {
 if (SimpoValidate.valid()) { //执行验证
 $("#frm").submit(); //提交表单
 }
}

效果图:

拥有一个属于自己的javascript表单验证插件

以上就是作者自己动手编写的javascript表单验证插件,希望能够帮助到大家。

Javascript 相关文章推荐
javascript 一段左右两边随屏滚动的代码
Jun 18 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
Nov 22 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
window.print打印指定div实例代码
Dec 13 Javascript
利用js读取动态网站从服务器端返回的数据
Feb 10 Javascript
iframe调用父页面函数示例详解
Jul 17 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
js实现倒计时及时间对象
Nov 15 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
vue-cli中的webpack配置详解
Sep 25 Javascript
详解Javascript 中的 class、构造函数、工厂函数
Dec 20 Javascript
vue分页插件的使用方法
Dec 25 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
Mar 24 #Javascript
js+css实现select的美化效果
Mar 24 #Javascript
基于jQuery Ajax实现上传文件
Mar 24 #Javascript
Angular.js如何从PHP读取后台数据
Mar 24 #Javascript
JavaScript驾驭网页-获取网页元素
Mar 24 #Javascript
JavaScript驾驭网页-CSS与DOM
Mar 24 #Javascript
JavaScript驾驭网页-DOM
Mar 24 #Javascript
You might like
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
php生成mysql的数据字典
2016/07/07 PHP
Nginx实现反向代理
2017/09/20 Servers
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
JavaScript 函数的执行过程
2016/05/09 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
python实现批量获取指定文件夹下的所有文件的厂商信息
2014/09/28 Python
跟老齐学Python之for循环语句
2014/10/02 Python
python实现从字典中删除元素的方法
2015/05/04 Python
Python中取整的几种方法小结
2017/01/06 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python制作动态字符图的实例
2019/01/27 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
描述内存分配方式以及它们的区别
2016/10/15 面试题
世界经理人咨询有限公司面试
2014/09/23 面试题
C#面试常见问题
2013/02/25 面试题
管理科学大学生求职信
2013/11/13 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript