策略模式在表单验证中的利用
最近想要封装一个校验表单的办法,没有什么很优雅的解决思路。
明天偶尔看到了这篇文章,学到了一种新的设计模式....
实现也很容易了解。原文很具体,非常感谢文章的指导
原文链接:策略模式在表单验证中的利用
作者: HcySunYang
代码
function FormValidation(VerifiPolicy) { // 保留策略对象 this.strategies = VerifiPolicy // 验证缓存 this.validationFns = []}FormValidation.prototype.add = function (dom, rule, errMsg) { // 因为传入的是一个字符串,如'maxLength: 16',所以将其拆成数组不便操作 var ary = rule.split(':') // 策略函数的参数 var arg = [] var self = this this.validationFns.push(function () { // 重置参数 arg = [] var ruleName = ary[0] arg.push(dom.value) // 组装参数 if (ary[1]) { arg.push(ary[1]) } arg.push(errMsg) arg.push(dom) // 调用策略函数 return self.strategies[ruleName].apply(dom, arg) })}// 一键校验的办法FormValidation.prototype.start = function () { var msgs = [] for (var i = 0;i < this.validationFns.length; i++) { var msg = this.validationFns[i]() if (msg) { msgs.push(msg) } } if(msgs.length) { return msgs } else { return 'success' }}
应用
<form class="wrapper"> <label for="">USERNAME</label><input type="text" name="username"> <br> <label for="">PASSWORD</label><input type="text" name="password"> <br></form><button class="button">提交</button>
// 策略对象var VerifiPolicy = { // 判断是否为空 isNoEmpty: function (value, errorMsg, el) { if (value == '') { return {errorMsg, el} } }, // 判断最小长度 minLength: function (value, length, errorMsg, el) { if (value.length < length) { return {errorMsg, el} } }, maxLength: function(value, length, errorMsg, el) { if(value.length > length) { return {errorMsg, el} } }, // 判断是否为手机号 isMobile: function (value, errorMsg) { if (!/(^1[3|5|8][0-9]{9}$)/.test(value)) { return {errorMsg, el} } } // 其余}var validation = new FormValidation(VerifiPolicy)var form = document.querySelector('.wrapper')validation.add(form.username, 'isNoEmpty', '用户名谬误')validation.add(form.password, 'minLength: 6', '明码太短')validation.add(form.password, 'maxLength: 4', '明码太长')document.querySelector('.button').onclick = function() { var errmsg = validation.start() console.log(errmsg)}/* (3) [{…}, {…}, {…}]0: {errorMsg: "用户名谬误", el: input}1: {errorMsg: "明码太短", el: input}2: {errorMsg: "明码太长", el: input}length: 3__proto__: Array(0) */