пользовательского интерфейса jQuery автозаполнения виджет настройки поиска
Я изучаю использование jQuery UI автозаполнение виджет для реализации поиска пользователя по имени или фамилии. Похоже, что по умолчанию автозаполнение ищет слова по последовательности символов независимо от его появления в слове. Так что если у вас есть такие данные, как: javascript, asp, haskell
и вы вводите 'as'
вы получите все три. Я бы хотел, чтобы он соответствовал только началу слова. Так что в приведенном выше примере вы получаете только 'asp'
. Есть ли способ настроить виджет автозаполнения это?
в конечном счете было бы еще лучше, чтобы соответствовать по началу имени или фамилии, как это в Gmail.
примечание: Я пытаюсь выяснить способ сделать это с помощью виджета jQuery UI специально. Поскольку я уже использую jQuery UI в своем проекте, я планирую придерживаться его и стараться не добавлять дополнительные библиотеки в свое веб-приложение.
6 ответов:
в jQuery UI v1. 8rc3, автозаполнение виджет принимает a источник опция, которая может быть либо строкой, массивом, либо функцией обратного вызова. Если это строка, автозаполнение делает GET на этот URL, чтобы получить параметры/предложения. Если массив, автозаполнение выполняет поиск, как вы указали, для наличия типизированных символов в любой позиции в терминах массива. Окончательный вариант - это то, что вы хотите - функция обратного вызова.
от документация по автозаполнению:
третий вариант, обратный вызов, обеспечивает максимальную гибкость и может использоваться для подключения любого источника данных к Автозаполнению. Обратный вызов получает два аргумента:
* A
request
объект, с одним свойством под названием "term", которое ссылается на значение в настоящее время в текстовом вводе. Например, когда пользователь ввел "new yo" в поле города, которое настроено на автозаполнение,request.term
проведет "Нью-Эй".
• Ля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);
это побег поисковый запрос так что любой регулярные выражения-значимые термины в тексте, введенном пользователем, рассматриваются как обычный текст. Например, точка (.) имеет смысл для регулярных выражений. Я узнал об этой функции escapeRegex, прочитав исходный код автозаполнения.- строку с
new Regexp()
. Он задает регулярное выражение, начинающееся с ^ (Circumflex), что означает, что оно будет соответствовать только тогда, когда типизированные символы появляются в начале термина в массиве, что и требуется. Он также использует опцию "i", которая подразумевает без учета регистра.- the
$.grep()
утилита просто вызывает предоставленную функцию на каждом члене в предоставленном массиве. Функция в этом случае просто использует регулярное выражение, чтобы увидеть, соответствует ли термин в массиве тому, что было введено.- наконец, responseFn () вызывается с результатом поиска.
рабочая демонстрация:http://jsbin.com/ezifi
как это выглядит например:
просто примечание: Я нахожу документацию по автозаполнению довольно незрелой на данный момент. Я не нашел примеров, которые сделали это, и я не мог найти рабочий документ, на котором .CSS-файлы были необходимы или .будут использоваться классы css. Я узнал все это из проверки кода.
см. также как я могу настроить форматирование результатов автозаполнения плагина?
Я использую автозаполнение из devbridge. http://www.devbridge.com/projects/autocomplete/jquery/
он соответствует только начальным символам.
alt текст http://i46.tinypic.com/2ihq7pd.jpg
что касается сопоставления на основе имени или фамилии, вам просто нужно будет предоставить список поиска с именем и фамилией.
пример использования:
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 };
The что вы передать для инициализации элемента управления автозаполнения может быть список или объект. Выше показан простой список. Если вы хотите, чтобы некоторые данные прилагались к предложениям, которые возвращаются, то сделайте объект, как это:
var lookuplist = { suggestions: [ "Jan", "Feb", "Mar", "Apr", "May" ], data : [ 31, 28, 31, 30, 31, ] };
thx cheeso для intrducing jsbin.com,
я расширил ваш код, чтобы поддерживать совпадения по имени и фамилии.
$("#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'
Если вы хотите найти начала каждого слова в строке, более элегантное решение прихвостень занять cheeso, но просто использовать регулярное выражение слово границы специальных символов:
var matcher = new RegExp( "\b" + re, "i" );
Пример:http://jsbin.com/utojoh/2 (попробуйте найти 'bl')
здесь еще один плагин автозаполнения jQuery что дополнительно ищет только в начале каждого элемента (опция
matchContains=false
, Я думаю, что это тоже по умолчанию).учитывая отсутствие такой опции в плагине jQuery UI, я предполагаю, что вам придется либо использовать другой плагин, либо переписать тот, который вы используете сейчас.