概要Web プロジェクトでは、ログイン、登録、その他の機能はすべてフォームの送信を必要とします。ユーザーのデータをバックエンドに送信する前に、フロントエンドは通常、フォームが入力されているかどうか、フォームの長さ、パスワードが仕様に準拠しているかどうかなど、その能力の範囲内でいくつかの検証を行う必要があります。フロントエンド検証により、準拠していないフォームの送信を回避できます。 次の検証ロジックを持つフォームがあるとします。
戦略パターンを使用しないフォーム検証戦略モードが使用されていない場合、最初に考えられる検証モードは通常次のようになります。 <本文> <form id="登録フォーム"> <label for="username">ユーザー名を入力してください: <input type="text" name="username"></label> <label for="password">パスワードを入力してください: <input type="password" name="password"></label> <label for="phone">パスワードを入力してください: <input type="text" name="phone"></label> </フォーム> <スクリプト> 定数フォーム = document.querySelector('.registerForm'); フォーム.onsubmit = 関数(){ if(form.username.value === ''){ アラート('ユーザー名は空にできません') 戻る; } if(form.password.value.length < 6){ 警告('パスワードの長さは6文字未満にできません') 戻る; } if(!/(^1[3|5|8][0-9]{9}$)/.test(form.phone.value)){ 警告('電話番号の形式が正しくありません') 戻る; } } </スクリプト> </本文> このコードの書き方は非常に一般的ですが、欠点も明らかです。
戦略パターンを使用して最適化するまず、検証関数をオブジェクトとしてカプセル化します。 定数戦略 = { 空(値、エラーメッセージ){ if(値の長さ === 0){ errMsg を返します。 } }, minLength(値、長さ、エラーメッセージ){ if(値の長さ < len){ errMsg を返します。 } }, isMobile(値、エラーメッセージ){ if(!/(^1[3|5|8][0-9]{9}$)/.test(値)){ errMsg を返します。 } } } また、ターゲット フォームに検証ルールを追加するために使用される Validator クラスも必要です。その使用方法は次のとおりです。 const 検証 = 関数(){ const バリデータ = 新しい Validator(); validator.add(Form.userName, 'empty', 'ユーザー名は空にできません'); validator.add(Form.password, 'minLength:6', 'パスワードの長さは6文字未満にすることはできません'); validator.add(Form.phone, 'isMobile', '携帯電話番号の形式が正しくありません'); errMsg を Validator.start() に設定します。 errMsg を返します。 } コードに示されているように、バリデータインスタンスには 3 つのパラメータを受け取る add メソッドがあります。最初のパラメータは検証が必要なフォームインスタンス、2 番目のパラメータは検証メソッドで、コロンの後のパラメータが渡されます。 3 番目は検証が失敗した場合のエラー メッセージです。 start メソッドは検証を開始するために使用されます。検証が失敗した場合は、失敗したことを示すプロンプト メッセージが返され、後続のロジックで処理できます。 Validator クラスの記述: クラス Validator { コンストラクタ(){ このルールは、 } 要素、ルール、エラーを追加します。 const args_arr = ルールを分割します(":"); this.rules.push(()=>{ const ハンドラ = args_arr.shift(); args_arr.unshift(要素の値); args_arr.push(err); strategies[handler].apply(elem, args_arr) を返す }) } 始める(){ errmsg = [] とします for(let i = 0; i < this.rules.length; i++ ){ 定数err = this.rules[i](); もしエラーが起きたら errmsg.push(err) } } errmsg.join(","); を返します。 } } 戦略モードを使用して、構成方法を使用してフォームの検証を完了します。これらのルールは、将来フォームが検証されるあらゆる場所で使用できるため、変更や再利用がより便利になります。 1つのフォームフィールドに複数の検証ルールを追加する 現在、私たちのコードには欠点があり、フォーム項目に 1 つの検証ルールしか割り当てられず、フォームに複数の検証ルールを実装できないため、コードを改善する余地があります。 クラス Validator{ // ··· add(要素、ルール){ ルール.forEach(ルール => { const args_arr = ルール.strategy.split(":"); this.rules.push(()=>{ const ハンドラ = args_arr.shift(); args_arr.unshift(要素の値); args_arr.push(rule.errMsg); strategies[handler].apply(elem, args_arr) を返す }) }); } // ··· } const 検証 = 関数(){ const バリデータ = 新しい Validator(); validator.add(Form.username,[{ 戦略: '空'、 エラーメッセージ: 'ユーザー名は空にできません' }]); validator.add(Form.password, [{ 戦略: 'minLength:6', errMsg: 'パスワードの長さは 6 文字未満にできません' }]); バリデーター.add(Form.phone, [{ 戦略: 'isMobile'、 errMsg: '携帯電話番号の形式が正しくありません' }, { 戦略: '空'、 エラーメッセージ: '電話番号は空欄にできません' }]); errMsg を Validator.start() に設定します。 errMsg を返します。 } パラメータを渡すときにオブジェクト配列を渡し、add 関数に対応する配列処理ロジックを追加するだけです。 戦略パターンの利点アドバンテージ:
要約するPeter Norvig 氏は、関数がファーストクラス オブジェクトである言語では、戦略パターンは見えず、戦略は値が関数である変数であると述べました。実際には、カプセル化された戦略関数を、それを使用するターゲットにパラメータとして渡し、ターゲットから呼び出されるというプロセスです。戦略パターンをうまく活用することで、パターンをより深く理解できるだけでなく、関数を使用する利点も理解できるようになります。 上記は、JavaScript戦略モードを使用してフォームを検証する方法の詳細です。JavaScriptの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Linux環境でIPV6接続をサポートするようにmysql5.6を設定する方法
>>: CentOS7 に ElasticSearch 6.4.1 をインストールするための詳細なチュートリアル
MySql データベースのサブクエリ:サブクエリ: 選択クエリ ステートメント内に別の選択ステートメ...
最近、同社はitpubを皮切りに、コーポレートウェブサイト傘下の全サイトの評価を開始した。そのために...
1: アドレス書き換えとアドレス転送の意味を理解する。アドレス書き換えとアドレス転送は異なる...
1. pipとは何かpip は、Python パッケージの検索、ダウンロード、インストール、アンイ...
セルでは、明るい境界線の色を個別に定義できます。 > 基本構文<TD ボーダーカラーライ...
目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...
まずエラーコードを見てみましょう。 html: <テーブルボーダー="1"...
目次1. 日付2. 正規表現3. オリジナルパッケージタイプ序文:参照値(オブジェクト)は、 Dat...
1. GraphVis 公式サイトにアクセスして、対応する js をダウンロードします。js の新し...
最初は速度の問題だと思ったので、その後、すべての画像リンク リクエストをクロスサイト接続ではなくサイ...
Dockerfile は、イメージをビルドするために使用されるテキスト ファイルです。テキスト コン...
序文Vue で要素を初回取得できない問題の解決方法は、ポップアップ ウィンドウで要素を取得するために...
最近、プロジェクトで作業しているときに webSocket プロトコルを使用し、WeChat アプレ...
目次イメージの作成ファイル構造Dockerファイルエントリポイント関数ファイルを生成するイメージを構...
mysql使用中に接続数が超過していることが判明しました~~~~ [root@linux-node...