jQuery UIのautocompleteを使って、メールアドレス入力時にドメインを自動補完する機能を作ってみます。
サンプルコード
ドメインのリストは適当に作成しているので、実際に使用する場合はdomainDataの内容を適宜変更してください。
HTML
1 2 | < label >メールアドレス</ label > < input type = "text" id = "email" > |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | var domainData = [ 'docomo.ne.jp' , 'mopera.net' , ~略~ 'mail.goo.ne.jp' , 'inter7.jp' ]; var supportInput = '#email' ; // autocompleteを適用する要素 var domains = []; // @より前を含めたドメインリストを格納 var currentVal; // 入力している内容を取得 var atindex = 0; // @より前の文字数取得 var mailname; // @より前の文字列取得 var autocompleteFlag = false ; // autocompleteが構築されているかの管理 var minDomain = 1; // @以降何文字目まで入力で入力補完を表示するか $( function () { $(supportInput).on( 'keyup' , function () { currentVal = $(supportInput).val(); // @が含まれている場合 if (currentVal.match(/@/)) { // @を追加してすぐの場合 if (!autocompleteFlag) { autocompleteFlag = true ; // autocompleteの構築 autocompleteSet(supportInput); // @が追加されて2回目以降の場合 } else { // @より前半が変更された場合 if (currentVal.indexOf( '@' ) != atindex) { // autocompleteを一旦破棄して再構築 $(supportInput).autocomplete( 'destroy' ); autocompleteSet(supportInput); } } // @が含まれていない場合 } else { // @が削除されてすぐのとき if (autocompleteFlag) { autocompleteFlag = false ; // autocompleteの破棄 $(supportInput).autocomplete( 'destroy' ); } } }); }); function autocompleteSet(target) { // @より前の文字数と文字列取得 atindex = currentVal.indexOf( '@' ); mailname = currentVal.slice(0, atindex); // @より前を含めたドメインリストの作成 for ( var i = 0; i < domainData.length; i++) { domains[i] = mailname + '@' + domainData[i]; }; // autocompleteの構築 $(target).autocomplete({ source: domains, minLength: atindex + 1 + minDomain }); } |
入力内容に「@」が含まれた時点でautocompleteの構築を行っています。
入力補完に使用するデータは入力内容と一致する必要がある(ドメインだけでなく、@以前の文字列も必要)ので、autocompleteの構築時に入力補完のデータを作成しています。
プラグイン化
今のままだと同じページ内で複数使えませんので、プラグイン化してみます。
プラグイン化した「mailcomplete.js」はこちら
HTML
1 2 3 4 5 6 7 8 | < div class = "form-item" > < label >メールアドレス</ label > < input type = "text" id = "email" > </ div > < div class = "form-item" > < label >メールアドレス(確認)</ label > < input type = "text" id = "email-confirm" > </ div > |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var domainData = [ 'docomo.ne.jp' , 'mopera.net' , ~略~ 'mail.goo.ne.jp' , 'inter7.jp' ]; $( function (){ $( '#email' ).mailcomplete(); $( '#email-confirm' ).mailcomplete({ source: domainData, minDomain: 2 }); }); |
オプションとして、sourceでドメインの入力補完で使用するデータの定義、minDomainで@以降何文字目から入力補完を表示するかが設定できます。
プラグイン化後のデモページ
【参考サイト】
コメントが承認されるまで時間がかかります。