пользовательского интерфейса jQuery автозаполнения виджет настройки поиска


Я изучаю использование jQuery UI автозаполнение виджет для реализации поиска пользователя по имени или фамилии. Похоже, что по умолчанию автозаполнение ищет слова по последовательности символов независимо от его появления в слове. Так что если у вас есть такие данные, как: javascript, asp, haskell и вы вводите 'as' вы получите все три. Я бы хотел, чтобы он соответствовал только началу слова. Так что в приведенном выше примере вы получаете только 'asp'. Есть ли способ настроить виджет автозаполнения это?

в конечном счете было бы еще лучше, чтобы соответствовать по началу имени или фамилии, как это в Gmail.

примечание: Я пытаюсь выяснить способ сделать это с помощью виджета jQuery UI специально. Поскольку я уже использую jQuery UI в своем проекте, я планирую придерживаться его и стараться не добавлять дополнительные библиотеки в свое веб-приложение.

6 63

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

как это выглядит например:

alt text

просто примечание: Я нахожу документацию по автозаполнению довольно незрелой на данный момент. Я не нашел примеров, которые сделали это, и я не мог найти рабочий документ, на котором .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 );
      }
  });

demo:http://jsbin.com/ufimu3/

введите ' an 'или're'

Если вы хотите найти начала каждого слова в строке, более элегантное решение прихвостень занять cheeso, но просто использовать регулярное выражение слово границы специальных символов:

var matcher = new RegExp( "\b" + re, "i" );

Пример:http://jsbin.com/utojoh/2 (попробуйте найти 'bl')

здесь еще один плагин автозаполнения jQuery что дополнительно ищет только в начале каждого элемента (опция matchContains=false, Я думаю, что это тоже по умолчанию).

учитывая отсутствие такой опции в плагине jQuery UI, я предполагаю, что вам придется либо использовать другой плагин, либо переписать тот, который вы используете сейчас.

где вы получаете данные для заполнения автозаполнения? Это из базы данных? Если это так, вы можете делать то, что хотите в своем запросе, и возвращать только результаты, соответствующие началу каждого слова (Имя/Фамилия)