这段时间在公司一直做项目的同时,也学了下js,感觉有必要做一些什么东西出来。思来想去就做了最简单的一个验证插件。我很清楚这个东西市面上已经很多了,但我的目的也很清楚,检验我的学习成果。所以也就无所谓了。

因为我并没有看别人的插件是如何写的,所以对于插件里面的东西要遵循什么原则或是有什么潜在的规则至少目前是没有遵循的。先上代码吧。

; (function () {
//插件开始
$.fn.mwValidat = function () {
var $all_v = this.find("[data-validate]"); var $self = this;//保存当前jq对象 var haveNoError = true;;//没有错误
$all_v.each(function (index, item) {
var $target = $(item);
var validateFlag = $target.data("validate");
var cType = $target[0].localName;
var name = $target.attr("name");
var v = $target.val().trim();
var tipEl = "[data-validate-tip='" + name + "']";
//解析验证表达式
var res = JeamyValidate.InitStr(validateFlag);
//非空判断
if (res.express == "notnull") {
if (cType == "input" || cType == "textarea") {
var s = JeamyValidate.CheckNull(v);
$self.find(tipEl).html(s);
if (s) haveNoError = false;
}
//select 默认值处理
if (cType == "select") {
var s = JeamyValidate.IsDefualt(v, -1);
$self.find(tipEl).html(s);
if (s) haveNoError = false;
}
}
//长度判断
if (res.express == "strlen") {
var s = JeamyValidate.CheckLen(v, res.first, res.second);
$self.find(tipEl).html(s);
if (s) haveNoError = false;
}
//大小范围判断
if (res.express == "int") {
var s = JeamyValidate.CheckRang(v, res.first, res.second);
$self.find(tipEl).html(s);
if (s) haveNoError = false;
}
//正则验证
if (res.express == "strreg") { if (res.first == "email") {
var s = JeamyValidate.IsEmail(v);
$self.find(tipEl).html(s);
if (s) haveNoError = false;
}
if (res.first == "idcard") {
var s = JeamyValidate.IsIDCard(v);
$self.find(tipEl).html(s);
if (s) haveNoError = false;
}
if (res.first == "phone") {
var s = JeamyValidate.IsPhone(v);
$self.find(tipEl).html(s);
if (s) haveNoError = false;
}
} })
return haveNoError;
}; //定义一个链式调用验证的类
var Methods = function () { };
Methods.prototype.addMethod = function (fn_name, fn) {
this[fn_name] = fn;
return this;
} //实现验证类
var JeamyValidate = new Methods();
JeamyValidate.addMethod("CheckNull", function (value) {
if (value == null || value.trim() === "") {
return JeamyValidate_Info.Null;
}
return "";
}).addMethod("IsEmail", function (value) {
var re = /^\w+@\w+\.\w{2,3}/;
var r = value.match(re);
if (r == null)
return JeamyValidate_Info.Email;
return "";
}).addMethod("IsPhone", function (value) {
var re = /^(([0-9]+)-)?\d{7,11}$/;
var r = value.match(re);
if (r == null)
return JeamyValidate_Info.Phone;
return "";
}).addMethod("IsIDCard", function (value) {
var _re15 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/; // 15位
var _re18 = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/; // 18位
var r = value.match(_re15);
var r1 = value.match(_re18);
if (r == null && r1 == null)
return JeamyValidate_Info.IDCard;
return "";
}).addMethod("IsDefualt", function (value, defval) {
if (value == defval) {
return JeamyValidate_Info.DefaultErr;
}
return "";
}).addMethod("CheckLen", function (value, min, max) {
//字符串长度验证
if (value.length < min) {
return JeamyValidate_Info.StrShort;
}
if (value.length > max) {
return JeamyValidate_Info.StrLong;
}
return "";
}).addMethod("CheckRang", function (value, start, end) {
if (!value.match(/^\d+$/)) {
return JeamyValidate_Info.LegalInteger;
}
if (parseInt(value) < parseInt(start)) {
return JeamyValidate_Info.IntegerSmall;
}
if (parseInt(value) > parseInt(end)) {
return JeamyValidate_Info.IntegerBigger;
}
return "";
}).addMethod("InitStr", function (str) {
var splitArr = str.split(',');
if (splitArr.length == 1) {
splitArr[1] = "";
splitArr[2] = "";
}
if (splitArr.length == 2) {
splitArr[2] = "";
}
return {
express: splitArr[0],
first: splitArr[1],
second: splitArr[2]
}; }); //提示信息
var JeamyValidate_Info = {
Null: "<span style='color:red;font-size:12px;'>不能为空!<span>",
Email: "<span style='color:red;font-size:12px;'>电子邮件格式不正确!<span>",
Phone: "<span style='color:red;font-size:12px;'>不是合法的手机号码!<span>",
IDCard: "<span style='color:red;font-size:12px;'>不是合法的身份证号码!<span>",
DefaultErr: "<span style='color:red;font-size:12px;'>请选择!<span>",
StrShort: "<span style='color:red;font-size:12px;'>字符串长度太小!<span>",
StrLong: "<span style='color:red;font-size:12px;'>字符串太长!<span>",
IntegerSmall: "<span style='color:red;font-size:12px;'>数字太小!<span>",
IntegerBigger: "<span style='color:red;font-size:12px;'>数字太大!<span>",
LegalInteger: "<span style='color:red;font-size:12px;'>请输入合法数字!<span>",
}
})();

以上是插件代码。如何使用呢?

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="Scripts/jquery-1.8.3.min.js"></script>
<script src="Manage/Scripts/jeamy.validate-1.0.js?v=21"></script>
</head>
<body>
<div id="box">
<input data-validate="notnull" name="username" type="text" value="123" /><label data-validate-tip="username"></label>
<br/>
<input data-validate="notnull" type="text" name="password" value="" /><span data-validate-tip="password"></span> <br/>
<select data-validate="notnull" name="choose">
<option value="-1">请选择</option>
<option value="1">A</option>
<option value="2">B</option>
</select><label data-validate-tip="choose"></label> <br/>
<input data-validate="strlen,3,10" type="text" name="title" /><span data-validate-tip="title" ></span> <br/>
<input data-validate="strreg,email" type="text" name="email" /><span data-validate-tip="email"></span> <br/>
<input data-validate="strreg,phone" type="text" name="phone" /><span data-validate-tip="phone"></span> <br/>
<input data-validate="strreg,idcard" type="text" name="idcard" /><span data-validate-tip="idcard"></span> <br/>
<input data-validate="int,200,99999" type="text" name="money" /><span data-validate-tip="money"></span> <br/>
<input data-validate="int,200,99999" type="text" name="money1" /><span data-validate-tip="money1"></span> <br/>
<input data-validate="int,200,99999" type="text" name="money2" /><span data-validate-tip="money2"></span> <br/>
<input type="button" value="验证" onclick="validate()" /><br/>
</div> <script type="text/javascript">
function validate() {
console.log($('#box').mwValidat());
}
</script>
</body> </html>

这里需要解释下插件的支持:插件使用HTML5的新特性,寻找的是带有 data-validate的标签。标签的内容是需要验证的表达式。

如:

  <input data-validate="strlen,3,10" type="text" name="title" /><span data-validate-tip="title" ></span> 

此时 data-validate的值是 strlen,3,10 此时代表,需要验证 input输入的内容的字符串长度为 必须大于3 小于10 (注意这里没有等于,其实代码在上面,可以自己改的)。如果用户输入的内容与我们的规则不相符,则系统会返回一个string。此时这个string是在插件内部的,并没有返回出来。所以,插件用了一个 data-validate-tip 这个标签来表示需要显示的提示信息。而这个tip的值对应的就是 这个表单控件的name属性。

支持的验证模式
notnull   不为空验证
strlen,3,10 字符串长度验证,字符串长度必须大于3小于10
strreg,email 正则验证,后面的email代表,用email的正则去匹配输入
strreg,phone 正则验证,后面的phonel代表,用手机号的正则去匹配输入
strreg,idcard 正则验证,后面的idcard代表,用身份证(支持15和18位的身份证)的正则去匹配输入
int,200,99999 int范围验证,输入的值必须大于200,小于99999.具体使用可以自定义。

注:1、如果是select 标签加上notnul验证,则需要添加默认选择项-1,当select的value=-1 的时候,插件认为用户没有做出选择。

2、如果使用notnull以外的其他验证方式,插件会自动加上非空验证。

如何调用?

在上述HTML中只需要

$('#box').mwValidat();

即可调用,插件返回 true,false。如果全部的验证通过则返回true,否则为false。

上述HTML的使用效果如下:


最后:

这个插件还存在一些问题,或许还有一些BUG,但目前使用上来说够用了。但是,有个弊端就是,验证的提示不能根据业务来自定义。第二个版本,我会对这个问题进行解决。

mwValidate.js验证插件的更多相关文章

  1. jquery-validation.js验证插件使用详解

    jquery-validation 使用 一.用前必备 官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-validation/ API: ...

  2. validate.plugin.js 验证插件

    /*编写时间:2015-6-4*/ (function ($) { $.fn.isValidate = function (obj) { if ($(this).val()!="" ...

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

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

  4. JS表单验证插件(支持Ajax验证)

    自己编写了一个表单验证插件,支持ajax验证,使用起来很简单. 每个需要验证的表单元素下面有一个span标签,这个标签的class有一个valid表示需要验证,如果有nullable则表示可为空:ru ...

  5. 表单验证代码实例:jquery.validate.js表单验证插件

    jquery.validate.js是JQuery旗下的一个验证插件,借助JQuery的优势,我们可以迅速验证一些常见的输入,并且可以自己扩充自己的验证方法.使用前请先下载必要的JQuery插件:jq ...

  6. jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...

  7. jQuery Validate 表单验证插件----利用jquery.metadata.js将校验规则直接写在class属性里面并定义错误信息的提示

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.metadata.js 并把校验规则写在控件里面 ...

  8. Jquery.validate.js表单验证插件的使用

    作为一个网站web开发人员,以前居然不知道还有表单验证这样好呀的插件,还在一行行写表单验证,真是后悔没能早点知道他们的存在. 最近公司不忙,自己学习一些东西的时候,发现了validation的一个实例 ...

  9. jQuery插件 -- 表单验证插件jquery.validate.js, jquery.metadata.js

    原文地址:http://blog.csdn.net/zzq58157383/article/details/7718352   最常使用JavaScript的场合就是表单的验证,而jQuery作为一个 ...

随机推荐

  1. mysql 常用sql语句 一

    创建数据库 create database if not exists wsp_test default charset utf8 collate utf8_general_ci 使用数据库 use ...

  2. python 素因子分解

    在使用python解决问题之前,我们先说一下,什么是素因子分解 所谓素因子分解就是,先找这个数的所有约数(约数即:a%b == 0,也就是a可以被b整除) 例如:20的约数集合为 [1, 2, 5, ...

  3. Pseudo-devices On GNU/Linux

    先分享一则有意思Q&A,来自The FreeBSD Funnies 17.4 . Where does data written to* /dev/null* go? ​ It goes in ...

  4. WebUploader上传文件(一)

    写在前面: 文件上传方式很多的,对于大文件的上传,在本次项目中也有涉及,主要是用了分片断点上传大文件.所以就去了解了一下WebUploader,先从简单的上传文件开始吧~ 在代码中写注释,这样看的比较 ...

  5. Linux配置文件注释注意:行首注释,不要行中注释

    正确注释: # 注释语句 错误注释:这种注释可能导致文件读取异常或报错 有效语句 # 注释语句 # 注释语句

  6. OC学习6——面相对象的三大特性

    我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...

  7. UITextFiled的输入框改成一条下划线

    在一些程序的界面中,它们的编辑框是一条线,而UITextFiled本身并没有这种style,所有需要我们自己设置.方法还是挺多的 第一种 , (1).我们可以声明一个类继承与UITextFiled ( ...

  8. iOS cocos2d安装以及问题解决

    一:下载: 首先要去Cocos2d和Cocos2d-x网站下载相关的工具: 1.Cocos2d下载地址:http://www.cocos2d-iphone.org,然后进入Download页面,下边有 ...

  9. golang 如何验证struct字段的数据格式

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/125 假设我们有如下结构体: type User struct ...

  10. 线上平滑升级nginx1.12

    .下载相关包,需要和之前用到的依赖包保持一致 wget http://nginx.org/download/nginx-1.12.2.tar.gz wget https://bitbucket.org ...