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 );
},
タイマーを使用する理由は、UIが更新される機会を得るためです。JavaScriptが実行されている場合、UIを更新できないため、遅延関数の呼び出し。これは、(そのコードによって使用される)テキストボックスにフォーカスを維持するなど、他の状況でもうまく機能します。
したがって、jQuery UIを使用していない場合(または私の場合はカスタムウィジェットを開発している場合)、ウィジェットを使用するか、コードを独自のウィジェットにコピーできます。