キーワード検索を行う際、入力欄に文字の一部を入力すると当てはまる単語をリストアップしてくれるオートコンプリート(自動補完)機能は便利です。
jQuery UI には Autocomplete というウィジェットが用意されており、それを使えば簡単に実現できます。
あらかじめ単語が決まっていて、数が少ないのであればそのまま Javascript 内に単語一覧を書いてしまえばいいのですが、MySQL などのデータベースに登録されている情報を元に候補一覧を表示したい場合、Ajax を利用して PHP などから動的に取得する必要があります。
form.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <! DOCTYPE html> < html lang = "ja" > < head > < meta charset = "utf-8" > < title >Auto Complete</ title > < script src = "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" ></ script > < link rel = "stylesheet" href = "//ajax.googleapis.com/ajax/libs/jqueryui/1.11.0/themes/smoothness/jquery-ui.css" /> < script src = "//ajax.googleapis.com/ajax/libs/jqueryui/1.11.0/jquery-ui.min.js" ></ script > < script > $(function() { $("#sample").autocomplete({ source: "./autocomplete.php" }); }); </ script > </ head > < body > < form > < input type = "text" id = "sample" /> </ form > </ body > </ html > |
autocomplete.php
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 | <?php // 単語のリスト $list = array ( 'Apple' , 'Orange' , 'Grape' , 'Banana' , 'Pear' , 'Melon' , 'Peach' , 'Lemon' ); $words = array (); // 現在入力中の文字を取得 $term = (isset( $_GET [ 'term' ]) && is_string ( $_GET [ 'term' ])) ? $_GET [ 'term' ] : '' ; // 部分一致で検索 foreach ( $list as $word ){ if (mb_stripos( $word , $term ) !== FALSE){ $words [] = $word ; } } header( "Content-Type: application/json; charset=utf-8" ); echo json_encode( $words ); |
必要となるのはフォームの記述されたファイルと Ajax 処理を行う PHP ファイルです。
データの受け渡しは JSON で行われ、テキストボックスに現在入力中の文字は通常 term に格納されて渡されます。
サンプルでは単純に固定の単語一覧を JSON に変換して表示していますが、データベースから取得する場合は WHERE ~ LIKE で絞り込んだ単語一覧を JSON に変換します。データベースへの負荷を減らすためにセッション等にキャッシュするのも良いと思います。
デフォルトでは一文字入力していれば候補を表示しますが、オプションで minLength を指定すれば最小文字数を変更できます。
$( "#sample" ).autocomplete({ source: "./autocomplete.php", minLength: 3 });
参考: Autocomplete Widget
http://api.jqueryui.com/autocomplete/