Home > jquery > Autocompleter w Jquery

Autocompleter w Jquery

luty 22nd, 2009

Jakiś czas temu pisałem o auto uzupełnianiu tekstu. Poprzedni sposób oparty było o funkcjonalności prototype i script.aculo.us.

Dzisiaj chciałbym wam przybliżyć autocompleter z wykorzystaniem JQuery.

Jedną z ważniejszych zalet rozwiązania opartego na jQuery jest jego waga czyli ok 24kB po zminimalizowaniu i skompresowaniu jspackerem, plus kilka kilo na plugin autocompletera i style, prototype i script.aculo.us 80kB, zysk jest dosyć duży, chociaż nie ma to aż takiego znaczenia dla małych i średnich stron. Pozatym jquery.autocompleter wydaje się bardziej elastyczny i jest w jakimś stopniu konfigurowalny w stosunku do pary prototype - scriptaculous.

Do stworzenia autocompletera możemy użyć kilku pluginów napisanych do jQuery jednak większość to powielanie tych samych rozwiązań przy lepszym lub gorszym ich wykonaniu.

Zaciągamy więc sobie plugin Autocomplete i podłączamy go wraz z jquery do stronki w taki oto sposób:

Przykład 1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<head>
<script type="text/javascript" src="./jquery-1.2.6.pack.js"></script>
<script type="text/javascript" src="./jquery.autocomplete.js"></script>
<script type="text/javascript">
<!-- 
$(document).ready(function() {
	$("#nazwa").autocomplete("data.php");
});
//-->
</script>
</head>
<body>
  <input type="text" name="nazwa" id="nazwa" />
</body>
</html>

Możemy dodać kilka dodatkowych opcji które pozwolą nam na zmienienie pewnych właściwości autocompletera.

Przykład 2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script type="text/javascript">
<!-- 
function formatItem(row) {
	return row[0] + "<br><i style='font-size:11px;'>" + row[1] + "</i>";
}
$(document).ready(function() {
	$("#nazwa").autocomplete("data.php", { 
                                minChars:2, 
                                matchSubset:false, 
                                cacheLength:10, 
                                formatItem:formatItem, 
        }).result( function(event, data, formatted){alert("Wybrałeś "+formatted)});
});
//-->
</script>

formatItem() funkcja formatuje elementy listy.

matchSubset ustawiony na true uruchamia filtrowanie po stronie przeglądarki dla cachowanych wcześniejszych zapytań, co pozwala nam zmniejszyć ilosć zapytań do skryptu php.

cacheLength odpowiada za cachowanie zapytań, podajemy ile ostatnich zapytań będziemy cachować.

.result() metoda ta jest uruchamiana po wybraniu przez nas jednej z opcji.

Więcej opcji można znaleźć w documentacji Jquery Autocompleter.

W obu przypadkach dane ze skryptu php są zwracane w takiej postaci:

1
2
3
4
5
6
<?php
echo "Abcd|opis1\n";
echo "Abcde|opis2\n";
echo "Abcdef|opis3\n";
echo "Abcdefg|opis4\n";
?>

Oczywiście po stronie skryptu nie ma żadnego filtrowanie, więc jeśli wpiszemy cokolwiek to zawsze otrzymamy te same dane.

Powiązane wpisy:

admin jquery , , ,

  1. Bolek
    sierpień 28th, 2009 at 08:34 | #1

    Witam , Bardzo przydatny skrypt do ilości rekordów 1000 .Testowałem go i mam problem z szybkościa działania w ilości około 10tys rekordów czas oczekiwania wynosi około 10 sek. Dobrym rozwiązaniem było by podzielenie bazy wg.alfabetu i po wpisaniu pierwszej litery np “a” Autocompleter załadował by z pliku np. a.txt rekordy z literą “a” na poczatku itd .”b” - b.txt ….tylko w jaki sposób to zrealizować .

  2. sierpień 28th, 2009 at 08:58 | #2

    Ja używa tego skryptu przy ok 12 tyś. rekordów i nie mam problemów. Musisz po testować ustawienia autocmplitera i limitować ilość zwracanych rekordów np “LIMIT 100″. Długo testowałem zanim znalazłem optymalne ustawienia, ale udało się. Fakt sam skrypt nie jest specjalnie szybki i zastanawiam się nad napisaniem własnego rozwiązania, ale na razie mi wystarcza. U mnie skrypt wyszukuje w bazie Firebird(która raczej jest wolna) i czasy mam dosyć dobre nie przekracza 0,5sek, a jeśli chodzi o rozwiązanie z plikami to raczej nie będzie szybsze, ale zawsze możesz spróbować.

  3. Bolek
    sierpień 28th, 2009 at 20:45 | #3

    dziekuję za odpowiedź .Zobaczę czy dam radę coś z tym zrobić .

  4. lukasz
    maj 7th, 2010 at 09:20 | #4

    witam
    moj problem polega na tym ze majac w bazie zapisane np nazwiska i pierwsza litera jest duża litera to ta funkcja nie zwraca mi podpowiedzi, dopiero po wpisaniu drugiej w kolejności litery uruchamia ta funkcje, prosze o pomoc

  5. maj 7th, 2010 at 14:06 | #5

    Jest taka opcja “minChars:2″ czyli minimalna ilość znaków po których wpisaniu następuje sprawdzenie jak ustawiasz na dwa to dopiero po wpisaniu dwóch znaków będzie ci sprawdzać :)

  6. lukasz
    maj 7th, 2010 at 14:24 | #6

    hehe:) nie o to chodzi, bo to działa tylko wtedy jezeli w bazie mam wszystko z małej litery, po przeniesieniu projektu z postgresa na mysql, dziala wszystko wporzadku, z tego co mi sie wydaje problem jest w kodowaniu, choc na tym i na tym serwerze mam UTF-8, wiec dalej nie znam powodu

  7. maj 7th, 2010 at 14:54 | #7

    :) problem dotyczy samego postgresa. W mysqlu UTF8 jest zwykle “ci” czyli “case insensitive” w postgresie utf8 jest “case sensitive” czyli rozpoznaje wielkość liter. Nie wiem jak wyszukujesz w bazie rekordów, ale jeśli np. robisz to przez “LIKE” to w postgresie możesz użyć “LIKE” i “ILIKE” - które nie rozróżnia wielkości znaków. Mam nadzieje, że pomogłem :)

  8. lukasz
    maj 7th, 2010 at 15:08 | #8

    jasne. dzieki:)

  9. lukasz
    maj 8th, 2010 at 08:42 | #9

    Nawiązując do mojego poprzeniego pytanie, mam jeszcze jeden podobny problem. Może rozwinę to bardziej, otóż na początku zaznacze ze wykorzystuje silnik wyszukiwania zend_lucene. Dodając dane do bazy z fomularza korzystając z serwera postgres otrzymuje bład, kórego zas nie otrzymuje gdy korzystam z mysqla. Zaznaczam ze dane są dodawane pomyslenie do bazy oraz pomyslnie zaindeksowane. Podczas wyszukiwania otrzymuje bład:
    [wrapped: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: “”
    LINE 1: …_ID, xxx.ID FROM xxx WHERE xxx.ID IN (”,”,”,’…
    ^], co jest jednoznaczne, że zwraca nieprawidłowe dane w tym polu, czy tutaj tez jest to zwiazane z kodowaniem w postgresie??

  10. maj 8th, 2010 at 10:40 | #10

    Problem polega na tym, że przekazujesz do zapytania w miejscu gdzie powinien być integer stringa. Wydrukuj sobie zapytanie i zobacz czy nie masz w niektórych miejscach np. ‘1′ zamiast 1 w mysql nie stanowi to problemu postgres natomiast odczytuje to jako dwie różne wartości.

  11. lukasz
    maj 30th, 2010 at 13:22 | #11

    witam
    używając tego widgetu natknąłem sie na jeszcze jede problem, otoż wykorzystując go w adminie generatorze a dokladnie w klasie filtru jest problem przy:
    To z klasy filtru bazowej:
    $this->setWidget(
    ‘pole’ => new sfWidgetFormFilterInput(array(’with_empty’ => true)),
    );
    A tutaj form filtru:
    $this->setWidget(’pole’, new sfWidgetFormPropelJQueryAutocompleter(array(
    ‘model’ => ‘Dyplomy’,
    ‘url’ => ‘dyplomy/autoComplete’,
    )));
    Autopodpowiedz w formularzu filtru działa, lecz po uruchomieniu procesu filtracji nie zwraca wogole wyników

  1. No trackbacks yet.
agencja reklamowa lublin ślub i wesele senniki