Конфигурация за търсене на джаджа за jQuery UI Autocomplete

Обмислям използването на приспособлението за jQuery UI autocomplete за прилагане на потребителско търсене по име или фамилия. Изглежда, че по подразбиране автоматичното довършване търси думи по последователност от знаци, независимо от това, че се среща в дадена дума. Така че, ако имате данни като: javascript, asp, haskell и въведете 'as', ще получите и трите. Бих искал да съвпада само с началото на думата. Така че в горния пример получавате само 'asp'. Има ли начин да конфигурирате приспособлението за автоматично довършване да прави това?

В крайна сметка би било още по-добре съвпадение по начало на собственото или фамилното име като то е в Gmail.

Забележка: Опитвам се да намеря начин да направя това, като използвам специално джунджурията на jQuery UI. Тъй като вече използвам jQuery UI в моя проект, смятам да се придържам към него и да се опитам да не добавям допълнителни библиотеки към моето уеб приложение.


person dev.e.loper    schedule 04.03.2010    source източник
comment
henchman има решение за gmail като търсене stackoverflow.com/questions/2382497/   -  person dev.e.loper    schedule 09.03.2010


Отговори (6)


В jQuery UI v1.8rc3 приспособлението за автоматично довършване приема source опция, която може да бъде или низ, масив или функция за обратно извикване. Ако това е низ, автоматичното довършване прави GET на този URL адрес, за да получи опции/предложения. Ако масив, автоматичното довършване извършва търсене, както посочихте, за наличието на въведените знаци на която и да е позиция в термините на масива. Крайният вариант е това, което искате - функцията за обратно извикване.

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

Третият вариант, обратното извикване, осигурява най-голяма гъвкавост и може да се използва за свързване на всеки източник на данни към Autocomplete. Обратното извикване получава два аргумента:

• Обект request с едно свойство, наречено term, което се отнася до стойността, която текущо се въвежда. Например, когато потребителят въведе ново йо в поле за град, което е настроено да извършва автоматично довършване, 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, която предполага съвпадение без разлика на главни и малки букви.
  • помощната програма $.grep() просто извиква предоставената функция за всеки член в предоставения масив. Функцията в този случай просто използва регулярния израз, за ​​да види дали терминът в масива съвпада с въведеното.
  • накрая, responseFn() се извиква с резултата от търсенето.

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

как изглежда:

алтернативен текст

Само бележка: намирам документацията за автоматично довършване за доста незряла на този етап. Не намерих примери, които правеха това, и не можах да намеря работен документ, в който .css файловете са необходими или кои .css класове ще бъдат използвани. Научих всичко това от проверката на кода.

Вижте също, как мога да форматирам по избор Резултати от приставката за автоматично довършване?

person Cheeso    schedule 08.03.2010
comment
+1 Страхотен отговор! Аз също проверявах кода и се опитвах да разбера за какво точно е escapeRegex и публикацията ви го обяснява перфектно. - person Tauren; 20.10.2010
comment
Страхотен отговор. Съгласен съм, че документацията е доста незряла. Точно това търсех. - person Tim Banks; 19.11.2010
comment
Много благодаря! Използвах променлив брой автодовършване (по едно на ред с вложени таблици) и скоростта беше ужасна извън кутията дори с използването на js обект за локално кеширане на данните ми (мисля, че данните се копират във всяка таблица) . Това ДРАМАТИЧНО ускори приложението ми и с решение за кеширане в допълнение (за да избегна обработката на една и съща заявка два пъти след зареждане на страница), съм супер доволен от резултатите :) - person Yablargo; 22.06.2011
comment
До всички: Допълнение относно липсата на зрялост в документацията на потребителския интерфейс на jQuery. Скот Гонзалес, ръководител на проекта в jQuery UI doc, любезно ми изпрати имейл, за да ми каже, че съдържанието на новия jQuery UI doc сайт вече е в GitHub, github.com/jquery/api.jqueryui.com . Всеки е свободен да разклонява и изпраща заявки за изтегляне! - person Cheeso; 03.01.2013
comment
Благодаря ви за толкова страхотен отговор. Можете ли да ми кажете как мога да направя това, ако в рамките на източник на функция: функция(req, responseFn) {... } правя ajax повикване. напр. $(function() { $(#fieldId).autocomplete({ източник: функция( заявка, отговор) { $.ajax({ url: /someUrl, dataType: json, данни: {term: request.term }, успех: функция ( данни ) { отговор ( данни ); } }); } }); }); къде мога да поставя тези редове код, които променят регулярния израз. Благодаря - person Nikhil; 10.01.2015
comment
Какво ще кажете, когато вашият source е json масив, който получавате в .ajax повикване, т.е. повикването за автоматично довършване е ВЪТРЕ в .ajax success. Така че например казвам source: myVariable където myVariable е json масив от $.map(data)... - person Brian Wiley; 26.12.2020
comment
Също така myVariable изглежда така [{"name":"SIK1B","organism":"Homo sapiens"},{"name":"Nep2","organism":"Drosophila melanogaster"}] - person Brian Wiley; 26.12.2020

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'

person Phil Rykoff    schedule 08.03.2010

Използвам автоматичното довършване от 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, ]
};
person Cheeso    schedule 04.03.2010
comment
Cheeso благодаря за приноса ви, полезен е. Тъй като вече използвам jQueryUI плъгин в моя проект, смятам да се придържам към него и да се опитам да не добавям допълнителни плъгини към моето уеб приложение. - person dev.e.loper; 08.03.2010
comment
Това има смисъл. В такъв случай можете да обмислите да направите еднократна модификация на източника на потребителския интерфейс на jQuery, за да отговаря на вашите изисквания. Направих това, за да поправя няколко грешки, които срещнах, които са коригирани във все още неиздадени версии. Може да има смисъл и за вас. - person Cheeso; 08.03.2010
comment
ps: Не разбрах, че плъгинът за автоматично довършване е включен за първи път в jQueryUI във v1.8. Имам и използвам v1.7.2. - person Cheeso; 08.03.2010

Ако искате да търсите в началото на всяка дума в низа, по-елегантно решение за henchman's е да вземете cheeso's, но просто да използвате специалния знак за границата на думата на regexp:

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

Пример: http://jsbin.com/utojoh/2 (опитайте да потърсите „bl“)

person Nader    schedule 16.08.2011

Има друга добавка за автоматично довършване на jQuery, която по избор търси точно в началото на всеки елемент ( опцията е matchContains=false, мисля, че това също е по подразбиране).

Като се има предвид липсата на такава опция в плъгина на jQuery UI, предполагам, че ще трябва или да използвате различен плъгин, или да пренапишете този, който използвате сега.

person Paul D. Waite    schedule 08.03.2010
comment
Не, няма да трябва да пренаписва jQueryUI, за да получи автоматично довършване. Има вариант да прави каквото иска. виж отговора ми. stackoverflow.com/questions/ 2382497/ - person Cheeso; 09.03.2010
comment
А, браво. Казвате, че е в jQuery UI 1.8 — излезе ли вече? - person Paul D. Waite; 09.03.2010
comment
Доколкото знам, jQueryUI v1.8 е посочен в rc3. Освободете Кандидат #3. Обикновено RC е доста стабилна версия, почти финална. Това е нормално. Не знам за практиките на jQuery за оценки на версиите. - person Cheeso; 26.03.2010

Откъде получавате данните за попълване на автоматичното довършване? От база данни ли е? Ако е така, можете да направите каквото искате в заявката си и да върнете само резултати, които съответстват на началото на всяка дума (собствено/фамилно име)

person Mark    schedule 08.03.2010