フォームの入力補完ができるJavaScriptのライブラリ「autoComplete.js」を使ってみます。
対応ブラウザ
対応ブラウザは公式ドキュメント内に記載がありますが、基本的に各ブラウザの最新バージョンのみの対応で、IEは非対応となっているようです。
設定方法
まずは使用するファイルを読み込みます。
今回はCDNを使用します。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@7.2.0/dist/css/autoComplete.min.css"> <script src="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@7.2.0/dist/js/autoComplete.min.js"></script>
入力補完するinput要素を用意します。
<input id="autoComplete">
デフォルトの結果一覧が左右中央位置に配置されてしまうので、marginを消しておきます。
#autoComplete_list { margin: 0; }
入力補完で使用するリスト(配列)を用意します。
var nameList = [ 'satou', 'suzuki', 'tanaka', 'takahashi', 'itou', 'yamamoto', 'watanabe', 'nakamura', 'kobayashi', 'katou', 'yoshida', 'yamada', 'sasaki', 'yamaguchi', 'matsumoto', 'inoue', 'kimura', 'hayashi', 'saitou', 'shimizu', 'yamazaki', 'abe', 'mori', 'ikeda', 'hashimoto', 'yamashita', 'ishikawa', 'nakajima', 'maeda', 'fujita', 'gotou', 'ogawa', 'okada', 'murakami', 'hasegawa', 'kondou', 'ishii', 'sakamoto', 'endou', 'fujii' ];
先程の配列を使ってライブラリの設定を行います。
var autoCompletejs = new autoComplete({ data: { src: nameList }, resultsList: { render: true } });
これで入力補完できるようになりました。
入力補完のデモページ
配列の中身は文字列でなくオブジェクトでも動作します。
var nameList = [ { "name": "satou", "from": "Tokyo" }, { "name": "suzuki", "from": "Hokkaido" }, { 〜 略 〜 }, { "name": "fujii", "from": "Tokyo" } ];
配列の中身をオブジェクトにする場合、対象のキーを指定する必要があります。
var autoCompletejs = new autoComplete({ data: { src: nameList, key: ['name', 'from'] }, resultsList: { render: true } });
この場合、nameかfromで入力補完ができます。
入力補完のデモページ2
次に、データが日本語でも問題ないかどうか試してみます。
var nameList = [ '愛園愛美', '相羽ういは', '赤羽葉子', '朝日南アカネ', '飛鳥ひな', '安土桃', '天宮こころ', '雨森小夜', 'アルス・アルマル', 'アンジュ・カトリーナ', 〜 略 〜 'リゼ・ヘルエスタ', '緑仙', '竜胆尊', 'ルイス・キャミー', 'レヴィ・エリファ', '童田明治' ];
ライブラリの設定は最初と同じです。
確認してみた限り、日本語でも特に問題なさそうでした。
日本語での入力補完のデモページ2
オプション
用意されているオプションをいくつか試してみます。
詳しくは公式のドキュメントをご確認ください。
data | 入力補完に使用するデータの設定。 オブジェクト形式でsrcにデータの配列を指定、keyにキーの指定、cacheにキャッシュを使用するかどうか(true/false)を指定。 デモページ |
---|---|
trigger | 入力補完の発火タイミングの設定。 デモページ |
query | 入力文字列の置き換えの設定。 デモページ |
sort | 結果の並び順変更の設定。 デモページ |
placeHolder | inputのプレースホルダーの設定。 デモページ |
selector | 入力補完を設定するinput要素を指定。 デモページ |
threshold | 結果の表示を開始するまでの文字数を設定。 デモページ |
debounce | 文字を入力してから結果を切り替えるまでの時間を設定。 デモページ |
searchEngine | 検索モードの指定。 strict: 厳密な検索。 loose: 緩めの検索。 デモページ |
resultsList | 結果のリストに関する設定。 デモページ |
resultItem | 結果のアイテムに関する設定。 デモページ |
noResults | 結果が0件だった場合の設定。 デモページ |
highlight | 結果の一致部分にハイライトを入れるかどうかを設定。 デモページ |
maxResults | 結果表示の上限数を設定。 デモページ |
onSelection | 入力補完を選択した時の処理を設定。 デモページ |
フォーカスを外した時に入力補完を非表示にする
ライブラリはデフォルトだとinputからフォーカスを外した際に、入力補完のリストが消えないようです。
公式のデモ内にリストを非表示にする処理があったので、試してみます。
var autoCompletejs = new autoComplete({ data: { src: nameList }, resultsList: { render: true } }); // フォーカス時にリスト表示・フォーカスを外した時にリストを非表示にする ["focus", "blur"].forEach(function(eventType) { var resultsList = document.querySelector("#autoComplete_list"); document.querySelector("#autoComplete").addEventListener(eventType, function() { if (eventType === "blur") { resultsList.style.display = "none"; } else if (eventType === "focus") { resultsList.style.display = "block"; } }); });
コメントが承認されるまで時間がかかります。