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-?)+(\.\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); }); };
//开始验证 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();
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);
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; }
Semua kod:
Di atas adalah keseluruhan kandungan corak reka bentuk javascript yang diperkenalkan oleh editor - pengesahan input corak strategi saya harap anda menyukainya.