jQuery UI autocomplete ウィジェットを使用して、名または姓によるユーザー検索を実装することを検討しています。デフォルトでは、オートコンプリートは、Wordでの出現に関係なく、文字シーケンスで単語を検索するように見えます。したがって、javascript, asp, haskell
などのデータがあり、'as'
と入力すると、3つすべてが取得されます。 Wordの先頭にのみ一致するようにします。したがって、上記の例では'asp'
のみを取得します。これを行うためにオートコンプリートウィジェットを構成する方法はありますか?
最終的には、Gmailのように 姓または名の先頭で一致 の方がさらに良いでしょう。
注:jQuery UIウィジェットを具体的に使用してこれを行う方法を見つけようとしています。私はすでにプロジェクトでjQuery UIを使用しているため、これに固執し、Webアプリケーションに追加のライブラリを追加しないようにします。
JQuery UI v1.8rc3では、 オートコンプリートウィジェット は、文字列、配列、またはコールバック関数のいずれかである source オプションを受け入れます。文字列の場合、オートコンプリートはそのURLでGETを実行し、オプション/提案を取得します。配列の場合、オートコンプリートは、指摘したように、配列の任意の位置に入力された文字が存在するかどうかを検索します。最後のバリアントは、コールバック関数です。
オートコンプリートドキュメントから:
3番目のバリエーションであるコールバックは、最も柔軟性が高く、任意のデータソースをオートコンプリートに接続するために使用できます。コールバックは2つの引数を取得します。
•
request
オブジェクト。 "term"という単一のプロパティを持ち、現在テキスト入力にある値を参照します。たとえば、ユーザーがオートコンプリートを行うように設定されている都市フィールドに「new yo」と入力すると、_request.term
_には「new yo」が保持されます。
•response
関数。コールバックで、ユーザーに提示するデータを含む単一の引数が必要です。このデータは、指定された用語に基づいてフィルター処理する必要があり、単純なローカルデータに許可される形式の配列である必要があります。ラベル/値/両方のプロパティを持つString-ArrayまたはObject-Arrayです。
サンプルコード:
_var wordlist= [ "about", "above", "across", "after", "against",
"along", "among", "around", "at", "before",
"behind", "below", "beneath", "beside", "between",
"beyond", "but", "by", "despite", "down", "during",
"except", "for", "from", "in", "inside", "into",
"like", "near", "of", "off", "on", "onto", "out",
"outside", "over", "past", "since", "through",
"throughout", "till", "to", "toward", "under",
"underneath", "until", "up", "upon", "with",
"within", "without"] ;
$("#input1").autocomplete({
// The source option can be an array of terms. In this case, if
// the typed characters appear in any position in a term, then the
// term is included in the autocomplete list.
// The source option can also be a function that performs the search,
// and calls a response function with the matched entries.
source: function(req, responseFn) {
var re = $.ui.autocomplete.escapeRegex(req.term);
var matcher = new RegExp( "^" + re, "i" );
var a = $.grep( wordlist, function(item,index){
return matcher.test(item);
});
responseFn( a );
}
});
_
いくつかの重要なポイント:
$.ui.autocomplete.escapeRegex(req.term);
への呼び出しescapesエスケープ(-===-)ユーザーが入力したテキスト内の正規表現を意味する用語はプレーンテキスト。たとえば、ドット(。)は正規表現に意味があります。オートコンプリートのソースコードを読むことで、このescapeRegex関数を学びました。new Regexp()
を含む行。 ^(Circumflex)で始まる正規表現を指定します。これは、入力した文字が配列内の用語の先頭にある場合にのみ一致することを意味します。また、大文字と小文字を区別しない一致を意味する「i」オプションも使用します。$.grep()
ユーティリティは、指定された配列の各用語で指定された関数を呼び出すだけです。この場合の関数は、単純に正規表現を使用して、配列内の用語が入力されたものと一致するかどうかを確認します。動作デモ: http://jsbin.com/ezifi
それはどのようなものか:
ちょっとした注意:オートコンプリートに関するドキュメントは、この時点ではかなり未熟であることがわかりました。これを行う例は見つかりませんでした。また、どの.cssファイルが必要であるか、どの.cssクラスが使用されるかについての作業ドキュメントを見つけることができませんでした。これをすべてコードを調べて学んだ。
Devbridgeのオートコンプリートを使用します。 http://www.devbridge.com/projects/autocomplete/jquery/
開始文字にのみ一致します。
姓または名に基づいて一致する限り、姓と名のルックアップリストを提供する必要があります。
使用例:
var wordlist = [
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November',
'December' ];
var acOptions = {
minChars:2,
delimiter: /(,|;)\s*/, // regex or character
maxHeight:400,
width:300,
zIndex: 9999,
deferRequestBy: 10, // miliseconds
// callback function:
onSelect: function(value, data){
//$('#input1').autocomplete(acOptions);
if (typeof data == "undefined") {
alert('You selected: ' + value );
}else {
alert('You selected: ' + value + ', ' + data);
}
},
// local autosuggest options:
lookup: wordlist
};
オートコンプリートコントロールを初期化するために渡すlookup
オプションは、リストまたはオブジェクトです。上記は簡単なリストを示しています。返される候補にデータを添付する場合は、次のようにlookup
オプションをオブジェクトにします。
var lookuplist = {
suggestions: [ "Jan", "Feb", "Mar", "Apr", "May" ],
data : [ 31, 28, 31, 30, 31, ]
};
jsbin.comを導入するためのthx cheeso
姓と名の一致もサポートするようにコードを拡張しました。
$("#input1").autocomplete({
source: function(req, responseFn) {
addMessage("search on: '" + req.term + "'<br/>");
var matches = new Array();
var needle = req.term.toLowerCase();
var len = wordlist.length;
for(i = 0; i < len; ++i)
{
var haystack = wordlist[i].toLowerCase();
if(haystack.indexOf(needle) == 0 ||
haystack.indexOf(" " + needle) != -1)
{
matches.Push(wordlist[i]);
}
}
addMessage("Result: " + matches.length + " items<br/>");
responseFn( matches );
}
});
「an」または「re」と入力します
文字列内の各Wordの先頭を検索する場合、ヘンチマンのよりエレガントな解決策は、cheesoを使用するだけで、正規表現のWord境界特殊文字を使用することです。
var matcher = new RegExp( "\\b" + re, "i" );
例: http://jsbin.com/utojoh/2 (「bl」を検索してみてください)
オートコンプリートに入力するデータをどこで入手していますか?データベースからですか?その場合、クエリで必要な処理を実行し、各Wordの先頭(姓/名)に一致する結果のみを返すことができます
別のjQueryオートコンプリートプラグイン があり、オプションで各アイテムの先頭でのみ検索します(オプションは matchContains=false
、これもデフォルトだと思います)。
JQuery UIプラグインにこのようなオプションがないため、別のプラグインを使用するか、現在使用しているプラグインを書き換える必要があると思います。