Я бы порекомендовал взглянуть на виджет автозаполнения 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 UI (или в моем случае разработку пользовательского виджета).