Poleciłbym rzucić okiem na widget autouzupełniania interfejsu użytkownika jQuery. Zajęli się większością spraw, ponieważ ich baza kodu jest bardziej dojrzała niż większość obecnych.
Poniżej znajduje się link do strony demonstracyjnej, dzięki czemu możesz sprawdzić, czy działa. http://jqueryui.com/demos/autocomplete/#default
Największą korzyść uzyskasz, czytając źródło i sprawdzając, jak go rozwiązali. Można go znaleźć tutaj: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Zasadniczo robią to wszystko, z czym się wiążą input, keydown, keyup, keypress, focus and blur
. Następnie mają specjalną obsługę dla wszelkiego rodzaju kluczy, takich jak page up, page down, up arrow key and down arrow key
. Timer jest używany przed uzyskaniem zawartości pola tekstowego. Gdy użytkownik wpisze klawisz, który nie odpowiada poleceniu (klawisz w górę, klawisz w dół itd.), Pojawia się licznik czasu, który eksploruje zawartość po około 300 milisekundach. W kodzie wygląda to tak:
// switch statement in the
switch( event.keyCode ) {
//...
case keyCode.ENTER:
case keyCode.NUMPAD_ENTER:
// when menu is open and has focus
if ( this.menu.active ) {
// #6055 - Opera still allows the keypress to occur
// which causes forms to submit
suppressKeyPress = true;
event.preventDefault();
this.menu.select( event );
}
break;
default:
suppressKeyPressRepeat = true;
// search timeout should be triggered before the input value is changed
this._searchTimeout( event );
break;
}
// ...
// ...
_searchTimeout: function( event ) {
clearTimeout( this.searching );
this.searching = this._delay(function() { // * essentially a warpper for a setTimeout call *
// only search if the value has changed
if ( this.term !== this._value() ) { // * _value is a wrapper to get the value *
this.selectedItem = null;
this.search( null, event );
}
}, this.options.delay );
},
Powodem użycia timera jest to, że interfejs użytkownika ma szansę na aktualizację. Gdy JavaScript jest uruchomiony, interfejs użytkownika nie może zostać zaktualizowany, dlatego wywołanie funkcji opóźnienia. Działa to dobrze w innych sytuacjach, takich jak skupienie się na polu tekstowym (używanym przez ten kod).
Możesz więc użyć widgetu lub skopiować kod do własnego widgetu, jeśli nie używasz interfejsu jQuery (lub w moim przypadku opracowujesz niestandardowy widget).