2010-06-30 19 views
27

Używam autouzupełniania interfejsu jQuery UI z lokalnym źródłem danych (source: myArray). Chcę, aby autouzupełnianie zaproponowało tylko wyniki, które zaczynają się od z wpisanym łańcuchem zamiast domyślnej wielkości liter zawiera wyszukiwanie. Czy istnieje proste rozwiązanie tego problemu, czy też muszę podać moje niestandardowe wywołanie zwrotne/źródło?Użycie funkcji autouzupełniania interfejsu jQuery UI:

+2

Powiązana odpowiedź: http://stackoverflow.com/questions/2382497/jquery-autocomplete-plug-in-search-configuration – sina

Odpowiedz

10

Obecnie zrobiłem to w ten sposób, nie wiem, czy istnieje lepsze rozwiązanie:

source: function(request, response) { 
    var filteredArray = $.map(orignalArray, function(item) { 
     if(item.value.startsWith(request.term)){ 
      return item; 
     } 
     else{ 
      return null; 
     } 
    }); 
    response(filteredArray); 
}, 

Takie podejście umożliwiło również nakłada ograniczenia (np 10 sztuk) w stosunku do ilości przedmiotów do wykazać.

+0

Nie jestem żadnym ekspertem od tych rzeczy, ale mogę sobie wyobrazić algorytm dopasowywania ciągów takich jak Aho -Corasick może pomóc. – Huppie

+0

Zanim źle zrozumiesz mój poprzedni komentarz. Łańcuchy implementujące pasujące do siebie powinny być wykonywane tylko wtedy, gdy wydajność jest bezwzględnie krytyczna, a profiler pokazuje, że obecne rozwiązanie jest wąskie gardło. Do tego czasu użyj rozwiązania, które masz teraz. Czytelność twojego kodu podniosła w tym przypadku zalety wydajności :) – Huppie

+0

Twoja propozycja dotycząca algorytmu dopasowywania ciągów znaków oznacza również niestandardową metodę wywołania zwrotnego, taką jak moja (o ile się nie mylę). Może to być interesujące w niektórych szczególnych przypadkach, takich jak mówisz, mimo że funkcja autouzupełniania interfejsu użytkownika implementuje przyzwoite wyszukiwanie (zawiera). Na razie pozostanę przy mojej implementacji (mam tylko 3k elementów po 4chars każda). – Bart

1
source: function(request, response) { 
       var t = jQuery.grep(t, function(a){ 
         var patt = new RegExp("^" + request.term, "i"); 
         return (a.match(patt)); 
        }); 
       response(t); 
      }, 
+0

Myślę, że to musi być beo patt.test zamiast meczu – toy

+1

Zauważyłem, że teraz też. Lub musi to być a.match (patt) .Nie wiem jak/dlaczego pracował wcześniej, ale tak, –

+0

Co jeśli chciałbym otrzymać słowa, które się kończą? próbowałem tego wyrażenia regularnego, var patt = new RegExp ("\\>" + request.term, "i"); ale to nie zadziałało, btw, co oznacza drugi parametr funkcji RegExp o nazwie "i"? – Tarek

2

Poszedłem do kodu Jqueryui i tam go włączyłem.

Jeśli spojrzeć w kompletnej sekcji auto, pojawi się następujący wiersz:

filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i") 

zmodyfikować go do poniższego (uwaga, to jest globalna zmiana):

filter:function(a,b){var g=new RegExp("^" + d.ui.autocomplete.escapeRegex(b),"i") 
2

Oto nieco inny sposób wyszukiwania według wielkości liter. Zwróć uwagę na brak "i" w tworzeniu wyrażeń regularnych w drugim przykładzie, co powoduje niewrażliwość na wielkość liter w domyślnej implementacji.

sprawa niewrażliwe:

  $('#elem').autocomplete({ 
       source: array 
      }); 

wielkość liter:

  $('#elem').autocomplete({ 
       source: function(request, response) { 
        var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term, "")); 
        var data = $.grep(array, function(value) { 
         return matcher.test(value.label || value.value || value); 
        }); 
        response(data); 
       } 
      }); 
23

Zobacz to:

meczów rozpoczęcia słowo:

http://blog.miroslavpopovic.com/jqueryui-autocomplete-filter-words-starting-with-term

Zastępuje metodę filtru autouzupełniania. Używam tego i działa dobrze.

// Overrides the default autocomplete filter function to search only from the beginning of the string 
$.ui.autocomplete.filter = function (array, term) { 
    var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term), "i"); 
    return $.grep(array, function (value) { 
     return matcher.test(value.label || value.value || value); 
    }); 
}; 

słowo meczów:

Mecz startswith dowolnego słowa w łańcuchu.

np."LHR Londyn" towarzyszą "London"

var matcher = new RegExp("\\b" + $.ui.autocomplete.escapeRegex(term), "i"); 

\ b pozycji assert na granicy słowa (^ \ w | \ w $ | \ W \ w | \ w \ W)

2

można używać w taki sam sposób do Jquery UI Autocomplete Examples

<script> 
$("#autocompleteInputField").autocomplete({ 
    source: function(request, response) { 
      var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term), "i"); 
      response($.grep(myArray, function(item){ 
       return matcher.test(item); 
      })); 
     } 
}); 
</script> 

LUB inny sposób z użyciem $.map metody nie $.grep

<script> 
$("#autocompleteInputField").autocomplete({ 
    source: function(request, response) { 
      var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term), "i"); 
      response($.map(myArray, function(item) { 
       if (matcher.test(item)) { 
        return (item) 
       } 
      })); 
     } 
}); 
</script> 
Powiązane problemy