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


Posted in Javascript onMay 01, 2020

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

至此,整个表单验证已经初步完成,在此方法之上,可以随意添加方法了。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
静态的动态续篇之来点XML
Aug 15 Javascript
jQuery中绑定事件的命名空间详解
Apr 05 Javascript
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
javascript中select下拉框的用法总结
Jan 07 Javascript
Bootstrap3学习笔记(三)之表格
May 20 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
vue实现添加标签demo示例代码
Jan 21 Javascript
Angular.JS中的this指向详解
May 17 Javascript
VUE前端cookie简单操作
Oct 17 Javascript
VUE+node(express)实现前后端分离
Oct 13 Javascript
javascript实现固定侧边栏
Feb 09 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
May 01 #Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 #jQuery
jQuery实现移动端图片上传预览组件的方法分析
May 01 #jQuery
jQuery实现的上拉刷新功能组件示例
May 01 #jQuery
JS深入学习之数组对象排序操作示例
May 01 #Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 #Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 #Javascript
You might like
多重?l件?合查?(二)
2006/10/09 PHP
php生成随机颜色方法汇总
2014/12/03 PHP
PHP模板解析类实例
2015/07/09 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
js实现图片实时时钟
2020/01/15 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
python继承和抽象类的实现方法
2015/01/14 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python制作图片缩略图
2019/04/30 Python
python进程和线程用法知识点总结
2019/05/28 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
如何清空python的变量
2020/07/05 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
html5唤醒APP小记
2019/03/27 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
公职人员索取回扣检举信
2014/04/04 职场文书
工作分析计划书
2014/04/30 职场文书
机关保密承诺书
2014/06/03 职场文书
宇宙与人观后感
2015/06/05 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
Hive日期格式转换方法总结
2022/06/25 数据库
如何基于python实现单目三维重建详解
2022/06/25 Python