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

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

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

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

65
задан Community 23 May 2017 в 10:31
поделиться

5 ответов

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

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

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

• Объект request с одним свойством с именем "term", которое ссылается на значение, которое в данный момент находится в текстовом вводе. Например, когда пользователь ввел «new yo» в поле города, настроенном на автозаполнение, request.term будет содержать «new yo».
• Функция отклик, обратный вызов, который ожидает, что один аргумент будет содержать данные, которые будут предложены пользователю. Эти данные должны быть отфильтрованы на основе предоставленного термина и должны быть массивом в формате, разрешенном для простых локальных данных: 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. Я узнал об этой функции escapeRegex, прочитав исходный код автозаполнения.
  • строка с новым Regexp(). Он задает regexp, начинающийся с ^ (Circumflex), что подразумевает, что он будет совпадать только тогда, когда типизные символы появятся в начале термина в массиве, что и нужно. Он также использует опцию «i», которая подразумевает нечувствительное к регистру соответствие.
  • $.grep() Утилита просто вызывает предоставленную функцию для каждого термина в предоставленном массиве. Функция в этом случае просто использует regexp, чтобы увидеть, соответствует ли термин в массиве тому, что было набрано.
  • Наконец, вызывается responseFn() с результатом поиска.

Рабочая демонстрация: http://jsbin.com/ezifi

Как это выглядит:

alt text

Просто примечание: я нахожу документацию по автозаполнения довольно незрелой на данный момент. Я не нашел примеров, которые делали бы это, и я не мог найти рабочий документ, для которого .css файлы были необходимы или какие .css классы будут использоваться. Обо всем этом я узнал, проверив код.

См. также Как настроить форматирование результатов подключаемого модуля автозаполнения?

128
ответ дан 24 November 2019 в 15:21
поделиться

Я использую автозаполнение из devbridge. http://www.devbridge.com/projects/autocomplete/jquery/

Соответствует только начальным символам.

alt text

Что касается сопоставления на основе имени или фамилии, вам просто нужно предоставить список поиска с именем и фамилией.

Пример использования:

  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 объектом, например:

var lookuplist = {
    suggestions:   [ "Jan", "Feb", "Mar", "Apr", "May" ],
    data :         [ 31, 28, 31, 30, 31, ]
};
6
ответ дан 24 November 2019 в 15:21
поделиться

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

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

0
ответ дан 24 November 2019 в 15:21
поделиться

thx cheeso для введения 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"

5
ответ дан 24 November 2019 в 15:21
поделиться

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

0
ответ дан 24 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: