之前讲了一部分揭秘系列的东西,由于年初的时候在改项目,也没有写下去。现在开始闲下来了,会继续写没写完的东西,各种原生js实现Jquery的功能。

转入正题,说一下今天要讲的东西。

相信很多tx在项目里面写过这样的js代码:

$("#..").click(function(){

var   val=$("#..").val();

if(!val)

{

alert('.......');

return    false;

}

if(!/...../.test(val))

{

alert('.......');

return    false;

}

............各种验证

});

有没有觉得每次写的都是重复的东西,并且看起来不是很优雅,验证完全是可以写通用的。

有的tx会说,我用的是Mvc的验证框架 ,只需要在后台代码的类的成员属性上面标记各种attribute,就能进行验证。这样确实是方便,但是不是很好控制。

我觉得以下代码的写法看起来更直观,优雅:

 var objtest = {
rules: {
col1: {
required: true,
max: 99,
min: 10,
reg: /^a/gi,
remote: 'test.ashx'
},
col2: {
required: true
}
},
msg: {
col1: {
required: 'col1必填',
max: '最大不能超过99',
min: '最小不能小于10',
reg: '必须以a开头'
},
col2: {
required: 'col2必填' }
} } $("#form").Validate(objtest);

没错,这就是 validate框架里面的验证写法。

讲到这个话题,你需要做一下功课,了解一下jquery.validate.js。我现在是要讲一下里面的实现原理:

代码里面我只写了四个基本的验证:是否必填,最大值,最小值,正则匹配。

这里我写一个简单的id选择器,同样是用$符号,看过我的博客的同学应该看到过。

  var $ = function () {
var arr = Array.prototype.slice.call(arguments);
return new $.prototype.Init(arr.length > ? arr[] : null);
}

下面继续扩展一些原型方法:

$.prototype = {
                Init: function (id) {
                    this.form = document.getElementById(id);
                    this.childs = this.form.childNodes;
                },
                Validate:function(){

这段代码单独拿出来。。。

}

}

Validate方法里面有个处理错误信息的div:

                   var that = this;
///移除错误提醒的div
var removeDiv = function () {
var getErrdiv = document.getElementById('errmsg');
if (getErrdiv) {
that.form.removeChild(getErrdiv);
}
}
///创建一个错误提醒的div
var creatDiv = function (msg, objset) {
var div = document.createElement('div');
div.style.backgroundColor = 'red';
div.id = 'errmsg';
div.innerHTML = msg;
that.form.appendChild(div);
}

然后就是   form   的onsubmit  事件:

                    this.form.onsubmit = function () {
var msg = "";
var checked = true;
removeDiv();
if (obj.rules) {
for (var i in obj.rules) {
var col = obj.rules[i];
///必填验证
if (col.required) {
for (var m = 0; m < that.childs.length; m++) {
if (that.childs[m].id == i && !that.childs[m].value) {
msg = obj.msg[i].required;
that.childs[m].focus();
creatDiv(msg);
return false;
}
} }
///最大值验证
if (col.max) {
for (var m = 0; m < that.childs.length; m++) {
if (that.childs[m].id == i && that.childs[m].value > col.max) {
msg = obj.msg[i].max;
creatDiv(msg);
that.childs[m].focus();
return false;
}
} }
///最小值验证
if (col.min) {
for (var m = 0; m < that.childs.length; m++) {
if (that.childs[m].id == i && that.childs[m].value < col.min) {
msg = obj.msg[i].min;
creatDiv(msg);
that.childs[m].focus();
return false;
}
} }
////正则匹配
if (col.reg) {
for (var m = 0; m < that.childs.length; m++) { if (that.childs[m].id == i && (!col.reg.test(that.childs[m].value))) { msg = obj.msg[i].reg;
creatDiv(msg); that.childs[m].focus(); return false;
}
}
} } }
return checked;
}

这里面其实是用对象的属性对应控件的id ,然后分别做验证,只是把逻辑放在一块集中做了处理。

完整代码   :

   var $ = function () {
var arr = Array.prototype.slice.call(arguments);
return new $.prototype.Init(arr.length > 0 ? arr[0] : null);
}
$.prototype = {
Init: function (id) {
this.form = document.getElementById(id);
this.childs = this.form.childNodes;
},
Validate: function (obj) {
var that = this;
///移除错误提醒的div
var removeDiv = function () {
var getErrdiv = document.getElementById('errmsg');
if (getErrdiv) {
that.form.removeChild(getErrdiv);
}
}
///创建一个错误提醒的div
var creatDiv = function (msg, objset) {
var div = document.createElement('div');
div.style.backgroundColor = 'red';
div.id = 'errmsg';
div.innerHTML = msg;
that.form.appendChild(div);
} this.form.onsubmit = function () {
var msg = "";
var checked = true;
removeDiv();
if (obj.rules) {
for (var i in obj.rules) {
var col = obj.rules[i];
///必填验证
if (col.required) {
for (var m = 0; m < that.childs.length; m++) {
if (that.childs[m].id == i && !that.childs[m].value) {
msg = obj.msg[i].required;
that.childs[m].focus();
creatDiv(msg);
return false;
}
} }
///最大值验证
if (col.max) {
for (var m = 0; m < that.childs.length; m++) {
if (that.childs[m].id == i && that.childs[m].value > col.max) {
msg = obj.msg[i].max;
creatDiv(msg);
that.childs[m].focus();
return false;
}
} }
///最小值验证
if (col.min) {
for (var m = 0; m < that.childs.length; m++) {
if (that.childs[m].id == i && that.childs[m].value < col.min) {
msg = obj.msg[i].min;
creatDiv(msg);
that.childs[m].focus();
return false;
}
} }
////正则匹配
if (col.reg) {
for (var m = 0; m < that.childs.length; m++) { if (that.childs[m].id == i && (!col.reg.test(that.childs[m].value))) { msg = obj.msg[i].reg;
creatDiv(msg); that.childs[m].focus(); return false;
}
}
} } }
return checked;
}
}
} $.prototype.Init.prototype = $.prototype;

代码看着没啥难度,比较简单 。

调用方法如下  :

  <form id="test">
<input id="col1" type="text" />
<input id="col2" type="text" />
<input id="Submit1" type="submit" value="submit" />
</form>
window.onload=function(){

  var objtest = {
rules: {
col1: {
required: true,
max: 99,
min: 10,
reg: /^a/gi,
remote: 'test.ashx'
},
col2: {
required: true }
},
msg: {
col1: {
required: 'col1必填',
max: '最大不能超过99',
min: '最小不能小于10',
reg: '必须以a开头'
},
col2: {
required: 'col2必填' }
} } $("test").Validate(objtest); }

代码可以继续优化,添加各种验证方法。这里只是抛砖引玉。有啥意见或者疑问可以联系:QQ546558309,或者留言。

下一节会讲ajax的原生js实现。

Jquery揭秘系列:Validation实现的更多相关文章

  1. Jquery揭秘系列:实现$.fn.extend 和$.extend函数

    前面我们扩展了bind方法和ready函数,这次我要讲一下$.fn.extend 和$.extend函数. 其他的不多说,直接切入主题吧! 先来看看这两个函数的区别: $.fn.extend是为查询的 ...

  2. Jquery揭秘系列:谈谈bind,one,live,delegate事件及实现

    在Jquery里面,我们用的最多的就是事件绑定了,事件绑定有多个函数.例如:bind,one,live,delegate等等. 我们先看看他们的定义,直接进入主题: bind( )方法用于将一个处理程 ...

  3. Jquery揭秘系列:实现 ready和bind事件

    讲这一节之前,先回顾之前的一篇<小谈Jquery>里面的代码: (function (win) { var _$ = function (selector, context) { retu ...

  4. Jquery揭秘系列:谈谈bind,one,live,delegate,on事件及实现

    在Jquery里面,我们用的最多的就是事件绑定了,事件绑定有多个函数.例如:bind,one,live,delegate,on等等. on() jQuery事件绑定.on()简要概述及应用 看源码发现 ...

  5. Jquery揭秘系列:ajax原生js实现

    讲到ajax这个东西,我们要知道两个对象XMLHTTPRequest和ActiveXObject ,提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求 ...

  6. 深入学习jQuery选择器系列第一篇——基础选择器和层级选择器

    × 目录 [1]id选择器 [2]元素选择器 [3]类选择器[4]通配选择器[5]群组选择器[6]后代选择器[7]兄弟选择器 前面的话 选择器是jQuery的根基,在jQuery中,对事件处理.遍历D ...

  7. 深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器

    × 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 本文是子元素选择器的续篇,主要介绍关于nth-of-type()选择器的内容.该部分内容并非没有出现在<锋利的 ...

  8. 【JQuery NoviceToNinja系列】目录

    [JQuery NoviceToNinja系列]目录 [JQuery NoviceToNinja系列]01 开篇 Html页面设计和布局

  9. 【原创】书本翻页效果booklet jquery插件系列之简介

    booklet jquery插件系列之简介 本文由五月雨恋提供,转载请注明出处. 一.安装 1.添加CSS和Javascript 添加booklet CSS文件到你的页面. <link rel= ...

随机推荐

  1. window对象的属性及事件。

    不同的运行环境有不同的“顶层对象”,而在浏览器的环境中,顶层对象就是window对象.window就是指当前的浏览器窗口. 例:var a = 1: window.a; //1 1.window对象的 ...

  2. 自定义ViewGroup须知

    自定义ViewGroup须知: 1.必须复写onMeasure和onLayout方法,根据容器的特性进行布局设计 2.复写onMeasure方法必须处理父布局设置宽或高为wrap_content情况下 ...

  3. CoreData数据库浅析

    Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...

  4. 原生JS 表单提交验证器

    转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...

  5. 我心中的MySQL DBA

    原文网址链接:http://wangwei007.blog.51cto.com/68019/1718311 MySQL是一个跨平台的开源关系型数据库管理系统,目前MySQL被广泛地应用在Interne ...

  6. Neo4j图数据库管理系统开发笔记之一:Neo4j Java 工具包

    1 应用开发概述 基于数据传输效率以及接口自定义等特殊性需求,我们暂时放弃使用Neo4j服务器版本,而是在Neo4j嵌入式版本的基础上进行一些封装性的开发.封装的重点,是解决Neo4j嵌入式版本Emb ...

  7. mysql-Federated存储方式,远程表,相当于sql server的linked server

    MySQL中针对不同的功能需求提供了不同的存储引擎.所谓的存储引擎也就是MySQL下特定接口的具体实现. FEDERATED是其中一个专门针对远程数据库的实现.一般情况下在本地数据库中建表会在数据库目 ...

  8. hive建表与数据的导入导出

    建表: create EXTERNAL table tabtext(IMSI string,MDN string,MEID string,NAI string,DestinationIP string ...

  9. mysqldump 备份命令使用中的一些经验总结

    mysqldump的一个小坑(自测) 正文:经常使用接触mysql复制功能的朋友应该对mysqldump命令不陌生吧,鄙人最近也在研究学习这一块的内容,经过几天的测试,发现mysqldump使用中容易 ...

  10. C语言调用curl库抓取网页图片

    思路是先用curl抓取网页源码,然后以关键字寻找出图片网址.   #include <stdio.h> #include <stdlib.h> #include <str ...