【第3回】ひらがな入力で漢字候補を表示する検索サジェストの作り方|実践コード完全版と動作デモ編

コピペで動く!完成コードとスタイリング【完成編】 CSS装飾とWAI-ARIAで、見た目もアクセシビリティも完璧に! Program
この記事は約44分で読めます。

Part 1では問題の本質を理解し、Part 2ではJavaScriptによる実装の基本を学びました。いよいよPart 3では、実際に動作するサジェスト機能を完成させます。

この記事では、以下のことを実現します。

  • HTMLとCSSで美しい候補表示UIを構築
  • キーボード操作(↑↓キー、Enter、Escape)への対応
  • マウスクリックでの候補選択
  • フォーカスが外れたときの候補非表示
  • XSS対策(セキュリティ考慮)
  • コピペで動く完全なサンプルコード

この記事を読み終える頃には、あなたのWebサイトにすぐに導入できる、本格的なサジェスト機能が手に入ります。


このシリーズの全体像

📚 シリーズ記事一覧

Part 1:なぜ難しい?仕組みを徹底理解

Part 2:IME対応とJavaScript実装の基本

▶ Part 3:実践コード完全版と動作デモ(この記事)

Part 4:応用テクニックと本番運用


第1章:HTMLの構造を設計する

サジェスト機能のUIは、大きく3つの要素で構成されます。

  1. コンテナ:全体を囲む要素(位置の基準になる)
  2. 入力欄:ユーザーがテキストを入力する<input>要素
  3. 候補リスト:検索結果を表示する<ul>要素

1-1. 基本的なHTML構造

各要素のポイントを解説します。

class="suggest-container"

コンテナにはposition: relativeを設定します。これにより、候補リストを入力欄の下に正確に配置できます。

autocomplete="off"

ブラウザ標準のオートコンプリート機能を無効にします。自前のサジェスト機能と競合しないようにするためです。

class="suggest-list"

候補リストは最初は空で、JavaScriptで動的に<li>要素を追加します。

1-2. アクセシビリティを考慮した構造

スクリーンリーダーなどの支援技術に対応するため、WAI-ARIAの属性を追加します。

role="combobox"は、この入力欄がドロップダウンリストと連携していることを示します。aria-expandedは、候補リストが開いているかどうかを示します(JavaScriptで動的に切り替えます)。


第2章:CSSでスタイリングする

候補リストを美しく、使いやすくスタイリングします。

2-1. 基本スタイル

position: absolutetop: 100%で、候補リストを入力欄のすぐ下に配置しています。z-index: 1000で、他の要素より前面に表示されるようにしています。

2-2. 候補アイテムのスタイル

.suggest-item.selectedは、キーボードの↑↓キーで選択されている候補を示すスタイルです。ホバーとは別の色にすることで、マウス操作とキーボード操作の区別がつきやすくなります。

2-3. 候補がないときの表示

検索結果がないときは、「候補がありません」といったメッセージを表示します。何も表示しないより、ユーザーに状況を伝えるほうが親切です。


第3章:JavaScriptで機能を実装する

いよいよ、JavaScriptで本格的なサジェスト機能を実装します。コードを機能ごとに分けて解説していきます。

3-1. 辞書データを用意する

まず、検索対象となる辞書データを用意します。今回は、天気、色、季節、IT用語など、さまざまなカテゴリの単語を含めています。

辞書は実際の用途に合わせてカスタマイズしてください。ECサイトなら商品名、ブログなら記事タイトルやタグなど、サイトの内容に応じた候補を用意すると、より便利なサジェストになります。

3-2. ユーティリティ関数を定義する

共通で使う関数を定義します。

escapeHtml関数は、非常に重要です。ユーザーの入力や辞書データをHTMLに挿入する際、<script>タグなどの危険な文字列をエスケープします。これにより、XSS(クロスサイトスクリプティング)攻撃を防ぐことができます。

⚠️ セキュリティ上の注意

ユーザー入力や外部データをHTMLに挿入する際は、必ずエスケープ処理を行ってください。エスケープを怠ると、悪意のあるスクリプトが実行される可能性があります。innerHTMLを使う場合は特に注意が必要です。

3-3. プレフィックス検索関数

3-4. UI操作関数を定義する

候補リストの表示・非表示、選択状態の管理などを行う関数を定義します。

これらの関数が何をしているか、ポイントを解説します。

showSuggestions:検索結果を受け取り、候補リストのHTMLを生成して表示します。各候補アイテムにはクリックイベントとホバーイベントを設定しています。

hideSuggestions:候補リストを非表示にします。aria-expanded属性も更新し、アクセシビリティに配慮しています。

updateSelection:キーボードやマウスで選択された候補を視覚的に強調表示します。scrollIntoViewで、選択項目が画面外の場合は自動スクロールします。

selectItem:候補を選択して入力欄に反映します。選択後は候補リストを閉じます。

3-5. キーボード操作を実装する

↑↓キーでの候補選択、Enterでの確定、Escapeでのキャンセルを実装します。

e.preventDefault()は、ブラウザのデフォルト動作をキャンセルします。例えば、↑↓キーのデフォルト動作(カーソル移動)を防ぎ、候補選択の動作だけを実行します。

💡 初心者向けポイント

キーボード操作では、↓キーを押し続けると最後の候補から最初の候補に戻る「循環選択」を実装しています。これにより、候補数が多くても素早く目的の候補にたどり着けます。

3-6. IMEイベントと入力イベントを設定する

3-7. フォーカスイベントを設定する

入力欄からフォーカスが外れたときに候補リストを閉じる処理を実装します。ただし、候補をクリックしたときにフォーカスが外れてしまうと、クリックが効かなくなるという問題があります。これを解決するために、少し遅延を入れます。

200ミリ秒の遅延を入れることで、候補をクリックしてからフォーカスが外れるまでの間に、クリックイベントが処理されます。この遅延がないと、候補をクリックした瞬間にリストが消えてしまい、選択ができません。


第4章:完全なサンプルコード

ここまでの内容をすべて統合した、コピペで動く完全なサンプルコードを掲載します。このコードをHTMLファイルとして保存し、ブラウザで開けば、すぐに動作を確認できます。

4-1. 完全版コード(1ファイル)


第5章:カスタマイズのヒント

完成したサジェスト機能を、あなたのサイトに合わせてカスタマイズする方法を紹介します。

5-1. 辞書データを拡張する

辞書データは、サイトの用途に合わせて自由に拡張できます。

  • ECサイト:商品名、カテゴリ名、ブランド名
  • ブログ:記事タイトル、タグ、カテゴリ
  • 企業サイト:サービス名、FAQ、用語集

辞書データは、JSONファイルから読み込むこともできます。大規模なサイトでは、サーバーサイドでAPIを用意し、動的に候補を取得する方法も検討してください。

5-2. 表示件数を変更する

デフォルトでは最大10件の候補を表示しています。この数を変更するには、searchByReading関数の最後にあるslice(0, 10)の数値を変更します。

5-3. debounceの遅延時間を調整する

debounceの遅延時間は、ユーザーの入力速度やサーバーの応答速度に応じて調整してください。

5-4. スタイルをカスタマイズする

CSSを変更することで、見た目を自由にカスタマイズできます。色、フォントサイズ、角丸の大きさなど、サイトのデザインに合わせて調整してください。


第6章:この記事のまとめと次回予告

6-1. Part 3で学んだこと

📌 Part 3 の重要ポイント

1. HTMLの構造
コンテナ、入力欄、候補リストの3要素で構成。アクセシビリティのためにWAI-ARIA属性を追加。

2. CSSのスタイリング
position: absoluteで候補リストを入力欄の下に配置。ホバーとキーボード選択で異なるスタイルを適用。

3. キーボード操作
↑↓キーで候補を選択、Enterで確定、Escapeでキャンセル。e.preventDefault()でデフォルト動作を無効化。

4. セキュリティ対策
escapeHtml関数でXSS攻撃を防止。ユーザー入力をHTMLに挿入する際は必ずエスケープ。

5. UXの配慮
blurイベントで200ms遅延させることで、候補クリック時の問題を回避。

6-2. 次回:Part 4 の予告

Part 4では、応用テクニックと本番運用について解説します。

具体的には、以下の内容を扱います。

  • 外部API(Google Suggest等)との連携
  • サーバーサイドでの候補生成
  • 大規模データの効率的な検索
  • キャッシュ戦略とパフォーマンス最適化
  • アクセス解析との連携

今回作成したサジェスト機能をさらに発展させ、大規模サイトでも使えるレベルに引き上げていきます。

次の記事

Part 4:応用テクニックと本番運用編

→ 外部API連携と大規模サイトでの運用方法を解説します


最後まで読んでいただき、ありがとうございました。

Part 3のサンプルコードは、そのままコピペして使えます。ぜひ、あなたのサイトに導入して、「あ→雨」のサジェスト機能を体験してみてください。

コメント

タイトルとURLをコピーしました