当前位置: 首页 > news >正文

validatebox实现多重规则验证

作为Easyui的校验插件没有实现多重校验能力是一种缺憾。比如说,既要限制格式为email,同时要求最长长度为20,我们就要扩展一种规则,而对长度的要求很容易变化,如果变成要求30,我们又得扩张一种规则,所以对于多重验证的需求很必要。

实现思路较为简单,扩展一种新规则:multiple,入参为其它规则,然后遍历每个规则,遇到校验不通过的时候就返回失败,并且返回对应的提示消息。思路比较简单,不过正则表达式技巧的使用还是很漂亮的,个人岁暂时不动正则,不过觉得它很优美,所以我很快就会懂的,哈哈。直接上代码了。

实现代码:

$.extend($.fn.validatebox.defaults.rules, {
    multiple: {
        validator: function (value, vtypes) {
            var returnFlag = true;
            var opts = $.fn.validatebox.defaults;
            for (var i = 0; i < vtypes.length; i++) {
                var methodinfo = /([a-zA-Z_]+)(.*)/.exec(vtypes[i]);
                var rule = opts.rules[methodinfo[1]];
                if (value && rule) {
                    var parame = eval(methodinfo[2]);
                    if (!rule["validator"](value, parame)) {
                        returnFlag = false;
                        this.message = rule.message;
                        break;
                    }
                }
            }
            return returnFlag;
        }
    }
});

经过以上的扩展,多重校验算是实现了,但是验证不通过时的提示信息却出现了问题,当第二个验证器验证失败的时候,提示信息会将第一个验证器的提示信息参杂进来。究其原因是validatebox内部提示信息的实现逻辑不合理,在调用验证器的validator函数之后,又对验证器的message属性做包装。

个人觉得提示信息应该完全在验证器内部实现,在外部再做包装是完全不合理的。其实这种情况目前主要就是为了处理length类型的验证器的提示信息,所以解决方案也比较明确和唯一:

  • 修改源码,取消调用验证器之后再进一步对验证器的message属性做封装
  • 覆写需要包装提示信息的验证器,验证器内部实现对提示信息的包装,目前只有length验证器

对于1.3.1版本,大概在5060行,注释掉以下代码:

//if(_396){
//for(var i=0;i<_396.length;i++){
//_397=_397.replace(new RegExp("\\{"+i+"\\}","g"),_396[i]);
//}
//}

覆写length类型验证器:

$.extend($.fn.validatebox.defaults.rules, {
			multiple : {
				validator : function(value, vtypes) {
					var returnFlag = true;
					var opts = $.fn.validatebox.defaults;
					for (var i = 0; i < vtypes.length; i++) {
						var methodinfo = /([a-zA-Z_]+)(.*)/.exec(vtypes[i]);
						var rule = opts.rules[methodinfo[1]];
						if (value && rule) {
							var parame = eval(methodinfo[2]);
							if (!rule["validator"](value, parame)) {
								returnFlag = false;
								this.message = rule.message;
								break;
							}
						}
					}
					return returnFlag;
				}
			},
			length : {
				validator : function(value, param) {
					this.message = 'Please enter a value between {0} and {1}.';
					var len = $.trim(value).length;
					if (param) {
						for (var i = 0; i < param.length; i++) {
							this.message = this.message.replace(new RegExp(
											"\\{" + i + "\\}", "g"), param[i]);
						}
					}
					return len >= param[0] && len <= param[1];
				},
				message : 'Please enter a value between {0} and {1}.'
			}
		});

使用方式:

<input class="easyui-validatebox" data-options="required:true,validType:'multiple[\'email\',\'length[0,20]\']'">

更新日志:

2012-12-11

在夏悸的一篇博文中提到了另一种解决方案,大家也可以参考一下:

$.extend($.fn.validatebox.defaults.rules, {
	minLength : {
		validator : function (value, param) {
			var rules = $.fn.validatebox.defaults.rules;
			rules.minLength.message = 'Please enter at least {0} characters.';
			if(!rules.email.validator(value)){
				rules.minLength.message = rules.email.message;
				return false;
			}
			if(!rules.length.validator(value,param)){
				rules.minLength.message = rules.length.message;
				return false;
			}
			return value.length >= param[0];
		},
		message : ''
	}
});
2013-01-06

自从1.3.2版本开始,validatebox自身已经支持多重校验了,例如:

input class="easyui-validatebox" data-options="required:true,validType:['email','length[0,20]']">

相关文章:

  • Spring MVC的RequestContextHolder使用误区
  • 面对问题时尽量避免的两种思维
  • jQuery API 中文文档
  • 在iptables防火墙下开启vsftpd的端口
  • 包装类型的存在便于了集合类添加原生数据
  • linux mysql 相关操作命令
  • SSH 原理和公匙私匙
  • Programming C#.Classes and Objects.只读字段
  • 设计模式 博客
  • CentOS安装Docker报错文件冲突的解决方法
  • 20141111
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Python用format格式化字符串
  • 【转】NSString属性什么时候用copy,什么时候用strong?
  • JS函数的属性
  • [译]如何构建服务器端web组件,为何要构建?
  • 08.Android之View事件问题
  • 2017 年终总结 —— 在路上
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 聚类分析——Kmeans
  • 前端临床手札——文件上传
  • 日剧·日综资源集合(建议收藏)
  • 写代码的正确姿势
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • MyCAT水平分库
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​MySQL主从复制一致性检测
  • ​卜东波研究员:高观点下的少儿计算思维
  • #{}和${}的区别?
  • #Linux(权限管理)
  • #Lua:Lua调用C++生成的DLL库
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)编辑寄语:因为爱心,所以美丽
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • **PHP二维数组遍历时同时赋值
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 中插件式开发实现
  • .Net Core 中间件验签
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net 路由处理厉害了
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NetCore 如何动态路由
  • .Net的DataSet直接与SQL2005交互