Rumah  >  Artikel  >  hujung hadapan web  >  Corak reka bentuk JavaScript--Kemahiran input validation_javascript corak strategi

Corak reka bentuk JavaScript--Kemahiran input validation_javascript corak strategi

WBOY
WBOYasal
2016-05-16 15:29:131321semak imbas

Corak strategi mentakrifkan sekumpulan algoritma dan merangkumnya secara berasingan supaya ia boleh digantikan antara satu sama lain Corak ini menjadikan algoritma berubah bebas daripada pelanggan yang menggunakan pengiraan.

Tentukan dahulu borang input mudah:

<!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>

Secara amnya, dalam tindakan penyerahan selepas menyunting maklumat pada halaman, maklumat input perlu disahkan Anda akan melihat bahawa banyak kod yang bertanggungjawab untuk menyemak ditulis dalam fungsi penyerahan atau dalam fungsi semakan bebas.

Sebagai contoh, seperti di bawah.         

 $(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;
        }
      }

Kaedah penulisan ini pasti dapat memenuhi keperluan fungsian, tetapi akan ada beberapa masalah:

1. Jika saya ingin menggunakannya pada halaman lain, saya perlu menyalin kod yang dipanggil semula menjadi penyalinan, dan akan terdapat banyak pertindihan kod. Yang lebih baik akan mengklasifikasikan dan membungkus kod semakan, tetapi akan ada lebih banyak pertindihan.

2. Jika saya ingin menambah pengesahan input, maka saya perlu mengubah suai fungsi penyerahan secara langsung.

3. Jika anda mengubah suai fungsi penyerahan, anda mesti meliputi semua ujian reka bentuk fungsi, kerana anda tidak tahu bila perubahan tersilap atau situasi yang tidak diketahui akan berlaku.

Langkah transformasi:

1. Anggap setiap logik pengesahan sebagai strategi pengesahan dan rangkumkan setiap fungsi strategi pengesahan Parameter fungsi harus konsisten dan boleh menerima elemen DOM, nilai yang disahkan, mesej ralat dan parameter tersuai.

2. Tentukan pengesah, anda boleh mengimport fungsi strategi pengesahan atau menambahnya.

3. Pengesah menyediakan kaedah pengesahan untuk membuat panggilan semasa pengesahan, dan secara dalaman memanggil fungsi strategi pengesahan tertentu.

4. Sahkan panggilan.

Langkah 1.

Pertimbangkan setiap satu jika sebagai peraturan perniagaan pengesahan, layan setiap peraturan perniagaan sebagai fungsi strategi yang berasingan dan rangkumkan semua fungsi strategi menjadi objek strategi.                           

 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);
          }
        }
      };

Tiga parameter pertama bagi semua fungsi adalah konsisten dan diperlukan, menunjukkan elemen DOM yang disahkan, mesej ralat dan nilai yang disahkan. Yang keempat bermula dengan peraturan pengesahan fungsi itu sendiri untuk menentukan parameter tersuai.

Kaedah "buildInvalidObj" hanya menukar tiga parameter pertama kepada objek ralat dan mengembalikannya objek ralat ini akan dikembalikan selagi pengesahan gagal.

Menurut prinsip penyongsangan kebergantungan, modul peringkat tinggi tidak boleh bergantung pada modul peringkat rendah, jadi ia tidak boleh digunakan secara langsung oleh pemanggil pengesahan.

Pengenkapsulan dan pengabstrakan melalui pengesah.

Langkah 2:

Tentukan pengesah, anda boleh mengimport semua strategi pengesahan ke dalamnya, atau anda boleh menambah fungsi strategi pengesahan secara berasingan.                                                          

//输入验证器
      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;
      };

Langkah 3:

Tambah kaedah pengesahan untuk menerima panggilan luar.

Peraturan parameter pertama ditetapkan kepada peraturan pengesahan, seperti "minLength:6". Kod berikut akan menjana panggilan ke fungsi strategi tertentu.

":6" menunjukkan parameter yang disesuaikan oleh fungsi strategi mengikut peraturannya sendiri.       

  //添加验证方法
      //参数:
      // 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);
        });
      };
Panggil semua pengesahan melalui fungsi semak. dan mengembalikan hasil yang salah.         

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

Langkah 4:

Di mana pengesahan diperlukan, mula-mula buat objek pengesah baharu.                                                                       


var validators = new InputValidators();
Import objek yang mengandungi fungsi strategi pengesahan atau tambah fungsi strategi pengesahan secara berasingan.                                                                        

Dapat dilihat bahawa strategi pengesahan yang berbeza boleh diprakapsulkan ke dalam objek strategi, atau boleh ditambah serta-merta mengikut situasi sebenar.
  validators.importStrategies(validationStrategies);
        validators.addValidationStrategy('isEqual', function(element, errMsg, value1, value2) {
          if(value1 !== value2) {
            return this.buildInvalidObj(element, errMsg, value1 );
          }
        });
Kemudian tambahkan strategi yang perlu disahkan, elemen DOM yang disahkan, mesej ralat dan nilai yang disahkan ke dalam pengesah dengan menambahkan kaedah pengesahan Ini mengelakkan panggilan terus objek strategi dan mengurangkan gandingan.

Panggil cek pengesah untuk melaksanakan semua pengesahan.                                                                     
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);

semak mengembalikan objek ralat Kita boleh menggunakan objek ini untuk melaksanakan operasi gesaan secara seragam pada elemen DOM selepas semakan, seperti menetapkan fokus, memilih kandungan atau membalut lapisan gaya merah di luar kotak input.
var result = validators.check();
        if(result){
          alert(result.errMsg);
          result.element.focus();
          result.element.select();
          return false;
        }
Pada ketika ini, kita dapat melihat bahawa melalui perubahan mod strategi, apabila pengesahan input, kita hanya perlu mengambil berat tentang peraturan pengesahan yang hendak digunakan dan jenis maklumat segera yang akan digunakan tidak lagi didedahkan , yang sesuai untuk membuat panggilan dan susulan seterusnya.

Semua kod:

Di atas adalah keseluruhan kandungan corak reka bentuk javascript yang diperkenalkan oleh editor - pengesahan input corak strategi saya harap anda menyukainya.
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn