【转】EXT VTYPE自定义举例
原文地址:http://www.blogjava.net/xiaohuzi2008/archive/2012/12/08/392676.html
近日来对Ext特别感兴趣,也许是它那种OO的设计思想吸引了我,也可以追溯到第一次见到EXT那种漂亮的界面开始吧.求神拜佛不如自食其力,为了一点小的问题找遍了GOOGLE也没个结果,自己甚少去BBS混,也不熟悉规矩,只能硬着头皮自己干了.翻源代码是一道必不可少的工序,说来惭愧,自己对JS的认识还停留在入门阶段.
这里说说自己对于Ext验证这里浅薄的理解:
首先看看如下一段代码
Ext.applyIf(Ext.form.VTypes, {
"mail" : function(_v) {
return /^\w+@\w+\.\w+$/.test(_v);
},
"mailText" : "请输入正确的email格式!\n例如:username@domain.com",
"mailMask" : /[\w@.]/i
});
这里是对Ext.form.VTypes进行扩展,增加了我们需要的email验证.
既然是扩展,那么我们就得先来看看这个父类到底是个什么样子.
Ext.form.VTypes = function(){
// closure these in so they are only created once.
var alpha = /^[a-zA-Z_]+$/;
var alphanum = /^[a-zA-Z0-9_]+$/;
var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;
var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
return {
'email' : function(v){
return email.test(v);
},
'emailMask' : /[a-z0-9_\.\-@]/i,
'url' : function(v){
return url.test(v);
},
'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"',
'alpha' : function(v){
return alpha.test(v);
},
'alphaText' : 'This field should only contain letters and _',
'alphaMask' : /[a-z_]/i,
'alphanum' : function(v){
return alphanum.test(v);
},
'alphanumText' : 'This field should only contain letters, numbers and _',
'alphanumMask' : /[a-z0-9_]/i
};
}();
以上就是Ext.form.VTypes的庐山真面目了,这里返回一个JSON的对象其中包括方法和属性,可以理解为这个类的公有方法和属性比较OO.
通过分析我们可以看到这里有个规律,xxx,xxxText,xxxMask,这些东西到底都是干嘛的?
在我们的TextField类里边有这么一个字符类型的属性vtype,在TextField类的初始化代码中,有这么一段
if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){
this.el.on("keypress", this.filterKeys, this);
}
这里我把重要的用黑体字标了出来,我们可以看到,当我们设置了当前对象(TextField)vtype属性时候,当前对象的maskRe属性获取了VTypes类的this.vtype+'Mask'属性,看到这里我们就明白了xxxMask属性里边的正则表达式是自动赋值给TextField的,这个属性在TextField控件keypress事件触发时候调用的,作用是用来限制输入的字符.
再看下面一段代码
if(this.vtype){
var vt = Ext.form.VTypes;
if(!vt[this.vtype](value, this)){
this.markInvalid(this.vtypeText || vt[this.vtype +'Text']);
return false;
}
}
这里是fieldText控件的validateValue方法里边会执行到的代码,这段代码的作用就是验证当前控件输入的内容是否通过我们刚才定义的XXX里边的验证逻辑,如果未通过则使用this.arkinvalid方法去执行未通过操作并且返回一个false.
具体谁调用这个validateValue方法,我们可以去查看该控件的父类,或与submit相关的类,这里只是返回一个与当前设置的vtype相关的验证属性
看到这里我们也就明白了,刚才上边定义的xxx,xxxText,xxxMask的作用分别为,验证逻辑,验证失败信息,控件输入验证.
知道了这些我们要来扩展这个VTypes就易如反掌了
Ext.applyIf(Ext.form.VTypes, {
"mail" : function(_v) { //定义验证逻辑,返回布尔类型的验证结果
return /^\w+@\w+\.\w+$/.test(_v);
},
"mailText" : "请输入正确的email格式!\n例如:username@domain.com", //这里是验证失败信息
"mailMask" : /[\w@.]/i //这里是输入字符验证
});
好了,我们的验证到这里就结束了.如果需要更深入的验证,那么我们就必须自己去实现一些复杂的逻辑了.
这里再给大家贴出一些简单的验证逻辑
Ext.apply(Ext.form.VTypes, {
// 年龄
"age" : function(_v) {
if (/^\d+$/.test(_v)) {
var _age = parseInt(_v);
if (_age < 200)
return true;
} else
return false;
},
'ageText' : '年龄格式出错!!格式例如:20',
'ageMask' : /[0-9]/i,
// 密码验证
"repassword" : function(_v, field) {
if (field.confirmTO) {
var psw = Ext.get(field.confirmTO);
return (_v == psw.getValue());
}
return true;
},
"repasswordText" : "密码输入不一致!!",
"repasswordMask" : /[a-z0-9]/i,
// 邮政编码
"postcode" : function(_v) {
return /^[1-9]\d{5}$/.test(_v);
},
"postcodeText" : "该输入项目必须是邮政编码格式,例如:226001",
"postcodeMask" : /[0-9]/i,
// IP地址验证
"ip" : function(_v) {
return /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
.test(_v);
},
"ipText" : "该输入项目必须是IP地址格式,例如:222.192.42.12",
"ipMask" : /[0-9\.]/i,
// 固定电话及小灵通
"telephone" : function(_v) {
return /(^\d{3}\-\d{7,8}$)|(^\d{4}\-\d{7,8}$)|(^\d{3}\d{7,8}$)|(^\d{4}\d{7,8}$)|(^\d{7,8}$)/
.test(_v);
},
"telephoneText" : "该输入项目必须是电话号码格式,例如:0513-89500414,051389500414,89500414",
"telephoneMask" : /[0-9\-]/i,
// 手机
"mobile" : function(_v) {
return /^1[35][0-9]\d{8}$/.test(_v);
},
"mobileText" : "该输入项目必须是手机号码格式,例如:13485135075",
"mobileMask" : /[0-9]/i,
// 身份证
"IDCard" : function(_v) {
// return /(^[0-9]{17}([0-9]|[Xx])$)|(^[0-9]{17}$)/.test(_v);
var area = {
11 : "北京",
12 : "天津",
13 : "河北",
14 : "山西",
15 : "内蒙古",
21 : "辽宁",
22 : "吉林",
23 : "黑龙江",
31 : "上海",
32 : "江苏",
33 : "浙江",
34 : "安徽",
35 : "福建",
36 : "江西",
37 : "山东",
41 : "河南",
42 : "湖北",
43 : "湖南",
44 : "广东",
45 : "广西",
46 : "海南",
50 : "重庆",
51 : "四川",
52 : "贵州",
53 : "云南",
54 : "西藏",
61 : "陕西",
62 : "甘肃",
63 : "青海",
64 : "宁夏",
65 : "新疆",
71 : "台湾",
81 : "香港",
82 : "澳门",
91 : "国外"
}
var Y, JYM;
var S, M;
var idcard_array = new Array();
idcard_array = _v.split("");
// 地区检验
if (area[parseInt(_v.substr(0, 2))] == null) {
this.IDCardText = "身份证号码地区非法!!,格式例如:32";
return false;
}
// 身份号码位数及格式检验
switch (_v.length) {
case 15 :
if ((parseInt(_v.substr(6, 2)) + 1900) % 4 == 0
|| ((parseInt(_v.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(_v
.substr(6, 2)) + 1900)
% 4 == 0)) {
ereg = /^[1-9][0-9]{5}(?!00)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;// 测试出生日期的合法性
} else {
ereg = /^[1-9][0-9]{5}(?!00)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;// 测试出生日期的合法性
}
if (ereg.test(_v))
return true;
else {
this.IDCardText = "身份证号码出生日期超出范围,格式例如:19860817";
return false;
}
break;
case 18 :
// 18位身份号码检测
// 出生日期的合法性检查
// 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
// 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if (parseInt(_v.substr(6, 4)) % 4 == 0
|| (parseInt(_v.substr(6, 4)) % 100 == 0 && parseInt(_v
.substr(6, 4))
% 4 == 0)) {
ereg = /^[1-9][0-9]{5}(?!0000)[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;// 闰年出生日期的合法性正则表达式
} else {
ereg = /^[1-9][0-9]{5}(?!0000)[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;// 平年出生日期的合法性正则表达式
}
if (ereg.test(_v)) {// 测试出生日期的合法性
// 计算校验位
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10]))
* 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11]))
* 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12]))
* 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13]))
* 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14]))
* 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15]))
* 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16]))
* 2
+ parseInt(idcard_array[7])
* 1
+ parseInt(idcard_array[8])
* 6
+ parseInt(idcard_array[9]) * 3;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substr(Y, 1);// 判断校验位
// alert(idcard_array[17]);
if (M == idcard_array[17]) {
return true; // 检测ID的校验位
} else {
this.IDCardText = "身份证号码末位校验位校验出错,请注意x的大小写,格式例如:201X";
return false;
}
} else {
this.IDCardText = "身份证号码出生日期超出范围,格式例如:19860817";
return false;
}
break;
default :
this.IDCardText = "身份证号码位数不对,应该为15位或是18位";
return false;
break;
}
},
"IDCardText" : "该输入项目必须是身份证号码格式,例如:32082919860817201x",
"IDCardMask" : /[0-9xX]/i
});
【转】EXT VTYPE自定义举例的更多相关文章
- Extjs 学习总结-Ext.define自定义类
本教程整理了extjs的一些基本概念及其使用,包括自定义类(Ext.define).数据模型.代理等.本节介绍使用Ext.define自定义类 使用Ext.define自定义类 1. 首先看看js中自 ...
- ExtJS 4.2 教程-03:使用Ext.define自定义类
转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-3-define-classes ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4. ...
- Ext vtype
//form验证中vtype的默认支持类型1.alpha //只能输入字母,无法输入其他(如数字,特殊符号等)2.alphanum//只能输入字母和数字,无法输入其他3.email//email验证, ...
- Extjs-4.2.1(二)——使用Ext.define自定义类
鸣谢:http://www.cnblogs.com/youring2/archive/2013/08/22/3274135.html --------------------------------- ...
- Extjs 继承Ext.Component自定义组件
//自定义HTML组件 Ext.define('MyCmp', { extend: 'Ext.Component', renderTpl: [ '<h1 class="title&qu ...
- Javascript - ExtJs - Ext.form.Panel组件
FormPanel组件(Ext.form.FormPanel) logogram:Ext.form.Panel | xtype:form Ext.form.Panel.配置 frame }//旗下所有 ...
- 【Ext.Net学习笔记】05:Ext.Net GridPanel的用法(包含Filter、Sorter、Grouping、汇总(Summary)的用法)
GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: <ext:GridPanel runat="server&qu ...
- Ext.Net系列:一安装与使用
http://www.cnblogs.com/howDo/archive/2011/04/27/2031084.html 下载地址:http://www.ext.net/download/ 示例地址: ...
- Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法
Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法 Ext.Net GridPanel可以进行Group操作,例如: 如何启用Grouping功能呢?只需要在Grid ...
随机推荐
- PL/SQL Developer使用
查询存储过程方法:1.右上角小百页 - 新建SQL窗口 - 复制存储过程名称 - 按住CTRL - 点击链接进入2.点击查询按钮(望远镜) - 文本查找输入名称 - 对象类型默认(函数.过程,包说明, ...
- 14 个折磨人的 JavaScript 面试题
前端工程师有时候面试时会遇到一类面试官,他们问的问题对于语言本身非常较真儿,往往不是候选人可能期待的面向实际的问题(有些候选人强调能干活就行,至于知不知道其中缘由是无关痛痒的).这类题目,虽然没有逻辑 ...
- php header 函数详解
网页的缓存是由 HTTP消息头中的“Cache-control”来控制的,常见的取值有private.no-cache.max-age.must- revalidate等,默认为private.其作用 ...
- php中关于抽象(abstract)类和抽象方法的问题解析
在面向对象(OOP)语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问的接口.而抽象方法就是为了方便继承而引入的,现在来看一下抽象类和抽象方法分别是如何定义以及他们的特点 ...
- DataTable使用总结
1.DataTable数据去重 static void Main(string[] args) { DataTable dt = new DataTable();//创建表 DataColumn dc ...
- Web Service 和WCF的比较
Web Service 的工作原理 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量 ...
- Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架
转载 转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23513993 本来准备下载个CSDN的客户端放手机上,没事可以浏览浏览资 ...
- .NET开源工作流RoadFlow-系统布署及注意事项
非常感谢您在百忙之中抽空来了解RoadFlow,下面我们说一下如果在自己本地搭建环境吧. 1.环境要求 数据库:sqlserver2005以上版本.服务器:IIS6.0以上,或iisexpress.d ...
- JavaScript高级程序设计之window对象
在浏览器中window对象实现了JavaScript中的Global对象: window对象是最顶层的对象: 所有其他全局的东西都可以通过它的属性检索到. ; window.aa = ; // 所有全 ...
- iOS8 无法设置定位服务
针对iOS8系统,需要在plist文件中添加这两个参数 NSLocationAlwaysUsageDescription = YES NSLocationWhenInUseUsageDescripti ...