open
イベントを利用して、これを実現する簡単な方法があります。クライアント側のコードでデフォルト項目の選択を処理するか、選択したい項目とともに追加のプロパティを送信できます。両方のオプションについて説明します。
クライアントで選択された用語で始まる提案の焦点:
$("input").autocomplete({
source: /* ... */,
open: function (event, ui) {
var menu = $(this).data("uiAutocomplete").menu
, i = 0
, $items = $('li', menu.element)
, item
, text
, startsWith = new RegExp("^" + this.value, "i");
for (; i < $items.length && !item; i++) {
text = $items.eq(i).text();
if (startsWith.test(text)) {
item = $items.eq(i);
}
}
if (item) {
menu.focus(null, item);
}
}
});
基本的には、オートコンプリートのメニューが開いているときに次のことを行うという考え方です。
- 検索語で始まる単語を探すための正規表現を作成します。
- 各メニュー項目を反復処理し、正規表現に対してそのテキストをテストします。一致が見つかったら、反復を停止して値を保存します。
- 値を取得した場合は、
focus
メニューのメソッドを使用してアイテムを強調表示します。
例: http://jsfiddle.net/J5rVP/40/ ( English またはS cots Englishを検索してみてください)
このコードはローカル データ ソースを使用していますが、リモート ソースでも同様に機能するはずです。
サーバー上で選択された用語で始まる提案のフォーカス
上記の例を拡張して、データを送信する方法を微調整して、検索ごとにサーバー側のコードが選択するアイテムを決定するようにすることができます。これは、選択したいアイテムに追加のプロパティを指定するだけで実行できます。たとえば、JSON 応答は次のようになります。
[{"label":"American English","select":true},{"label":"British English"},{"label":"English"},{"label":"Scots English"}]
select
「アメリカ英語」のプロパティに注意してください。これは、デフォルトでそのアイテムを選択することをオートコンプリートに示します。
次に、ウィジェットの初期化コードを更新して、open
上記のようにイベントを利用します。今回は、次のselect
プロパティを持つアイテムを検索しているだけです。
$("input").autocomplete({
source: "autocomplete.php",
open: function (event, ui) {
var menu = $(this).data("uiAutocomplete").menu,
i = 0,
$items = $('li', menu.element),
item,
data;
for (; i < $items.length && !item; i++) {
data = $items.eq(i).data("ui-autocomplete-item");
if (data.select) {
item = $items.eq(i);
}
}
if (item) {
menu.focus(null, item);
}
}
});
例: http://jsfiddle.net/J5rVP/42/
上記の例では、アメリカ英語が常に選択されていることに注意してください。オートコンプリートはユーザーが入力するたびに新しいリクエストを発行するため、サーバーはさまざまな候補データで応答し、したがって別のアイテムが選択されます。
select
また、私は PHP を知らないので、プロパティを JSON に追加する方法について話すことはできません。しかし、それは非常に単純で、正規表現を使用する最初の例の JavaScript コードのように見えるかもしれません。