>  기사  >  웹 프론트엔드  >  JavaScript 디자인 패턴--전략 패턴 입력 유효성 검사_javascript 기술

JavaScript 디자인 패턴--전략 패턴 입력 유효성 검사_javascript 기술

WBOY
WBOY원래의
2016-05-16 15:29:131310검색

전략 패턴은 알고리즘 계열을 정의하고 서로 교체할 수 있도록 별도로 캡슐화합니다. 이 패턴을 사용하면 계산을 사용하는 고객과 관계없이 알고리즘이 변경됩니다.

먼저 간단한 입력 양식을 정의합니다.

<!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'><span>用户名:</span></div>
        <div class='form-item-input'><input id='userName' name='用户名' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'><span>密码:</span></div>
        <div class='form-item-input'><input id='password' name='密码' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'><span>确认密码:</span></div>
        <div class='form-item-input'><input id='repassword' name='密码确认' type="text"></div>
      </div>
      <div class="form-item" >
        <div class='form-item-label'><span>邮箱:</span></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>

일반적으로 페이지의 정보를 편집한 후 제출 작업에서는 입력된 정보를 확인해야 합니다. 확인을 담당하는 코드가 제출 기능이나 독립적인 확인 기능에 많이 작성되어 있는 것을 볼 수 있습니다.

예를 들어 아래와 같습니다.         

 $(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. 다른 페이지에서 사용하려면 코드를 복사해야 하는데, 소위 재사용이 복사가 되어 코드의 중복이 많이 발생하게 됩니다. 더 나은 제품은 검사 코드를 분류하고 포장하지만 중복이 더 많이 발생합니다.

2. 입력 확인을 추가하려면 제출 기능을 직접 수정해야 합니다. 이 기능은 "열기 및 닫기" 원칙을 파괴합니다.

3. 제출 기능을 수정하는 경우 언제 잘못된 변경이나 알 수 없는 상황이 발생할지 모르기 때문에 기능 설계의 모든 테스트를 거쳐야 합니다.

변환 단계:

1. 각 검증 로직을 검증 전략으로 취급하고 각 검증 전략 기능을 캡슐화해야 합니다. 함수 매개변수는 일관성이 있어야 하며 DOM 요소, 검증된 값, 오류 메시지 및 사용자 정의 매개변수를 수용할 수 있습니다.

2. 유효성 검사기를 정의하고 유효성 검사 전략 기능을 가져오거나 추가할 수 있습니다.

3. 검증자는 검증 중 호출을 위한 검증 방법을 제공하고, 내부적으로 특정 검증 전략 함수를 호출합니다.

4. 통화를 확인합니다.

1단계.

각각의 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-&#63;)+(\.\w{2,})+$/;
          if(!reg.test(value)){
            return this.buildInvalidObj(element, errMsg, value);
          }
        }
      };

모든 함수의 처음 세 매개변수는 일관성이 있고 필수이며, 확인된 DOM 요소, 오류 메시지 및 확인된 값을 나타냅니다. 네 번째 매개변수는 사용자 정의된 매개변수를 결정하기 위한 함수 자체 확인 규칙으로 시작합니다.

"buildInvalidObj" 메소드는 처음 세 개의 매개변수를 오류 객체로 변환하고 이를 반환합니다. 이 오류 객체는 확인이 실패하는 한 반환됩니다.

종속성 역전 원칙에 따라 상위 모듈은 하위 모듈에 의존해서는 안 되므로 검증 호출자가 직접 사용할 수 없습니다.

검증기를 통한 캡슐화 및 추상화.

2단계:

검증기를 정의하고 모든 검증 전략을 여기에 가져오거나 검증 전략 기능을 별도로 추가할 수 있습니다.                                                      

//输入验证器
      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단계:

외부 전화를 수락하는 인증 방법을 추가하세요.

첫 번째 매개변수 규칙은 "minLength:6"과 같은 확인 규칙으로 설정됩니다. 다음 코드는 특정 전략 함수에 대한 호출을 생성하고 함께 호출될 때까지 기다립니다.

":6"은 전략 기능이 자체 규칙에 따라 사용자 정의한 매개변수를 나타냅니다.       

  //添加验证方法
      //参数:
      // 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);
        });
      };
체크 기능을 통해 모든 인증을 호출합니다. 잘못된 결과를 반환합니다.         

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

4단계:

확인이 필요한 경우 먼저 새 유효성 검사기 개체를 만듭니다. ~


var validators = new InputValidators();
검증 전략 기능이 포함된 객체를 가져오거나 검증 전략 기능을 별도로 추가하세요. ~

다양한 검증 전략이 전략 객체에 미리 캡슐화되거나 실제 상황에 따라 즉시 추가될 수 있음을 알 수 있습니다.
  validators.importStrategies(validationStrategies);
        validators.addValidationStrategy('isEqual', function(element, errMsg, value1, value2) {
          if(value1 !== value2) {
            return this.buildInvalidObj(element, errMsg, value1 );
          }
        });
그런 다음 검증 메소드를 추가하여 검증이 필요한 전략, 검증된 DOM 요소, 오류 메시지 및 검증된 값을 검증기에 추가합니다. 이렇게 하면 전략 객체를 직접 호출하는 것을 방지하고 결합을 줄일 수 있습니다.

모든 확인을 수행하려면 유효성 검사기의 확인을 호출하세요. ~
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);

check는 오류 객체를 반환합니다. 이 객체를 사용하면 검사 후 DOM 요소에 대한 프롬프트 작업(예: 포커스 설정, 콘텐츠 선택, 입력 상자 외부에 빨간색 스타일 레이어 래핑)을 균일하게 수행할 수 있습니다.
var result = validators.check();
        if(result){
          alert(result.errMsg);
          result.element.focus();
          result.element.select();
          return false;
        }
이 시점에서 전략 모드 변경을 통해 입력 검증 시 어떤 검증 규칙을 사용할 것인지, 어떤 종류의 프롬프트 정보를 사용할 것인지만 신경 쓰면 된다는 것을 알 수 있습니다. , 호출 및 후속 후속 조치에 편리합니다.

모든 코드:

위는 에디터가 소개한 자바스크립트 디자인 패턴 - 전략 패턴 입력 검증의 전체 내용입니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.