将表单验证的通用部分提炼出来,做成一个简易插件,方便调用。

已将源码放到GitHub上,名字叫zValidate

手机可扫描下图查看示例,PC端可点击此处查看

一、原理

1)需要引入zepto.js库,便于DOM操作。

2)将验证规则作为控件的一个属性,写在控件的html中,有点MVVM模式的味道。

3)将控件包在form中,点击submit按钮,将有name或id的控件组成一个数组,分别验证对应的规则,最终执行自定义的submit方法。

4)默认写了一套错误样式zValidate.css,但其实可以不使用样式,例如弹框显示错误。可在errorPlacement中定义相应方法。

5)默认的验证方法有required、email、url、date等,可通过方法addMethod自定义扩展。

下图是一个普通的表单结构:

二、使用方法

1)载入zValidate

引入CSS文件和zepto库文件,还有zValidate类文件,这里说明一下 zValidate.css仅仅是表单和控件的样式,完全可以自定义。

<!--zValidate.css可自定义-->
<link rel="stylesheet" href="styles/zValidate.css" />
<script src="scripts/zepto/zepto.js"></script>
<script src="scripts/zValidate.js"></script>

2)初始化一个zValidate

$('.validate').zValidate();

3)zValidate演示中的表单结构

控件是由fieldset包裹的,input输入框使用了form-control样式类,一个form表单在最外面,里面有个submit按钮。

这个结构只是参考,具体情况可自定义。

<form id="validate3" method="post">
<div class="form-horizontal">
<fieldset class="form-group">
<div class="controls">
<input class="form-control" type="text" name="xxx"/>
</div>
</fieldset>
<fieldset>
<button type="submit">提交</button>
</fieldset>
</div>
</form>

4)选项配置

详细的选项配置可以参考此处说明。或参考下图:

三、内部分析

1)init

1. form表单中必须有submit提交按钮,在init方法中将定义form表单的提交事件。

2. 在form的提交事件中,先验证控件的规则。

3. 验证通过,才会执行自定义的submit方法。

4. return false是为了阻止页面刷新。

me.$currentForm.submit(function() {
var result = me.check($elements); //检查规则
if (result !== false) {
me.options.submit.call(me, me.$currentForm, result); //执行自定义事件
}
return false;
});

2)elements

获取当前form表单中的标签,可以根据实际情况做调整,有些事件可能readonlydisabled的控件也需要提交上去。

this.$currentForm
.find("input, select, textarea")
.not("[type=submit], [type=reset], image, [disabled], [readonly], button");

3)elementValue

1. 获取控件的值,控件可能是radio、checkbox或普通的输入框,提取方式不同,所以封装了一层。

2. 先通过checkable判断是checkbox 或者 radio,再通过checked方法获取单选框与多选框选中的值。

3. number类型的输入框要特殊处理。

4. 剩下的普通输入框或下拉框就直接用val()提取。

var type = $element[0].type;
if(zValidate.checkable($element)) {//判断是check or radio
return this.checked($element.attr("name"), $element[0].type.toLowerCase());
}else if(type === "number" && typeof $element[0].validity !== "undefined") {
return $element[0].validity.badInput ? false : $element.val();
}
var val = $element.val();
return val.replace(/\r/g, "");//将换行去除

4)deserializeValue

将值类型转换,"true"  => true , "null"  => null等。

规则内容被放置在控件的一个属性中,取出来的时候是一个字符串,而更多的时候需要特定的类型,例如Boolean、Number等。

/**
* 将值类型转换
* "true" => true "false" => false "null" => null "42" => 42
* "42.5" => 42.5 "08" => "08" JSON => parse if valid String => self
*/
zValidate.deserializeValue = function(value) {
try {
return value
? value == "true" ||
(value == "false"
? false
: value == "null"
? null
: +value + "" == value
? +value
: /^[\[\{]/.test(value) ? $.parseJSON(value) : value)
: value;
} catch (e) {
return value;
}
};

5)check

1. 此控件的核心方法,规则的验证就是在这里操作。

2. 从上面elementValue方法中提取控件的值,

3. 将data-*开头的属性提取出来,再遍历这些属性,根据属性值找到相应的规则(规则内容需要deserializeValue序列化),最后调用规则方法。

4. 如果验证错误,就要提取错误信息,并展示出来,默认是高亮,但可以做成弹框等。

$.each($elements, function(index, input) {
var $input = $(input);
var name = $input.attr("name") || $input.attr("id");
if (isError || name == "") {
return;
}
var datas = $input[0].dataset; //获取data-*开头的属性
var val = me.elementValue($input); //获取value
params[name] = val; //设置要传递的值
$.each(datas, function(key, rule) {
if (isError) return isError;
rule = zValidate.deserializeValue($.trim(rule)); //格式化类型
if ($.inArray(key, me.rules) >= 0) {
if (rule === false || rule === null || rule === undefined) return;
var success = me.methods[key].call(me, val, $input, rule);
if (!success) {
isError = true;
message = $input.data(key + "Message"); //错误提示
me.options.highlight.call(me, $input); //高亮
me.showLabel(name, $input, message); //显示错误信息
}
}
});
});

6)methods

默认给出的几个验证方法。规则大部分是用正则书写,也有简单的比较方式。正则如果不熟悉可以参考《正则表达式系列》。

required: function(value, $element, param) {//必填
return value.length > 0 || false;
},
number: function(value, $element, param) {//合法的数字(负数,小数)
return this.optional($element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
},

7)addMethod

自定义验证规则,可以传入验证名和验证方法。验证方法可以传三个参数:

1. val:控件的值
2. $input:控件对象
3. rule:规则内容

使用方法可以参考下面的代码:

//自定义验证规则
validate.addMethod('mobile', function(val, $input, rule) {
return ConstCommand.regex.mobile.test(val);
});

移动端H5通用表单验证插件的更多相关文章

  1. 表单验证插件 - formValidator

    表单验证插件 - formValidator * 引入formValidator插件文件 * 引入formValidator插件的主文件 * 引入formValidator插件的正则有关文件 * 引入 ...

  2. 表单验证插件--formvalidation

    表单验证是一个非常基础的功能,当你的表单项少的时候,可以自己写验证,但是当你的表单有很多的时候,就需要一些验证的插件.今天介绍一款很好用的表单验证插件,formvalidation.其前身叫做boot ...

  3. jquery validate强大的jquery表单验证插件

    jquery validate的官方演示和文档地址: 官方网站:http://jqueryvalidation.org/ 官方演示:http://jqueryvalidation.org/files/ ...

  4. 10个强大的Javascript表单验证插件推荐

    创建一个JavaScript表单验证插件,可以说是一个繁琐的过程,涉及到初期设计.开发与测试等等环节.实际上一个优秀的程序员不仅是技术高手,也应该是善假于外物的.本文介绍了10个不错的JavaScri ...

  5. nice-validator表单验证插件的简单使用

    前言 前端表单校验是过滤无效数据.假数据.有毒数据的第一步,是数据安全的第一道关卡,虽然我们不能100%相信客户端提交的数据(真正的校验还得在服务端进行),但设置前端表单校验也是至关重要的,自己写逻辑 ...

  6. nice-validator表单验证插件

    nice-validator表单验证插件的简单使用 前言 前端表单校验是过滤无效数据.假数据.有毒数据的第一步,是数据安全的第一道关卡,虽然我们不能100%相信客户端提交的数据(真正的校验还得在服务端 ...

  7. 表单验证插件jquery-validation以及案例

    表单验证插件jquery-validation以及案例 1,获取并引入: (1)获取:官网:https://jqueryvalidation.org/ [home]->[files]->[ ...

  8. jquery validate表单验证插件-推荐

    1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家.     1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素  3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...

  9. 表单验证插件之jquery.validate.js

    提到表单验证的插件,第一个想到的就是jquery.validate.js,所以小生想在这里稍微详细地说一下这款插件的具体使用方法,便于理解,我直接附上整段demo的代码(没怎么调样式,主要是看js): ...

随机推荐

  1. 【PAT_Basic日记】1001. 害死人不偿命的(3n+1)猜想

    还是觉得代码放这靠谱,会定期的看看和优化代码 #include <stdio.h> #include <stdlib.h> int main() { int n; int co ...

  2. MySQL最常用字符串函数

    字符串函数 是最常用的的一种函数,在一个具体应用中通常会综合几个甚至几类函数来实现相应的应用: 1.LOWER(column|str):将字符串参数值转换为全小写字母后返回 mysql> sel ...

  3. java复习(2)---java基础杂记

    java命名规范: 参考:http://www.cnblogs.com/maowang1991/archive/2013/06/29/3162366.html 1.项目名小写 2.包名小写 3.类名每 ...

  4. Linux - atexit()(注册终止)函数

    进程终⽌的⽅式有8种,前5种为正常终⽌,后三种为异常终⽌: 1. 从main函数返回: 2 .调⽤exit函数:3 .调⽤_exit或_Exit:4 .最后⼀个线程从启动例程返回:5 .最后⼀个线程调 ...

  5. 以防忘记,建立stm32工程的过程

    然后会弹出manage run -time environment的运行环境界面,必须选择的有CMSIS下的core和device下的startup,至于其它的根据你需要的外设, 在stdperiph ...

  6. Python中使用Mysql(安装篇)

    准备工作 import MySQLdb Linux系统自带了Python,但并不是都有这个包,至少我每次拿到一台全新的服务器时候,都发现没有装这个包. 这个东西的下载地址是 http://source ...

  7. 分布式开放消息系统(RocketMQ)的原理与实践(转)

    转自:http://www.jianshu.com/p/453c6e7ff81c 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回 ...

  8. Java设计模式随笔

    大家都知道Java23种设计模式,大神总结如下: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  9. 谈谈一些有趣的CSS题目(十七)-- 不可思议的颜色混合模式 mix-blend-mode

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  10. 简单五子棋,没有电脑AI

    刚学了C#委托,做了个五子棋练习,把前台绘制和后台逻辑分开,前台绘制方法用委托传给后台逻辑. 界面好简单... 先看类图 控制类控制整个游戏的逻辑,包括调用棋盘类的属性初始化棋盘.初始化两个棋手.轮流 ...