Я рекомендую переглянути віджет автозаповнення jQuery UI. Вони обробляли більшість випадків там, оскільки їх кодова база є більш зрілою, ніж більшість з них.
Нижче посилання на демонстраційну сторінку, щоб ви могли переконатися, що вона працює. http://jqueryui.com/demos/autocomplete/#default
Ви отримаєте найбільшу користь, прочитавши джерело та побачивши, як вони його вирішили. Ви можете знайти його тут: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
В основному вони все роблять, вони зобов'язуються input, keydown, keyup, keypress, focus and blur
. Потім у них є спеціальна обробка для подібних клавіш page up, page down, up arrow key and down arrow key
. Перед отриманням вмісту текстового поля використовується таймер. Коли користувач вводить ключ, який не відповідає команді (клавіша вгору, клавіша вниз та інше), існує таймер, який досліджує вміст приблизно через 300 мілісекунд. Це виглядає так у коді:
// 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 );
},
Причина використовувати таймер полягає в тому, що користувальницький інтерфейс отримує шанс оновитись. Коли Javascript працює, інтерфейс користувача не може бути оновлений, тому виклик до функції затримки. Це добре працює в інших ситуаціях, таких як збереження уваги на текстовому полі (використовується цим кодом).
Таким чином, ви можете або скористатися віджетом, або скопіювати код у свій власний віджет, якщо ви не використовуєте інтерфейс jQuery (або в моєму випадку розробляєте користувацький віджет).