大家好,第一次写有点正规的博客,以前都是随手复制几下。为了打LOL,我写快点,代码我都复制在最下面了,并且写了大量的注释。

首先我写jquery插件,喜欢这么写(好处有很多,以后在讲,哈哈,看过jQuery源码应该知道):  

(function(root,factory,plug,undefined){

  factory(root.jQuery,plug)

})(window,function($,plug){

  /*

  在这里写逻辑

  一:默认的参数 var __dEFAULTS__,

  二:规则(可根据业务需求自己配置) var __RULES__,

  三:原型 var __PROTOTYPE__,

    _init: 初始化DOM结构,没什么将的,

    _attachEvent: 自定义的事件的机制(其实就是用了jquery的trigger)

    _bind: 首先是事件功能的绑定,为每一个input都绑定事件,each循环__RULES__(就是规则),找到所以自定义data的值(也就是每一个input中所需要的规则校验),用if来判断,当前的input中配置了几个data属性,并且通过 rule.call(_$field)(这句话的意思就是调用rule函数的时候,rule函数里的this引用变成了_$field),把input中的rule规则判断一下。如果为false,那么就在input的父元素下面添加一个p标签,那么怎么让p标签中的内容让用户来配置呢?<p class='message'>"+(_$field.data(key+"-message")||_$this.errorMessage)+"</p>,这其中的意思是如果错了,那么就不往下检索rule了,直接return result(因为rule返回为false,所以这里的result也为false),来阻止。并且添加p标签,并且根据result的值来判断input的父元素,来个父元素加上一个success或error。最后还有submit方法:这个方法是用来通过input父元素的class中有没有error,来判断触发哪一个自定义事件

  四:$.fn[plug]

    一:首先判断当前元素是否是from标签,不是的话,throw一个错误

    二:$.extend(this,__dEFAULTS__,options,__PROTOTYPE__);  (....貌似有同学面试死在这个上面了,有空讲一下吧)

    三:this._init(); this._bind(); return this;

  五:根据业务需求,用户自定义添加rule:就是如下添加一个方法,就可以了,(下次有时间还是讲一下extend吧)  

  $.fn[plug].extendRules = function(news){
    $.extend(__RULES__,news);
  }

  六:ajax

function login(){
var username = $('#username').val(),password = $('#password').val();
var data = { "uname": username, "upwd":password};
$.ajax({
url:'/login',
type:'POST',
data:data,
success:function(data,status){
if(status == 'success'){
location.href='home';
}
},
error:function(data,status){
if(status == "error"){
location.href='login'
}
}
});
}

JS:

;(function(root,factory,plug,undefined){
factory(root.jQuery,plug);
})(window,function($,plug){
//默认参数
var __dEFAULTS__ = {
triggerEvent : "keyup",
errorMessage : "You entered a wrong"
};
/*
require(需求) 必填项
regex(正则表达式)正则验证
length 长度验证
minlength 最短的长度
maxlength 最长的长度
between 两者之间的长度
equalto 和xxx相同
greaterThan 大于
lessThan 小于
middle 两者之间的数字
integer 整数
number 必须是数字
email 邮箱地址
mobile 电话号码
phone 手机号码
uri 有效的统一资源标识符
cardId 身份证号码
bankId 银行卡号码
....其他的规则(根据业务规则来)
*/
var __RULES__ = {
require : function(){
return this.val()!="";
}, //(需求) 必填项
regex : function(){
return new RegExp(this.data("regex")).test(this.val());
},//(正则表达式)正则验证
length : function(){
return this.val().length == Number(this.data("length"));
}, // 长度验证
minlength : function(){
return this.val().length >= Number(this.data("minlength"));
}, // 最短的长度
maxlength : function(){
return this.val().length <= Number(this.data("maxlength"));
}, // 最长的长度
between : function(){
var length = this.val().length;
var between = this.data("between").split("-");
return length >= Number(between[0]) && length <= Number(between[1]);
}, // 两者之间的长度
equalto : function(){
if($(this.data("equalto")).val() === this.val()){
$(this.data("equalto")).parent(".mf-line").removeClass('error').addClass('success').next("p").remove();
return true;
}
return false;
}, // 和xxx相同
greaterthan : function(){
return this.val() > Number(this.data("greaterthan"));
}, // 大于
lessthan : function(){
return this.val() < Number(this.data("lessthan"));
}, // 小于
middle : function(){
var length = this.val();
var middle = this.data("middle").split("-");
return length >= Number(middle[0]) && length <= Number(middle[1]);
}, // 两者之间的数字
integer : function(){
return /^\-?[0-9]*[1-9][0-9]*$/.test(this.val());
}, // 整数
number : function(){
return !isNaN(Number(this.val()));
}, // 必须是数字
email : function(){
return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(this.val());
}, // 邮箱地址
mobile : function(){
return /^1\d{10}$/.test(this.val());
}, // 电话号码
phone : function(){
return /^\d{4}\-\d{8}$/.test(this.val());
}, // 手机号码
uri : function(){
return /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/g.test(this.val());
}, // 有效的统一资源标识符
amount : function(){ //金额
if(!this.val())return true;
return /^([1-9][\d]{0,}|0)(\.[\d]{1,2})?$/.test(this.val());
}
};
var __PROTOTYPE__ = {
//初始化dom结构
_init : function(){
this.$fields = this.find(".mf-line .mf-txt:visible"); //选择可见的input(过滤掉display: none)
},
//自定义事件的触发机制
_attachEvent : function(event, args){
this.trigger(event, args);
},
//事件
_bind : function(){
var _$this = this;
//事件功能绑定
this.$fields.on(this.triggerEvent, function(){
var _$field = $(this); //需要验证的表单
var $group = _$field.parents(".mf-line"); //拿到input的div
var result = true;
$group.next("p").remove();
$.each(__RULES__,function(key,rule){
if(_$field.data(key)){
result = rule.call(_$field);
(!result)&&$group.after("<p class='message'>"+(_$field.data(key+"-message")||_$this.errorMessage)+"</p>");
return result;
}
})
$group.removeClass('error success').addClass(result?'success':'error');
})
this.on("submit", function(){
var $groups = _$this.$fields.trigger(_$this.triggerEvent).parents(".mf-line");
if($groups.filter(".error").length > 0){
_$this._attachEvent("error",{});
}else{
_$this._attachEvent("success",{});
}
return false;
})
}
}
$.fn[plug] = function(options){
//判断this是否是form标签
if(!this.is("form")){
throw new Error("the trgger is not form tag");
}
$.fn.extend(this,__dEFAULTS__,options,__PROTOTYPE__);
this._init();
this._bind();
return this;
}
$.fn[plug].extendRules = function(news){
$.extend(__RULES__,news);
}
},"validator");

//这是调用插件的js

$(function(){
$.fn.validator.extendRules({
cardid : function(){
return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(this.val());
}
})
$(".member-forms").validator({
triggerEvent : "blur"
})
.on("error", function(event, $errFiles){
return false;
})
.on("success", function(event){
this.submit();
return false;
});
});

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>validata</title>
<link rel="stylesheet" type="text/css" href="css/validata.css" />
</head>
<body>
<div class="wrapper mt30">
<form action="##" class="member-forms" method="get">
<div class="mf-head rel tc">
<span class="f24">用户登录</span>
</div>
<div class="mf-line">
<span class="mf-name">帐号:</span>
<input type="text" class="mf-txt" id="username" placeholder="请输入用户名/手机号"
data-require="true"
data-require-message="用户名必须填写"
data-regex="^\w+$"
data-regex-message="用户应该是由字母数字下划线所组成"
data-between="6-12"
data-between-message="用户名长度必须是在6-12位字符之间"
/>
</div>
<div class="mf-line">
<span class="mf-name">密码:</span>
<input type="password" class="mf-txt" id="password" placeholder="请输入密码"
data-require="true"
data-require-message="密码必须填写"
data-regex="^[a-zA-Z0-9]+$"
data-regex-message="密码应该是由字母数组所组成"
data-minlength="8"
data-minlength-message="密码长度最少8位"
data-maxlength="12"
data-maxlength-message="密码长度最多12位"
/>
</div>
<input type="submit" class="mf-btn mt30" id="loginBtn"/>
</form>
</div>
<script type="text/javascript" src="../jquery-2.2.4.js"></script>
<script type="text/javascript" src="plug_in/validata.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>

CSS:

body,html{
width: 100%;
height: 100%;
font-family: "Microsoft yahei";
}
*{
margin: 0;
padding: 0;
}
.tc{
text-align: center;
}
.f24{
font-size: 24px;
}
.rel{
position: relative;
}
.wrapper{
max-width: 1186px;
}
.mt30{
margin-top: 30px;
}
.member-forms{

max-width: 400px;
margin: 20px auto;
padding: 0 10px;
background-color: #fff;
}
.member-forms .mf-line{
margin-top: 30px;
border: 1px solid #ddd;
line-height: 52px;
position: relative;
padding-left: 110px;
border-radius: 4px;
}
.member-forms .mf-line.error{
border: 1px solid #a94442;
}
.member-forms .mf-line.success{
border: 1px solid #3c763d;
}
.member-forms .mf-line .mf-name{
position: absolute;
left: 0;
right: 0;
text-align: center;
width: 110px;
}
.member-forms .mf-line .mf-txt{
display: block;
height: 50px;
width: 96%;
border: 0px;
padding: 0 2%;
}
.member-forms .message{
width: 400px;
font-size: 12px;
color: red;
}
.member-forms .mf-btn{
height: 52px;
line-height: 52px;
color: #fff;
background-color: #5ba0e5;
width: 100%;
text-align: center;
cursor: pointer;
font-size: 18px;
border: 0px;
}

jQuery validata插件实现(每周一插件系列)的更多相关文章

  1. 自己写jquery插件之模版插件高级篇(一)

    需求场景 最近项目改版中,发现很多地方有这样一个操作(见下图gif动画演示),很多地方都有用到.这里不讨论它的用户体验怎么样. 仅仅是从复用的角度,如果每个页面都去写text和select元素,两个b ...

  2. 轻量级jQuery语法高亮代码高亮插件jQuery Litelighter。

    <!DOCTYPE html><html><head><meta charset="UTF-8" /><title>jQ ...

  3. 20款jQuery 的音频和视频插件

    分享 20 款jQuery的音频和视频插件 Blueimp Gallery: DEMO || DOWNLOAD Blueimp gallery 主要为移动设备而设计,同时也支持桌面浏览器.可定制视频和 ...

  4. PgwSlideshow-基于Jquery的图片轮播插件

    0 PgwSlideshow简介 PgwSlideshow是一款基于Jquery的图片轮播插件,基本布局分为上下结构,上方为大图轮播区域,用户可自定义图片轮播切换的间隔时间,也可以通过单击左右方向按键 ...

  5. jQuery模仿人类打字效果插件typetype

    typetype是一款模仿人类打字效果的jQuery插件,typetype非常轻巧,文件不到2K,gzipped压缩后只有578字节,但模仿的效果非常逼真,一字一字的顿出和回删效果,让人惊叹不止,喜欢 ...

  6. jQuery插件之Cookie插件使用方法~

    一.介绍 1-1.jQuery.Cookie.js插件是一个轻量级的Cookie管理插件.下载地址:jQuery-cookie.js  有需要的朋友,右键另存为即可! 二.使用方法 2-1.引入jQu ...

  7. 推荐20款基于 jQuery & CSS 的文本效果插件

    jQuery 和 CSS 可以说是设计和开发行业的一次革命.这一切如此简单,快捷的一站式服务.jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力,要感谢那些优秀的 jQue ...

  8. jQuery超酷下拉插件6种效果演示

    原始的下拉框很丑啦, 给大家一款jQuery超酷下拉插件6种效果 效果预览 下载地址 实例代码 <div class="container"> <section ...

  9. 12款响应式的 jQuery 旋转木马(传送带)插件

    在企业网站,作品集网站,电子商务网站或任何其他类型的网站内容显示图片可以使用 jQuery 旋转木马(传送带)插件来实现. jQuery 旋转木马插件允许开发人员以水平或垂直的方式显示内容,视频和图像 ...

  10. 赞!带进度条的 jQuery 文件拖放上传插件

    jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果.作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 H ...

随机推荐

  1. 超市RFID结算系统项目进度与总结

    超市RFID结算系统项目进度与总结 超市RFID结算系统本周末(明天演示),目前进度如下: 一.后台PHP端已经完成了大部分的工作,包括以下: 1.数据库的建立(目前只包括用户表.商品信息表.购物车表 ...

  2. android studio 更新失败解决办法

    在andriod studio目录下找到studio.exe.vmoptions这个文件,用记事本打开,在后面加上 -Djava.net.preferIPv4Stack=true -Didea.upd ...

  3. Round Numbers(poj 3252)

    题意:算出区间内二进制中0的个数大于等于1的个数的数字有多少个 /* 本来以为用数位DP搞,但是组合数更简单. 我们设n的二进制长度为len. ①:先考虑长度小于len的数字. 这里以数字22为例,二 ...

  4. reg 正则

    //转化为camel形式 var text = 'border-color-base'; text.replace(/-(\w{1})/g, function (match, chr1) { retu ...

  5. iPhone的刷机 iPhone进UDF

    首先是进入udf出现问题.. 要点是 黑屏后按电源键到屏幕亮了+HOME键再一直按 按到黑屏 4秒左右后 放开HOME键 再按大概7秒就是udf界面了 不是界面~全黑的.你可以电源键是开不了机的. 然 ...

  6. HNU 13074 Goldbach’s Conjecture 解题报告

    题目大意:输入一个偶数(x<32000),输出这个偶数是由哪两个素数相加所得. 比如:一个偶数26,它可以是3+23,7+19,13+13,这些素数相加所得. 输入输出样例: Sample In ...

  7. Aptana插件安装、配置

    本文讲解在线安装的方式: 1.eclipse->help->Install New SoftWare... 在弹出的对话框Work with中填入[http://download.apta ...

  8. 阿里CEO张勇公开信:把眼光从股市回到客户身上

     8月25日消息,面对全球资本市场的剧烈波动,阿里巴巴集团CEO张勇今日发表致员工信,倡议全体阿里员工把眼光从股市回到客户身上,脚踏实地的服务帮助客户,为客户创造价值,继而为股东和自己创造价值.  张 ...

  9. JS 禁止刷新和右键

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. ImageView及其子类(一)

    ImageView继承自View组件,它的主要功能是用于显示图片——实际上这个书法不太严谨因为他能显示的不仅是图片,任何Drawable对象都可以使用ImageView来显示.除此之外,ImageVi ...