宗旨格局之输入验证,javascript设计格局试行之政

作者: 关于计算机  发布:2019-09-03

政策形式定义了算法家族,分别封装起来,让她们中间能够相互替换,此形式让算法的更换独立于选取算饭的客商.

政策形式中的战术正是一种算法恐怕专门的学问准则,将那些战略作为函数举行打包,并向外提供联合的调用实践。

先定义三个归纳的输入表单:

先定义一个轻便易行的输入表单:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-">
    <style>
      .form{
        width: px;
        height: px;
        #margin: px auto;
      }
      .form-item-label{
        width:px;
        text-align: right;
        float: left;
      }
      .form-item-input{
        float: left;
      }
      .form-item{
        width: % ;
        height: px;
        line-height: px;
      }
    </style>
  </head>
  <body>
    <div class='form'>
      <div class="form-item">
        <div class='form-item-label'>用户名:</div>
        <div class='form-item-input'><input id='userName' name='用户名' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'>密码:</div>
        <div class='form-item-input'><input id='password' name='密码' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'>确认密码:</div>
        <div class='form-item-input'><input id='repassword' name='密码确认' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'>邮箱:</div>
        <div class='form-item-input'><input id='mail' name='邮箱' type="text" ></div>
      </div>
    </div>
    <br>
    <button id='submit' >提交</button>
    <script type='text/javascript' src="../reference/jquery-...min.js"></script>
  </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <style>
            .form{
                width: 400px;
                height: 200px;
                #margin: 0px auto;
            }

            .form-item-label{
                width:100px;
                text-align: right;
                float: left;
            }

            .form-item-input{
                float: left;
            }

            .form-item{
                width: 100% ;
                height: 50px;
                line-height: 50px;
            }
        </style>
    </head>
    <body>

        <div class='form'>
            <div class="form-item">
                <div class='form-item-label'>用户名:</div>
                <div class='form-item-input'><input id='userName' name='用户名' type="text"></div>
            </div>

            <div class="form-item" >
                <div class='form-item-label'>密码:</div>
                <div class='form-item-input'><input id='password' name='密码' type="text"></div>
            </div>

            <div class="form-item" >
                <div class='form-item-label'>确认密码:</div>
                <div class='form-item-input'><input id='repassword' name='密码确认' type="text"></div>
            </div>

            <div class="form-item" >
                <div class='form-item-label'>邮箱:</div>
                <div class='form-item-input'><input id='mail' name='邮箱' type="text" ></div>
            </div>
        </div>

        <br>
        <button id='submit' >提交</button>

        <script type='text/javascript' src="../reference/jquery-1.11.3.min.js"></script>
    </body>
</html>

 一般在页面上编写制定音讯后的付出动作中,都亟需对输入的音信进行求证,会看出把过多顶住check的代码写在付给函数中只怕写在几个单独的check函数中。

 

诸如像下边那样。      

诚如在页面上编写制定新闻后的交由动作中,都需求对输入的新闻实行表达,拜会到把众多承受check的代码写在付出函数中依然写在多个独立的check函数中。

 $(document).ready(function(){
        $('#submit').bind('click', doSubmit);
      });
      function doSubmit(){
        var eleUserName = document.getElementById('userName');
        if(eleUserName.value === '') {
          alert('用户名不能为空');
          return;
        }
        if(eleUserName.length < 6) {
          alert('用户名长度不能少于6个字符');
          return;
        }
        if(eleUserName.length > 6) {
          alert('用户名长度不能多于20个字符');
          return;
        }
      }

例如像上面那样。

与上述同类的写法成效上料定能满意供给,不过,会设有多少个难点:

            $(document).ready(function(){
                $('#submit').bind('click', doSubmit);
            });

            function doSubmit(){
                var eleUserName = document.getElementById('userName');
                if(eleUserName.value === '') {
                    alert('用户名不能为空');
                    return;
                }

                if(eleUserName.length < 6) {
                    alert('用户名长度不能少于6个字符');
                    return;
                }

                if(eleUserName.length > 6) {
                    alert('用户名长度不能多于20个字符');
                    return;
                }

            }

1.一旦自个儿要在别的页面上应用,那就要将代码实行理并答复制,所谓的复用就成为了复制,代码会存在大批量再度。好一些的会把check代码分类整理封装,单还有恐怕会存在比较多的重新复制。

那般的写法效用上自然能满足供给,可是,会存在多少个难题:

2.要是本人要追加一个输入验证,那么就要直接改造提交函数,该函数会显的重叠,並且是破坏“开闭”原则的。

1.倘若自个儿要在其他页面上使用,那将要将代码进行复制,所谓的复用就改为了复制,代码会设有大气再次。好一点的会把check代码分类整理封装,单还大概会设有很多的再度复制。

3.固然退换了交给函数,将要将函数设计的测量检验全都覆盖二次,因为,不领悟曾几何时就能够发出误改或然没有抓住关键的动静。

2.假若自个儿要加进四个输入验证,那么将要直接退换提交函数,该函数会显的重合,并且是破坏“开闭”原则的。

改建步骤:

3.只要更动了交给函数,将在将函数设计的测量试验全都覆盖一回,因为,不知晓曾几何时就能够发出误改或然没有抓住主题的动静。

1.将各类验证逻辑看成是叁个验证战略并封装成每一种验证攻略函数,函数参数保持一致,基本上能用dom成分,被证明的值,错误音信,定制参数。

 

2.定义验证器,可将声明计策函数导入,也足以加多。

改变步骤:

3.验证器提供验证措施,用于注脚时的调用,其里面调用具体的印证计策函数。

1.将各类验证逻辑看成是一个表明战略并封装成各类验证战略函数,函数参数保持一致,还不错dom成分,被证实的值,错误音信,定制参数。

4.验证调用。

2.定义验证器,可将申明战略函数导入,也足以增加。

步骤1.

3.验证器提供申明形式,用于评释时的调用,在那之中间调用具体的印证计策函数。

把每四个if都用作一种校验的事体准绳,把每一种工作准则作为三个单独的计策函数,将装有的计策函数封装成三个国策对象。       

4.验证调用。

 var validationStrategies = {
        isNoEmpty: function(element, errMsg, value) {
          if(value === '') {
            return this.buildInvalidObj(element, errMsg, value );
          }
        },
        minLength: function(element, errMsg, value, length) {
          if(value.length < length){
            return this.buildInvalidObj(element, errMsg, value);
          }
        },
        maxLength: function(element, errMsg, value, length) {
          if(value.length > length){
            return this.buildInvalidObj(element, errMsg, value);
          }
        },
        isMail: function(element, errMsg, value, length) {
          var reg = /^(w-*.*)+@(w-?)+(.w{2,})+$/;
          if(!reg.test(value)){
            return this.buildInvalidObj(element, errMsg, value);
          }
        }
      };

 

持有函数的参数的前3个都保持一致,並且是必需的,表示被证实的DOM成分,错误音讯,被验证的值,第四个起来由函数自己的印证法规决定定制的参数,可有七个参数。

步骤1.

“buildInvalidObj”方法只是把前3个参数打成一个不当对象开展再次回到,只要表明不通过就能回去那个指鹿为马对象。

把每两个if都看成一种校验的作业法规,把各个业务法规作为二个独门的政策函数,将兼具的攻略函数封装成贰个计谋对象。

依照重视倒置原则,高等级次序的模块不该借助于低档次的模块,由此不能够让认证的调用方直接运用。

            var validationStrategies = {
                isNoEmpty: function(element, errMsg, value) {
                    if(value === '') {
                        return this.buildInvalidObj(element, errMsg, value );
                    }
                },

                minLength: function(element, errMsg, value, length) {
                    if(value.length < length){
                        return this.buildInvalidObj(element, errMsg, value);
                    }
                },

                maxLength: function(element, errMsg, value, length) {
                    if(value.length > length){
                        return this.buildInvalidObj(element, errMsg, value);
                    }
                },

                isMail: function(element, errMsg, value, length) {
                    var reg = /^(w-*.*)+@(w-?)+(.w{2,})+$/;
                    if(!reg.test(value)){
                        return this.buildInvalidObj(element, errMsg, value);
                    }
                }
            };

经过验证器的艺术张开包装和虚幻。

装有函数的参数的前3个都保持一致,况兼是必需的,表示被认证的DOM成分,错误音信,被评释的值,第3个开头由函数自个儿的证实准则决定定制的参数,可有七个参数。

步骤2:

“buildInvalidObj”方法只是把前3个参数打成多少个错误对象进行重临,只要表达不经过就能回到那几个颠倒是非对象。

概念验证器,能够将富有验证计谋导入其内,也能够独自增加验证计谋函数。         

传闻正视倒置原则,高档期的顺序的模块不该借助于低等级次序的模块,因而不可能让认证的调用方直接使用。

//输入验证器
      function InputValidators(){
        this.validators = [];
        this.strategies = {};
      }
      //从策略对象导入验证策略函数
      //参数:
      // strategies: 包含各种策略函数的对象
      InputValidators.prototype.importStrategies = function(strategies) {
        for(var strategyName in strategies) {
          this.addValidationStrategy(strategyName, strategies[strategyName]);
        }
      };
      //添加验证策略函数
      //参数:
      // name: 策略名称
      // strategy: 策略函数
      InputValidators.prototype.addValidationStrategy = function(name, strategy){
        this.strategies[name] = strategy;
      };

通过验证器的办法张开打包和浮泛。

步骤3:

 

累加认证形式,接受外界调用。

步骤2:

先是个参数rule,设置成验证准绳,举例"minLength:6",通过上面包车型客车代码会转移对现实计策函数的调用,调用会压到缓存中,等待一齐调用。

概念验证器,能够将富有验证战术导入其内,也得以单独增多验证计谋函数。

":6"表示计谋函数根据自个儿法则所定制的参数。     

            //输入验证器
            function InputValidators(){
                this.validators = [];
                this.strategies = {};
            }

            //从策略对象导入验证策略函数
            //参数:
            //  strategies: 包含各种策略函数的对象
            InputValidators.prototype.importStrategies = function(strategies) {
                for(var strategyName in strategies) {
                    this.addValidationStrategy(strategyName, strategies[strategyName]);
                }
            };

            //添加验证策略函数
            //参数:
            //  name: 策略名称
            //  strategy: 策略函数
            InputValidators.prototype.addValidationStrategy = function(name, strategy){
                this.strategies[name] = strategy;
            };
  //添加验证方法
      //参数:
      // rule: 验证策略字符串
      // element: 被验证的dom元素
      // errMsg: 验证失败时显示的提示信息
      // value: 被验证的值
      InputValidators.prototype.addValidator = function(rule, element, errMsg, value) {
        var that = this;
        var ruleElements = rule.split(":");
        this.validators.push(function() {
          var strategy = ruleElements.shift();
          var params = ruleElements;
          params.unshift(value);
          params.unshift(errMsg);
          params.unshift(element);
          return that.strategies[strategy].apply(that, params);
        });
      };

 

经过三个check函数来调用全体的证实。并将错误的结果实行重返。      

步骤3:

   //开始验证
      InputValidators.prototype.check = function() {
        for(var i = 0, validator; validator = this.validators[i++];){
          var result = validator();
          if(result) {
            return result;
          }
        }
      };

增进表明办法,接受外界调用。

步骤4:

首先个参数rule,设置成验证准则,比如"minLength:6",通过下边包车型客车代码会变卦对切实攻略函数的调用,调用会压到缓存中,等待一齐调用。

在急需表明的地方,先new二个验证器对象。              

":6"表示计策函数依据作者准则所定制的参数。

var validators = new InputValidators();
            //添加验证方法
            //参数:
            //  rule: 验证策略字符串
            //  element: 被验证的dom元素
            //  errMsg: 验证失败时显示的提示信息
            //  value: 被验证的值
            InputValidators.prototype.addValidator = function(rule, element, errMsg, value) {
                var that = this;
                var ruleElements = rule.split(":");

                this.validators.push(function() {
                    var strategy = ruleElements.shift();
                    var params = ruleElements;
                    params.unshift(value);
                    params.unshift(errMsg);
                    params.unshift(element);

                    return that.strategies[strategy].apply(that, params);
                });
            };

将满含验证计谋函数的靶子导入,恐怕独立增添验证战术函数。          

透过一个check函数来调用全体的印证。并将错误的结果开展再次来到。

  validators.importStrategies(validationStrategies);
        validators.addValidationStrategy('isEqual', function(element, errMsg, value1, value2) {
          if(value1 !== value2) {
            return this.buildInvalidObj(element, errMsg, value1 );
          }
        });
            //开始验证
            InputValidators.prototype.check = function() {
                for(var i = 0, validator; validator = this.validators[i++];){
                    var result = validator();
                    if(result) {
                        return result;
                    }
                }
            };

能够看来,分歧的认证攻略大家得以优先封装进战略对象中,也能够依照实际景况即时抬高。

 

然后经过增多验证格局将急需验证的国策,被验证的dom成分,错误消息,被认证的值增多进验证器中,那样防止了直接调用计策对象,收缩了耦合性。

步骤4:

var eleUserName = document.getElementById('userName');
validators.addValidator('isNoEmpty', eleUserName, '用户名不能为空', eleUserName.value);
validators.addValidator('minLength:6', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);
validators.addValidator('maxLength:20', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);
var elePassword = document.getElementById('password');
validators.addValidator('isNoEmpty', elePassword, '密码不能为空', elePassword.value);
validators.addValidator('minLength:6', elePassword, '密码的字符个数必须是6到20个', elePassword.value);
validators.addValidator('maxLength:20', elePassword, '密码的字符个数必须是6到20个', elePassword.value);
var eleRepassword = document.getElementById('repassword');
validators.addValidator('isNoEmpty', eleRepassword, '确认密码不能为空', eleRepassword.value);
validators.addValidator('minLength:6', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
validators.addValidator('maxLength:20', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
validators.addValidator('isEqual:' + elePassword.value, eleRepassword, '两次密码不一致', eleRepassword.value);
var eleMail = document.getElementById('mail');
validators.addValidator('isNoEmpty', eleMail, '邮箱不能为空', eleMail.value);
validators.addValidator('isMail', eleMail, '邮箱不是一个有效的格式', eleMail.value);

在急需表明的地点,先new三个验证器对象。

调用验证器的check试行全部的认证。            

                var validators = new  InputValidators();
var result = validators.check();
        if(result){
          alert(result.errMsg);
          result.element.focus();
          result.element.select();
          return false;
        }

将含有验证计策函数的对象导入,可能独立增加验证战术函数。

check再次来到的是谬误对象,我们得以在check后透过该指标统一地对DOM成分实行提醒性操作,比如设置要点,选中内容,或许为输入框外界包上一层金黄的体制。

                validators.importStrategies(validationStrategies);

                validators.addValidationStrategy('isEqual',  function(element, errMsg, value1, value2) {
                    if(value1 !== value2) {
                        return this.buildInvalidObj(element, errMsg, value1 );
                    }
                });

迄今,能够看出经过政策形式的改在,输入验证时,大家只须要关爱用哪些验证法规,采取什么样的提醒性新闻就能够,不再暴光完毕细节,方便调用,方便后续的恢宏和组件化。

能够看出,不相同的认证计谋大家得以优先封装进计策对象中,也得以依据真实意况即时抬高。

方方面面代码:

接下来通过抬高验证格局将急需表明的宗旨,被认证的dom成分,错误音信,被注明的值增添进验证器中,那样幸免了一直调用攻略对象,减弱了耦合性。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
      .form{
        width: 400px;
        height: 200px;
        #margin: 0px auto;
      }
      .form-item-label{
        width:100px;
        text-align: right;
        float: left;
      }
      .form-item-input{
        float: left;
      }
      .form-item{
        width: 100% ;
        height: 50px;
        line-height: 50px;
      }
    </style>
  </head>
  <body>
    <div class='form'>
      <div class="form-item">
        <div class='form-item-label'>用户名:</div>
        <div class='form-item-input'><input id='userName' name='用户名' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'>密码:</div>
        <div class='form-item-input'><input id='password' name='密码' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'>确认密码:</div>
        <div class='form-item-input'><input id='repassword' name='密码确认' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'>邮箱:</div>
        <div class='form-item-input'><input id='mail' name='邮箱' type="text" ></div>
      </div>
    </div>
    <br>
    <button id='submit' >提交</button>
    <script type='text/javascript' src="../reference/jquery-1.11.3.min.js"></script>
    <script type='text/javascript'>
      $(document).ready(function(){
        $('#submit').bind('click', doSubmit);
      });
function doSubmit(){
        var validators = new InputValidators();
        validators.importStrategies(validationStrategies);
        validators.addValidationStrategy('isEqual', function(element, errMsg, value1, value2) {
          if(value1 !== value2) {
            return this.buildInvalidObj(element, errMsg, value1 );
          }
        });
        var eleUserName = document.getElementById('userName');
        validators.addValidator('isNoEmpty', eleUserName, '用户名不能为空', eleUserName.value);
        validators.addValidator('minLength:6', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);
        validators.addValidator('maxLength:20', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);
        var elePassword = document.getElementById('password');
        validators.addValidator('isNoEmpty', elePassword, '密码不能为空', elePassword.value);
        validators.addValidator('minLength:6', elePassword, '密码的字符个数必须是6到20个', elePassword.value);
        validators.addValidator('maxLength:20', elePassword, '密码的字符个数必须是6到20个', elePassword.value);
        var eleRepassword = document.getElementById('repassword');
        validators.addValidator('isNoEmpty', eleRepassword, '确认密码不能为空', eleRepassword.value);
        validators.addValidator('minLength:6', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
        validators.addValidator('maxLength:20', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
        validators.addValidator('isEqual:' + elePassword.value, eleRepassword, '两次密码不一致', eleRepassword.value);
        var eleMail = document.getElementById('mail');
        validators.addValidator('isNoEmpty', eleMail, '邮箱不能为空', eleMail.value);
        validators.addValidator('isMail', eleMail, '邮箱不是一个有效的格式', eleMail.value);
        var result = validators.check();
        if(result){
          alert(result.errMsg);
          result.element.focus();
          result.element.select();
          return false;
        }
        alert('验证通过');
      }
      //输入验证器
      function InputValidators(){
        this.validators = [];
        this.strategies = {};
        //this.from(validationStrategies);
      }
      //添加验证方法
      //参数:
      // rule: 验证策略字符串
      // element: 被验证的dom元素
      // errMsg: 验证失败时显示的提示信息
      // value: 被验证的值
      InputValidators.prototype.addValidator = function(rule, element, errMsg, value) {
        var that = this;
        var ruleElements = rule.split(":");
        this.validators.push(function() {
          var strategy = ruleElements.shift();
          var params = ruleElements;
          params.unshift(value);
          params.unshift(errMsg);
          params.unshift(element);
          return that.strategies[strategy].apply(that, params);
        });
      };
      //添加验证策略函数
      //参数:
      // name: 策略名称
      // strategy: 策略函数
      InputValidators.prototype.addValidationStrategy = function(name, strategy){
        this.strategies[name] = strategy;
      };
      //从策略对象导入验证策略函数
      //参数:
      // strategies: 包含各种策略函数的对象
      InputValidators.prototype.importStrategies = function(strategies) {
        for(var strategyName in strategies) {
          this.addValidationStrategy(strategyName, strategies[strategyName]);
        }
      };
      //验证失败时,将相关的错误信息打包返回
      //参数:
      // element: dom元素
      //  errMsg: 验证失败时的提示消息
      //  value: 被验证的值
      InputValidators.prototype.buildInvalidObj = function(element, errMsg, value){
        return {
          'value': value,
          'element': element,
          'errMsg': errMsg
        };
      };
      //开始验证
      InputValidators.prototype.check = function() {
        for(var i = 0, validator; validator = this.validators[i++];){
          var result = validator();
          if(result) {
            return result;
          }
        }
      };
      //验证策略对象,包含默认的验证策略函数
      var validationStrategies = {
        isNoEmpty: function(element, errMsg, value) {
          if(value === '') {
            return this.buildInvalidObj(element, errMsg, value );
          }
        },
        minLength: function(element, errMsg, value, length) {
          if(value.length < length){
            return this.buildInvalidObj(element, errMsg, value);
          }
        },
        maxLength: function(element, errMsg, value, length) {
          if(value.length > length){
            return this.buildInvalidObj(element, errMsg, value);
          }
        },
        isMail: function(element, errMsg, value, length) {
          var reg = /^(w-*.*)+@(w-?)+(.w{2,})+$/;
          if(!reg.test(value)){
            return this.buildInvalidObj(element, errMsg, value);
          }
        }
      };
    </script>
  </body>
</html>
var eleUserName = document.getElementById('userName');
validators.addValidator('isNoEmpty', eleUserName, '用户名不能为空', eleUserName.value);
validators.addValidator('minLength:6', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);
validators.addValidator('maxLength:20', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);

var elePassword = document.getElementById('password');
validators.addValidator('isNoEmpty', elePassword, '密码不能为空', elePassword.value);
validators.addValidator('minLength:6', elePassword, '密码的字符个数必须是6到20个', elePassword.value);
validators.addValidator('maxLength:20', elePassword, '密码的字符个数必须是6到20个', elePassword.value);

var eleRepassword = document.getElementById('repassword');
validators.addValidator('isNoEmpty', eleRepassword, '确认密码不能为空', eleRepassword.value);
validators.addValidator('minLength:6', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
validators.addValidator('maxLength:20', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
validators.addValidator('isEqual:' + elePassword.value, eleRepassword, '两次密码不一致', eleRepassword.value);

var eleMail = document.getElementById('mail');
validators.addValidator('isNoEmpty', eleMail, '邮箱不能为空', eleMail.value);
validators.addValidator('isMail', eleMail, '邮箱不是一个有效的格式', eleMail.value);

上述所述是小编给我们介绍的javascript设计形式--战略形式之输入验证的全体内容,希望大家快乐。

调用验证器的check实行所有的验证。

你或者感兴趣的篇章:

  • javascript设计格局之政策方式学习笔记
  • 应用政策方式与点缀情势扩张JavaScript表单验证功效
  • 自在了然JavaScript计谋格局
  • 上学JavaScript设计情势之政策情势
  • 学习JavaScript设计形式(攻略形式)
  • 详解JavaScript的国策形式编制程序
  • 深刻精晓JavaScript类别(33):设计方式之政策情势详解
  • JavaScript设计形式之政策方式实例
  • JavaScript设计方式之政策情势详解
                var result = validators.check();
                if(result){
                    alert(result.errMsg);
                    result.element.focus();
                    result.element.select();
                    return false;
                }

check再次来到的是一无可取对象,大家能够在check后透过该对象统一地对DOM元素实行提醒性操作,比如设置要点,选中内容,或许为输入框外部包上一层海军蓝的体制。

 

迄今,能够看出经过政策方式的改建,输入验证时,大家只必要关爱用哪些验证准绳,选拔什么的提示性音信就可以,不再揭穿实现细节,方便调用,方便后续的恢弘和组件化。

 

方方面面代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <style>
            .form{
                width: 400px;
                height: 200px;
                #margin: 0px auto;
            }

            .form-item-label{
                width:100px;
                text-align: right;
                float: left;
            }

            .form-item-input{
                float: left;
            }

            .form-item{
                width: 100% ;
                height: 50px;
                line-height: 50px;
            }
        </style>
    </head>
    <body>

        <div class='form'>
            <div class="form-item">
                <div class='form-item-label'>用户名:</div>
                <div class='form-item-input'><input id='userName' name='用户名' type="text"></div>
            </div>

            <div class="form-item" >
                <div class='form-item-label'>密码:</div>
                <div class='form-item-input'><input id='password' name='密码' type="text"></div>
            </div>

            <div class="form-item" >
                <div class='form-item-label'>确认密码:</div>
                <div class='form-item-input'><input id='repassword' name='密码确认' type="text"></div>
            </div>

            <div class="form-item" >
                <div class='form-item-label'>邮箱:</div>
                <div class='form-item-input'><input id='mail' name='邮箱' type="text" ></div>
            </div>
        </div>

        <br>
        <button id='submit' >提交</button>


        <script type='text/javascript' src="../reference/jquery-1.11.3.min.js"></script>
        <script type='text/javascript'>
            $(document).ready(function(){
                $('#submit').bind('click', doSubmit);
            });
function doSubmit(){
                var validators = new  InputValidators();

                validators.importStrategies(validationStrategies);

                validators.addValidationStrategy('isEqual',  function(element, errMsg, value1, value2) {
                    if(value1 !== value2) {
                        return this.buildInvalidObj(element, errMsg, value1 );
                    }
                });

                var eleUserName = document.getElementById('userName');
                validators.addValidator('isNoEmpty', eleUserName, '用户名不能为空', eleUserName.value);
                validators.addValidator('minLength:6', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);
                validators.addValidator('maxLength:20', eleUserName, '用户名的字符个数必须是6到20个', eleUserName.value);

                var elePassword = document.getElementById('password');
                validators.addValidator('isNoEmpty', elePassword, '密码不能为空', elePassword.value);
                validators.addValidator('minLength:6', elePassword, '密码的字符个数必须是6到20个', elePassword.value);
                validators.addValidator('maxLength:20', elePassword, '密码的字符个数必须是6到20个', elePassword.value);

                var eleRepassword = document.getElementById('repassword');
                validators.addValidator('isNoEmpty', eleRepassword, '确认密码不能为空', eleRepassword.value);
                validators.addValidator('minLength:6', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
                validators.addValidator('maxLength:20', eleRepassword, '确认密码的字符个数必须是6到20个', eleRepassword.value);
                validators.addValidator('isEqual:' + elePassword.value, eleRepassword, '两次密码不一致', eleRepassword.value);

                var eleMail = document.getElementById('mail');
                validators.addValidator('isNoEmpty', eleMail, '邮箱不能为空', eleMail.value);
                validators.addValidator('isMail', eleMail, '邮箱不是一个有效的格式', eleMail.value);


                var result = validators.check();
                if(result){
                    alert(result.errMsg);
                    result.element.focus();
                    result.element.select();
                    return false;
                }

                alert('验证通过');
            }

            //输入验证器
            function InputValidators(){
                this.validators = [];
                this.strategies = {};

                //this.from(validationStrategies);
            }

            //添加验证方法
            //参数:
            //  rule: 验证策略字符串
            //  element: 被验证的dom元素
            //  errMsg: 验证失败时显示的提示信息
            //  value: 被验证的值
            InputValidators.prototype.addValidator = function(rule, element, errMsg, value) {
                var that = this;
                var ruleElements = rule.split(":");

                this.validators.push(function() {
                    var strategy = ruleElements.shift();
                    var params = ruleElements;
                    params.unshift(value);
                    params.unshift(errMsg);
                    params.unshift(element);

                    return that.strategies[strategy].apply(that, params);
                });
            };

            //添加验证策略函数
            //参数:
            //  name: 策略名称
            //  strategy: 策略函数
            InputValidators.prototype.addValidationStrategy = function(name, strategy){
                this.strategies[name] = strategy;
            };

            //从策略对象导入验证策略函数
            //参数:
            //  strategies: 包含各种策略函数的对象
            InputValidators.prototype.importStrategies = function(strategies) {
                for(var strategyName in strategies) {
                    this.addValidationStrategy(strategyName, strategies[strategyName]);
                }
            };

            //验证失败时,将相关的错误信息打包返回
            //参数:
            //  element: dom元素
            //   errMsg: 验证失败时的提示消息
            //    value: 被验证的值
            InputValidators.prototype.buildInvalidObj = function(element, errMsg, value){
                return {
                    'value': value,
                    'element': element,
                    'errMsg': errMsg
                };
            };

            //开始验证
            InputValidators.prototype.check = function() {
                for(var i = 0, validator; validator = this.validators[i++];){
                    var result = validator();
                    if(result) {
                        return result;
                    }
                }
            };

            //验证策略对象,包含默认的验证策略函数
            var validationStrategies = {
                isNoEmpty: function(element, errMsg, value) {
                    if(value === '') {
                        return this.buildInvalidObj(element, errMsg, value );
                    }
                },

                minLength: function(element, errMsg, value, length) {
                    if(value.length < length){
                        return this.buildInvalidObj(element, errMsg, value);
                    }
                },

                maxLength: function(element, errMsg, value, length) {
                    if(value.length > length){
                        return this.buildInvalidObj(element, errMsg, value);
                    }
                },

                isMail: function(element, errMsg, value, length) {
                    var reg = /^(w-*.*)+@(w-?)+(.w{2,})+$/;
                    if(!reg.test(value)){
                        return this.buildInvalidObj(element, errMsg, value);
                    }
                }
            };
        </script>
    </body>
</html>

 

本文由王中王开奖结果发布于关于计算机,转载请注明出处:宗旨格局之输入验证,javascript设计格局试行之政

关键词: