jQuery UIのautocompleteを使って、メールアドレス入力時にドメインを自動補完する機能を作ってみます。
サンプルコード
ドメインのリストは適当に作成しているので、実際に使用する場合はdomainDataの内容を適宜変更してください。
HTML
<label>メールアドレス</label> <input type="text" id="email">
JavaScript
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
<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
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で@以降何文字目から入力補完を表示するかが設定できます。
プラグイン化後のデモページ
【参考サイト】
コメントが承認されるまで時間がかかります。