JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
作者:廖飞银 发布时间:2024-04-25 13:14:08
标签:JS,表单验证插件
本文实例讲述了JS表单验证插件之数据与逻辑分离操作。分享给大家供大家参考,具体如下:
之前已经写过一个表单验证插件了,为什么还会重复造轮子呢?第一个问题是代码结构比较乱,虽然通过原型继承的写法将处理分层,但业务逻辑和数据结构混杂在一起,导致第二个问题——可扩展性和灵活性差。
认真分析表单验证的过程,可以分为两步:怎么验证和如何验证。怎么验证是数据层面的问题,如何验证是业务逻辑层面的问题。
点击:这里 查看源码
策略模式将对象和规则区分
如何让算法(数据层)和对象(逻辑层)分开来,使得算法可以独立于使用它的客户而变化?这里引入策略模式。
什么是策略模式
定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
即:策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。
关于策略模式的更多定义,参见
下面我们就开始运用策略模式来解决代码分层问题。
理想中的插件调用
在开始代码之前,我们希望用更简单的方式调用插件。
// 获取表单form元素
var form = document.getElementById('myForm');
// 创建表单校验实例
var validation = new FormValidator();
// 编写校验配置
validation.add(form.username, 'isEmpty', '用户名不能为空s');
validation.add(form.password, 'minLength: 6', '密码长度不能小于6个字符');
validation.add(form.password2, 'isEqualTo: password', '密码不一致');
validation.add(form.mobile, 'isMobile', '请填写正确的手机号');
// 开始校验,并接收错误信息
$('#submit-btn').click(function() {
var errorMsg = validation.start();
// 如果有错误信息输出,说明校验未通过
if(errorMsg){
console.log(errorMsg);
return false;
}
})
add()方法参数说明
1、 参数1:需要验证的表单项DOM元素,form[name属性]
2、 参数2:验证方法,用冒号分割,冒号后的值为方法的参数(可选)
3、 参数3:错误提示信息
编写验证函数
我们开始运用策略模式编写代码。第一步,只编写无关业务逻辑的验证函数算法,即数据层
var VerifyPolicies = {
isEmpty: function(value, errMsg) {
if(value == '') return errMsg;
},
// 最小长度
minLength: function(value, length, errMsg) {
if (value.length < length) return errMsg;
},
// 手机号码
isMobile: function(value, errMsg) {
if(!/^1[34578]\d{9}$/.test(value)) return errMsg;
},
// 是否相等
isEqualTo: function (value, toDom, errMsg) {
var toValue = document.getElementById(toDom).value;
if(value !== toValue) return errMsg;
}
};
编写验证逻辑
function FormValidator(VerifyPolicy) {
this.verifyPolicies = VerifyPolicy ? VerifyPolicy : VerifyPolicies;
// 待执行的验证函数数组
this.validateFn = [];
}
FormValidator.prototype.add = function(dom, rules, errMsg) {
var _this = this;
this.validateFn.push(function() {
var args = [];
var rule = rules.split(':');
var ruleName = rule[0];
var ruleParam = rule[1];
var value = dom.value;
args.push(value);
if(ruleParam) args.push(ruleParam.trim());
args.push(errMsg);
// 这里调用apply只是为了传参,如果支持ES6,也可以这样做:
// return _this.verifyPolicies[ruleName](...args)
return _this.verifyPolicies[ruleName].apply(null, args);
})
};
FormValidator.prototype.start = function() {
var fn = this.validateFn;
for(var i =0, len = fn.length; ; i++) {
var msg = fn[i]();
if(msg) return msg;
}
};
至此,整个表单验证已经初步完成,在此方法之上,可以随意添加方法了。
希望本文所述对大家JavaScript程序设计有所帮助。
来源:https://www.cnblogs.com/fayin/p/6907849.html


猜你喜欢
- Create PROC P_viewPage
- 本期给大家讲解的函数都不陌生,大家都遇到使用过,但是不要轻易觉得简单去学习,因为往往看似简单的东西,从一个方面深入下收都是一大堆的东西,千万
- 前言什么是树表查询?借助具有特殊性质的树数据结构进行关键字查找。本文所涉及到的特殊结构性质的树包括:二叉排序树。平衡二叉树。使用上述树结构存
- 本文为大家分享了mysql5.7.17安装配置方法,供大家参考,具体内容如下1、下载 MySQL 数据库的安装包:mysql-5.7.17.
- 如题:我写入关键字到数据库,多的时候用|隔开了,我提取再做相关文章搜索的时候,我怎么提取用|隔开的文字啊,这样我就好用关键字做搜索啊 回复:
- 如下所示:#! /usr/bin/python3# coding = utf-8# from PyQt5 import QtGui,QtCo
- 1.Cuda的下载安装及配置 首先我们要确定本机是否有独立显卡。在计算机-管理-设备管
- Python的MySQLdb模块是Python连接MySQL的一个模块,默认查询结果返回是tuple类型,只能通过0,1..等索引下标访问数
- vue中实现拖拽效果,供大家参考,具体内容如下首先要搞明白分清clientY pageY screenY layerY offsetY的区别
- 一、异步的“并行”同时处理,相互之间没啥依赖// 执行FN1返回一个promise实例,实例中管理了
- 1、建表语句:CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_da
- 1.创建数据库表--使用哪个数据库,如果不写这一句是默认的数据库,也可以用鼠标选当前数据库use testDB--创建表 Cre
- 缘起最近实验课上需要重构以前写过的一个项目(垃圾堆),需要添加发生邮件提醒的功能,记得以前写过一个PHP版的实现,所以想把PHP写的功能整理
- 对于手机、相机等设备拍摄的照片,由于手持方向的不同,拍出来的照片可能是旋转0°、90°、180°和270°。即使在电脑上利用软件将其转正,他
- 1.如何构建应用框架一般来说构建应用框架包含3个部分:命令行参数解析配置文件解析应用的命令行框架:需要具备 Help 功能、需要能够解析命令
- Oracle中SQL语句连接字符串的符号为|| select catstr(tcdm) || (',') from T_YW
- 画一个地球想画一个转动的地球,那么首先要有一个球,或者说要有一个球面,用参数方程可以表示为x=rcosϕcosθy=rc
- 1、数据库--所有数据库的大小 exec sp_helpdb --所有数据库的状态 sel
- 用python来自动生成excel数据文件。python处理excel文件主要是第三方模块库xlrd、xlwt、xluntils和pyExc
- 如何用python做后端写网页-flask框架 什么是Flask安装flask模块Hello World更深一步:数据绑定后端传入数据从前端