社内向けシステムの使い勝手向上と、今後のシステム開発に向けてフォームにオートコンプリートをつけようと苦戦した記録。
静的候補を表示する
jQuery で autocomplete を実現しようとすると jQuery UI のお世話になる。参考にしたページはこちら。
最も簡潔な実装方法は、フォームと同じファイルにリストを用意する方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.css">
https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js
$(function() {
var data = [
'にんじん',
'たまねぎ',
'じゃがいも',
'きゅうり'
];
$('#item').autocomplete({
source: data
});
});
<title>autocomplete のサンプル</title>
</head>
<body>
<input type="text" id="item" value="" />
</body>
</html>
最も簡潔な例はこんな感じ。単に配列を用意するだけ。
Ajax で動的に候補を読み込む
これも同じサイトの別記事を参考にした。
$(function() {
$('#item').autocomplete({
source: './autocomplete.py'
});
});
パラメータ “source” を候補を取得する CGI 等にするだけで OK. CGI 側は候補を JSON で返せば良い。クライアント側の実装はこれで完了なのだが、サーバ側の実装で苦戦したのでそれについて記述する。
動的候補を用意するサーバ側の実装
今回は実装しているサーバの都合で Python による実装としている。(余談だが、PHP 使わなかったのは Linux PHP + FreeTDS + Windows SQL Server という特殊な環境でどうしても PHP のドライバが落ちて使えなかったから。ソースを修正してリビルド……というところまでしたけど、実用に持っていくのに手間がかかりすぎて使い慣れた Python に逃げた)
今になって冷静に読んでみると参考ページには書いてあるのだが、初めクライアントからの入力途中の値を得るのにフィールドの名前がわからずに随分と彷徨った。答えは簡単で、 term というフィールドがそれだ。
なので例えば Python であれば
import cgi
form = cgi.FieldStorage()
term = form.getfirst('term')
という感じで取得する。
取得した term を使ってデータベースなどに照会をかけて、得られた結果をクライアントに JSON 形式で返す。
以下は簡潔にするため固定値の場合。
import json
data = [
{label: 'にんじん', value: '00000001'},
{label: 'たまねぎ', value: '00000002'},
{label: 'きゅうり', value: '00000003'}
]
print('Content-type: application/json; charset=UTF-8\r\n')
print(json.dumps(data))
Content-type を出力していないと 500: Internal Server Error をはいてしばらく悩んだ。
Ajax でのデバッグは通信内容が目に見えないことも多いので、例えば IE なら F12 キーで Web 開発ツールを起動して Network の通信内容を見てみると原因を特定しやすい。