電話番号による入力マスクの選択

このjQuery用プラグインを使用すると、入力した電話番号の開始に基づいて適切な入力マスクを自動的に選択できます。 これにより、Webサイトページでの電話番号の入力をより高速かつエラーなしで行うことができます。 さらに、入力ルールを複数の入力マスクとして表すことができる場合、開発されたプラグインは他の領域で使用できます。



はじめに



Webサイトでは、電話番号情報の入力が非常に必要です。 そのため、各国には独自のダイヤル規則と番号の長さを設定する権利があり、その結果、異なる国の居住者の間で混乱が生じることがあります。いくつかは、先頭の数字が8



である数字を示すために使用され、他は先頭の数字が0



であり、さらに他の記号は+



記号で表示されます。



既存のソリューションの概要



難易度を何らかの方法で解決し、数値を単一の形式にするために、3つの主な解決策があります。

  1. ユーザーは、定型入力を使用して数値を入力するように求められます。 利点:番号を明確に表示することで、部屋で起こりうるエラーを最小限に抑えます。 欠点:各国には独自のスペルと数字の長さがあります。
  2. ユーザーは国を個別に選択し、残りの番号を個別に入力するように求められます。 入力マスクを使用している可能性があります。 利点:異なる国(および国内の地域)に異なる入力マスクを使用する機能。 欠点:国のリスト(および各国の地域)が大きい場合があります。 電話番号は全体として存在しなくなります(または、番号を保存および表示する前に前処理が必要です)。
  3. 数字の前(入力の外側)に+



    記号を付けて、数字の入力のみを許可します。 利点:実装が簡単。 欠点:数字の視覚的表示の欠如。




提案されたソリューション



その結果、現在の数値に応じて変化するように、使い慣れた入力マスクを改良することが決定されました。 さらに、番号を入力すると、決定された国の名前を表示することが提案されます。 このアプローチは、主観的に、上記のソリューションのすべての欠点を解決するはずです。



世界の国の数が比較的少ないことを考えると、すべての国の入力マスクのリストを編集することが決定されました。 情報源は、国際電気通信連合のウェブサイトで公開されている情報を使用しました。



この情報の収集には多くの驚きがありました。 情報を収集する過程で、国内を含む電話番号のすべての可能なオプションを考慮する必要がありました。 ただし、大量の手動で処理された情報のために、収集されたデータベースに不正確さが残っている可能性があります。 時間が経つにつれて、初期セットを修正する予定です。



ソフトウェア実装



Habrahabrで何度も言及されているjquery.inputmask実装は、入力マスクの



として使用されました。 このプラグインは現在活発に開発されており、さらに、拡張機能を簡単に作成するのに十分な方法で設計されています。 ただし、この問題では、このような拡張機能を作成することは事実上不可能でした。 私のニーズに合わせて元のプラグインを変更したり、書き換えたりしませんでした。 著者は引き続き機能の拡張に積極的に取り組んでおり、その結果、編集の適用に問題が生じる可能性があります。 そのため、外部の影響を監視(および傍受)してデータを変更するプラグインアドオンをメインコア上に記述する必要がありました。 メインプラグインのハンドラーの前に外部のインパクトハンドラーを実装するために、 jquery.bind-firstライブラリプラグインが使用されました。



許可される入力マスクを並べ替える


最も適切な入力マスクを正しく選択するには、マスクのセット全体を特別な方法で事前にソートする必要があります。 ソート規則を開発する際、次の規則が採用されました。

  1. 入力マスク内のすべての文字は、2つのタイプに分けられます。重要な文字(私の場合、これは#



    文字で、これは任意の数字と0-9の数字を意味します)とデコレーター文字(残りすべて)です。
  2. 入力マスク内の文字の別の区分は、ワイルドカード文字(私の場合、これは#



    文字です)とその他すべてです。




その結果、次のソート規則が適用順に取得されました。

  1. 2つの入力マスクを文字ごとに比較する場合、重要な文字(デコレータではない)のみが考慮されます。
  2. 異なるワイルドカードは等しいものとして扱われ、残りの重要な文字はコードに基づいて比較されます。
  3. 非標準文字は常に野生型文字よりも小さく、その結果より大きくなります。
  4. 入力マスク内の重要な文字の長さが短いほど、入力マスクが低く、高くなると見なされなくなります。




適切な入力マスクを見つける


入力テキストをソート済みリストの次のマスクと比較する場合、各マスクの重要な文字のみが考慮されます。 文字列が入力マスクより長い場合、以前のすべての文字がテストに合格したという事実にもかかわらず、この入力マスクは不適切と見なされます。 複数の入力マスクが入力テキストを満たす場合、最初の入力マスクが返されます。 さらに、見つかったマスクでは、すべての重要な文字(非テンプレートを含む)がテンプレートに置き換えられます。テンプレートは、テンプレート文字のいずれかが許可するすべての文字の組み合わせです。



イベント処理と傍受


入力マスクのメインコアのイベントハンドラーとの競合を防ぐために、次のイベントがインターセプトされます。





すべてのイベントは、入力マスクスペースで



します。 これにより、アドインが初期化された後にインプットマスクを呼び出すときの不正な動作が回避されます(カーネルは初期化中にインプットマスク空間に以前にインストールされたすべてのハンドラーを削除するため)



使用例



マスクリストの形式


マスクのリストは、オブジェクトのJavaScript配列であり、できれば同じプロパティセットを使用します。 入力マスクを含むプロパティが少なくとも1つは、配列内のすべてのオブジェクトに存在する必要があります。 マスクを含むパラメーターの名前は任意です。 以下は、そのような配列のフラグメントです。

 [ … { "mask": "+7(###)###-##-##", "cc": "RU", "name_en": "Russia", "desc_en": "", "name_ru": "", "desc_ru": "" }, { "mask": "+250(###)###-###", "cc": "RW", "name_en": "Rwanda", "desc_en": "", "name_ru": "", "desc_ru": "" }, { "mask": "+966-5-####-####", "cc": "SA", "name_en": "Saudi Arabia ", "desc_en": "mobile", "name_ru": "  ", "desc_ru": "" }, { "mask": "+966-#-###-####", "cc": "SA", "name_en": "Saudi Arabia", "desc_en": "", "name_ru": " ", "desc_ru": "" }, … ]
      
      







プラグイン接続オプション


接続する前に、マスクのリストをダウンロードして並べ替える必要があります。 これは、次の機能を実行することにより行われます。

 $.masksSort = function(maskList, defs, match, key)
      
      









接続されると、プラグインにはその操作を説明する特別なオブジェクトが渡されます。 このオブジェクトには、次の一連のパラメーターが含まれています。





プラグインを初期化するには、inputmasksメソッドを入力フィールドに適用する必要があります。

 $.fn.inputmasks = function(maskOpts, mode)
      
      









プラグイン接続の例


 <input type="text" id="customer_phone" value="7" size="25"><br> <input type="checkbox" id="phone_mask" checked> <label id="descr" for="phone_mask"> </label> <script> var maskList = $.masksSort($.masksLoad("phone-codes.json"), ['#'], /[0-9]|#/, "mask"); var maskOpts = { inputmask: { definitions: { '#': { validator: "[0-9]", cardinality: 1 } }, //clearIncomplete: true, showMaskOnHover: false, autoUnmask: true }, match: /[0-9]/, replace: '#', list: maskList, listKey: "mask", onMaskChange: function(maskObj, completed) { if (completed) { var hint = maskObj.name_ru; if (maskObj.desc_ru && maskObj.desc_ru != "") { hint += " (" + maskObj.desc_ru + ")"; } $("#descr").html(hint); } else { $("#descr").html(" "); } $(this).attr("placeholder", $(this).inputmask("getemptymask")); } }; $('#phone_mask').change(function() { if ($('#phone_mask').is(':checked')) { $('#customer_phone').inputmasks(maskOpts); } else { $('#customer_phone').inputmask("+[####################]", maskOpts.inputmask) .attr("placeholder", $('#customer_phone').inputmask("getemptymask")); $("#descr").html(" "); } }); $('#phone_mask').change(); </script>
      
      







デモンストレーション



開発されたプラグインのデモンストレーションの例は、プロジェクトページに表示されます



All Articles