jQuery 表单验证扩展代码(二)


Posted in Javascript onOctober 20, 2010

一. 存在的问题
在上篇中我已经提到过,验证提示打算用文本和样式两种方式来显示提示消息,这两种提示都只能单独使用,于是新的跟新内容做了一些扩展,使得两者可以共用。前一篇写的是否必填项这个验证只是正对 Text, TextArea 这两个表单元素,在新的扩展中同时也支持了radio,checkbox 两个元素。

二. 验证参数的设计
基于多重选择的考虑,扩展了一些有必要的参数,参数列表如下:
required: 是否为必填项,true 和 false ,true 表示为必填项 (*)
onFocusText: 获得焦点的文字提示
onFocusClass: 获得焦点之后的样式
onErrorText: 验证错误的文本提示
onErrorClass: 验证错误的样式提示
onSuccessText: 验证成功文本提示
onSuccessClass: 验证成功的样式提示
targetId: 提示信息元素的id号

相比之前的做了一些修改,看过之前的文章会知道,我将样式和文本单独分离了,之前是混合在一起的。这也是作为扩展需要的一步考虑。然后变更了错误消息提示参数的名称。

三. 源码解析
jQuery 表单验证扩展之验证是否为必填项源码

$.fn.extend({ 
checkRequired:function(inputArg){ 
//只有必填项才去验证,非必填项无意义 
if(inputArg.required){ 
//验证是否是输入框表单 
if($(this).is("input") || $(this).is("textarea")){ 
//获得焦点提示 
$(this).bind("focus",function(){ 
//如果文本存在则不替换提示样式 
if ($(this).val() != undefined && $(this).val() != "") { 
//显示正确信息文本 
addText(inputArg.targetId,inputArg.onSuccessText); 
//切换样式 
addClass(inputArg.targetId,inputArg.onSuccessClass); 
}else{ 
//显示获得焦点文本 
addText(inputArg.targetId,inputArg.onFocusText); 
//切换样式 
addClass(inputArg.targetId,inputArg.onFocusClass); 
} 
}); 
//失去焦点提示 
$(this).bind("blur",function(){ 
if($(this).attr("type")=="radio" || $(this).attr("type")=="checkbox"){ 
var name=$(this).attr("name"); 
var items=$('input[@name=""+name+""][checked]'); 
if(items.length>0){ 
addMessage(true,inputArg); 
}else{ 
addMessage(false,inputArg); 
} 
}else{ 
if($(this).val()!=undefined && $(this).val()!=""){ 
addMessage(true,inputArg); 
}else{ 
addMessage(false,inputArg); 
} 
} 
}); 
} 
} 
} 
}); 
/** 
* 根据输入框的不同类型来判断 
* @param {Object} flag 
* @param {Object} inputArg 
*/ 
function addMessage(flag,inputArg){ 
if(flag){ 
//显示正确信息文本 
addText(inputArg.targetId,inputArg.onSuccessText); 
//切换样式 
addClass(inputArg.targetId,inputArg.onSuccessClass); 
}else{ 
//显示错误信息文本 
addText(inputArg.targetId,inputArg.onErrorText); 
//切换样式 
addClass(inputArg.targetId,inputArg.onErrorClass); 
} 
} 
/** 
* 给目标控件添加显示的文本信息 
* @param {Object} targetId 目标控件id 
* @param {Object} text 需要显示的文本信息 
*/ 
function addText(targetId,text){ 
if(text==undefined){ 
text=""; 
} 
$("#"+targetId).html("        "+text); 
} 
/** 
* 切换样式 
* @param {Object} targetId 目标控件id 
* @param {Object} className 显示的样式名称 
*/ 
function addClass(targetId,className){ 
if(className!=undefined && className!=""){ 
$("#"+targetId).removeClass(); 
$("#"+targetId).addClass(className); 
} 
}

用过jQuery 的都知道,jQuery是一个非常易于扩展的框架,它里面提供了扩展核心库的函数。本表单验证都是基于这个扩展函数来延伸的。
这里还考虑到了一些代码复用性的问题,将共同代码分离,这使得最终的代码大大减少了。
jQuery 表单验证扩展 必填项共同方法提取
/** 
* 根据输入框的不同类型来判断 
* @param {Object} flag 
* @param {Object} inputArg 
*/ 
function addMessage(flag,inputArg){ 
if(flag){ 
//显示正确信息文本 
addText(inputArg.targetId,inputArg.onSuccessText); 
//切换样式 
addClass(inputArg.targetId,inputArg.onSuccessClass); 
}else{ 
//显示错误信息文本 
addText(inputArg.targetId,inputArg.onErrorText); 
//切换样式 
addClass(inputArg.targetId,inputArg.onErrorClass); 
} 
} 
/** 
* 给目标控件添加显示的文本信息 
* @param {Object} targetId 目标控件id 
* @param {Object} text 需要显示的文本信息 
*/ 
function addText(targetId,text){ 
if(text==undefined){ 
text=""; 
} 
$("#"+targetId).html("        "+text); 
} 
/** 
* 切换样式 
* @param {Object} targetId 目标控件id 
* @param {Object} className 显示的样式名称 
*/ 
function addClass(targetId,className){ 
if(className!=undefined && className!=""){ 
$("#"+targetId).removeClass(); 
$("#"+targetId).addClass(className); 
} 
} 
/code] 
每次不同的验证都会涉及到 添加文本消息,表单元素的不同添加文本消息,和样式的替换,于是分离出来上面三个公用方法。 
在源码中 if($(this).attr("type")=="radio" || $(this).attr("type")=="checkbox") 这句是比较重要的一句,因为它涉及到了验证元素的扩展。 四. 使用例子 

文本框测试样图
 输入文本框获得焦点提示
 输入文本框失去焦点错误提示
 输入文本验证正确提示
 
radio 测试样图
  
checkbox 测试样图
  checkbox 验证失败提示
 checkbox 验证成功提示
测试代码 
[code] 
<script language="JavaScript" src="jquery-1.3.2.min.js" type="text/javascript"></script> 
<script language="JavaScript" src="jquery-extend-1.0.0.js" type="text/javascript"></script> 
<script language="JavaScript" type="text/javascript"> 
$(document).ready(function(){ 
$("#txtName").checkRequired({ 
required:true, 
onFocusText:"必填项", 
onFocusClass:"notice", 
onErrorText:"错误提示", 
onErrorClass:"error", 
onSuccessClass:"correct", 
targetId:"txtNameTip" 
}); 
$("#rdbMan").checkRequired({ 
required:true, 
onFocusText:"必填项", 
onFocusClass:"notice", 
onErrorText:"错误提示", 
onErrorClass:"error", 
onSuccessClass:"correct", 
targetId:"txtSexTip" 
}); 
$("#rdbWoman").checkRequired({ 
required:true, 
onFocusText:"必填项", 
onFocusClass:"notice", 
onErrorText:"错误提示", 
onErrorClass:"error", 
onSuccessClass:"correct", 
targetId:"txtSexTip" 
}); 

$("#rdbMan1,#rdbWoman2,#rdbMan3,#rdbWoman4").checkRequired({ 
required:true, 
onFocusText:"必填项", 
onFocusClass:"notice", 
onErrorText:"错误提示", 
onErrorClass:"error", 
onSuccessClass:"correct", 
targetId:"txthobbyTip" 
}); 
}); 
</script> 

<p> 
<label>姓名:</label><input type="text" id="txtName" value=""/><span id="txtNameTip"></span> 
</p> 
<p> 
<label>性别:</label> 
<span> 
<input id="rdbMan" type="radio" name="sex" value="男" />男     
<input id="rdbWoman" type="radio" name="sex" value="女" />女 
</span> 
<span id="txtSexTip"></span> 
</p> 
<p> 
<label>爱好:</label> 
<span> 
<input id="rdbMan1" type="checkbox" name="hobby" value="hobby1" />aa     
<input id="rdbWoman2" type="checkbox" name="hobby" value="hobby2" />bb    
<input id="rdbMan3" type="checkbox" name="hobby" value="hobby3" />aa     
<input id="rdbWoman4" type="checkbox" name="hobby" value="hobby4" />bb    
</span> 
<span id="txthobbyTip"></span> 
</p>

这里不多说了,文章持续更新中!有问题进一步做修改中.......
Javascript 相关文章推荐
070823更新的一个[消息提示框]组件 兼容ie7
Aug 29 Javascript
Ext javascript建立超链接,进行事件处理的实现方法
Mar 22 Javascript
使用jQuery模板来展现json数据的代码
Oct 22 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
Jul 10 Javascript
js函数排序的实例代码
Jul 01 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
Nov 19 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
Vuejs第十三篇之组件——杂项
Sep 09 Javascript
Angular2 (RC5) 路由与导航详解
Sep 21 Javascript
基于AngularJS实现的工资计算器实例
Jun 16 Javascript
原生JS获取元素的位置与尺寸实现方法
Oct 18 Javascript
事件模型在各浏览器中存在差异
Oct 20 #Javascript
自写简单JS判断是否已经弹出页面
Oct 20 #Javascript
javascript attachEvent绑定多个事件执行顺序问题
Oct 20 #Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
Oct 20 #Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
Oct 20 #Javascript
关于javascript中this关键字(翻译+自我理解)
Oct 20 #Javascript
javascript动态改变img的src属性图片不显示的解决方法
Oct 20 #Javascript
You might like
ThinkPHP添加更新标签的方法
2014/12/05 PHP
php中文验证码实现方法
2015/06/18 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
2017/06/17 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
python抓取网页中的图片示例
2014/02/28 Python
对Python函数设计规范详解
2019/07/19 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
国贸专业的职业规划书
2014/03/15 职场文书
优秀员工事迹材料
2014/12/20 职场文书
会计工作能力自我评价
2015/03/05 职场文书
2016年清明节寄语
2015/12/04 职场文书