2010-03-14 10 views
5

Pracuję nad stworzeniem wtyczki jQuery AutoSuggest, zainspirowanej reflektorem firmy Apple.Wydajny AutoSuggest z jQuery?

Oto ogólny kod:

$(document).ready(function() { 
$('#q').bind('keyup', function() { 

    if($(this).val().length == 0) { 
     // Hide the q-suggestions box 
     $('#q-suggestions').fadeOut(); 
    } else { 
     // Show the AJAX Spinner 
     $("#q").css("background-image","url(/images/ajax-loader.gif)"); 

     $.ajax({ 
      url: '/search/spotlight/', 
      data: {"q": $(this).val()}, 
      success: function(data) { 
       $('#q-suggestions').fadeIn(); // Show the q-suggestions box 
       $('#q-suggestions').html(data); // Fill the q-suggestions box 

       // Hide the AJAX Spinner 
       $("#q").css("background-image","url(/images/icon-search.gif)"); 

      } 
     }); 
    } 
}); 

Kwestia Chcę rozwiązać również & elegancko, nie zabija sever. W tej chwili powyższy kod trafia na serwer za każdym razem, gdy wpisujesz klucz i nie czeka, aż w zasadzie skończysz pisać. Jaki jest najlepszy sposób na rozwiązanie tego problemu? A. Zabij poprzednią prośbę AJAX? B. Jaki typ buforowania AJAX? C. Dodanie pewnego opóźnienia, aby przesłać tylko .AJAX(), gdy osoba przestała pisać przez około 300 ms?

+2

Pan spojrzał na nowym autouzupełniania plugin z jQuery UI http://jqueryui.com/demos/autocomplete/? – PetersenDidIt

+1

jQuery nie jest akronimem. – SLaks

+0

@nobosh: Jestem po wdrożeniu wydajnego autosugestowania bez zabijania serwera i jeśli jesteś w stanie wymyślić coś, co twoim zdaniem sprawdzisz, czy udostępnisz przykładowy kod po stronie serwera? - dzięki. –

Odpowiedz

9

Spróbuj użyć Ben Alman's Throttle & Debounce plugin

Pozwala rzeczy „opóźnienie” aż użytkownik jest wykonywana.

Na przykład, w jaki sposób używać go sprawdzić jego example of debouncing with a pretend autocomplete

Twój kod będzie w zasadzie stać

var qinput = $('#q').bind('keyup', $.debounce(250, function() { 

    if($(this).val().length == 0) { 
     // Hide the q-suggestions box 
     $('#q-suggestions').fadeOut(); 
    } else { 
     // Show the AJAX Spinner 
     qinput.addClass('loading'); 

     $.ajax({ 
      url: '/search/spotlight/', 
      data: {"q": $(this).val()}, 
      success: function(data) { 
       $('#q-suggestions') 
        .fadeIn() // Show the q-suggestions box 
        .html(data); // Fill the q-suggestions box 

       // Hide the AJAX Spinner 
       qinput.removeClass('loading').addClass('search'); 
      } 
     }); 
    } 
})); 

CSS

.loading{ 
    background: url('/images/ajax-loader.gif'); 
} 
.search{ 
    background: url('/images/icon-search.gif'); 
} 

Będziesz pamiętać, że usunąłem swój obraz tła css i zastąpił je addClass/removeClass. Znacznie łatwiejsze zarządzanie plikami CSS w plikach css.

+0

Brzmi interesująco, ale to dużo kodu, nie sądzisz? – AnApprentice

+1

Nie nazwałbym 0.7kb dużo kodu http://github.com/cowboy/jquery-throttle-debounce/raw/v1.1/jquery.ba-throttle-debounce.min.js – PetersenDidIt

+0

Prawda. Jak zasugerowałbyś zastosowanie Throttle w powyższym kodzie? Nie widzę, jak wykorzystać wtyczkę w tym zakresie. thxs – AnApprentice

2

Wybrałbym wariant C. Nie czekaj, aż użytkownicy przestaną pisać, ale odczekaj trochę czasu (200 ms?) Po pierwszym naciśnięciu klawisza. Po tym czasie w wielu przypadkach otrzymasz dodatkowe naciśnięcia klawiszy, a następnie użyjesz wpisanych znaków, aby uzyskać autosugest. Jeśli po przesłaniu wniosku zostanie naciśnięty inny klawisz, zaczniesz ponownie odliczać.

I zdecydowanie powinieneś też zrobić buforowanie; ludzie będą używać backspace, a będziesz musiał ponownie wyświetlić listę imion.

+0

Thxs, czy możesz zaoferować kilka wskazówek, jak wdrożyć opóźnienie i buforowanie? – AnApprentice

+0

Możesz zajrzeć do wtyczki jQuery tutaj: http://code.google.com/p/jquery-autocomplete/ Obsługuje parametry takie jak opóźnienie i pamięć podręcznaDługość –

2

Nie wiem, co DB używasz LUB używasz Hardcoded plik !?

zresztą dobrym punktem wyjścia jest czekać na najmniej TOT Nums z znaków dla

es .: po 3 (czyli min długość słowo wyszukiwania mysql w większości przypadków) zwęgla następnie można zacznij szukać pliku DB lub json!

myślę, że trzeba dać do PHP lub innych twardą pracę jak FILTROWANIE etc, etc .. przed odesłać responce!

btw myślę jeden z najlepszych Automatyczne sugestie to jeden z brandspankingnew

Powiązane problemy