конфигурация поиска виджета автозаполнения jQuery UI

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

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

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

6 ответов


в jQuery UI v1.8rc3,автозаполнение виджет принимает источник опция, которая может быть строкой, массивом или функцией обратного вызова. Если это строка, автозаполнение делает GET на этом URL, чтобы получить параметры/предложения. Если массив, автозаполнение выполняет поиск, как вы указали, для наличия типизированных символов в любой позиции в терминах массива. Окончательный вариант - это то, что вы хотите-функция обратного вызова.

от автозаполнение документации:

третий вариант, обратный вызов, обеспечивает максимальную гибкость и может использоваться для подключения любого источника данных к Автозаполнению. Обратный вызов получает два аргумента:

* A request object, с одним свойством, называемым "term", которое ссылается на значение в настоящее время в текстовом вводе. Например, когда пользователь ввел "new yo" в поле city, которое настроено на автозаполнение,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); это побег поисковый запрос так что любой regex-значимые термины в тексте, введенном пользователем, рассматриваются как обычный текст. Например, точка (.) имеет значение в regex. Я узнал об этой функции 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
      };

на что вы pass для инициализации элемента управления автозаполнения может быть списком или объектом. Выше приведен простой список. Если вы хотите, чтобы некоторые данные были прикреплены к предложениям, которые возвращаются, сделайте объект, как это:

var lookuplist = {
    suggestions:   [ "Jan", "Feb", "Mar", "Apr", "May" ],
    data :         [ 31, 28, 31, 30, 31, ]
};

THX чизо для 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 );
      }
  });

демо: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, я предполагаю, что вам придется либо использовать другой плагин, либо переписать тот, который вы используете сейчас.


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