JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】

作者:廖飞银 时间:2024-04-25 13:14:08 

本文实例讲述了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

标签:JS,表单验证插件
0
投稿

猜你喜欢

  • 安装Mysql5.7.10 winx64出现的几个问题汇总

    2024-01-28 13:16:04
  • 一文详解websocket在vue2中的封装使用

    2024-05-02 17:08:54
  • Python装饰器的应用场景代码总结

    2022-09-22 19:24:54
  • mysql 5.7.16 免安装版安装配置方法图文教程

    2024-01-15 18:42:17
  • GO语言标准错误处理机制error用法实例

    2024-02-13 18:07:20
  • python中函数总结之装饰器闭包详解

    2023-06-27 02:55:04
  • mac安装scrapy并创建项目的实例讲解

    2021-05-17 21:21:05
  • python3中dict(字典)的使用方法示例

    2022-06-14 11:44:39
  • Python在字典中查找元素的3种方式

    2023-08-07 21:33:35
  • Python实现查找系统盘中需要找的字符

    2022-10-02 02:35:50
  • mysql数据库你需要特别注意的23个事项

    2010-08-08 08:34:00
  • java 数据库连接与增删改查操作实例详解

    2024-01-25 10:14:28
  • Python实现学生管理系统并生成exe可执行文件详解流程

    2023-03-11 04:52:42
  • Flash对象在(x)HTML中的格式和参数及安全性

    2010-04-01 11:55:00
  • Python基于hashlib模块的文件MD5一致性加密验证示例

    2022-03-30 12:05:40
  • 详解Python 多线程 Timer定时器/延迟执行、Event事件

    2022-09-04 11:12:52
  • asp fso创建与删除文件与文件夹

    2008-12-31 16:07:00
  • python web框架学习笔记

    2022-09-30 07:46:38
  • Python实现的数据结构与算法之基本搜索详解

    2021-07-25 03:47:44
  • MySQL中数据表操作详解

    2008-12-29 13:50:00
  • asp之家 网络编程 m.aspxhome.com