Saya akan merekomendasikan untuk melihat widget autocomplete jQuery UI. Mereka menangani sebagian besar kasus di sana karena basis kode mereka lebih matang daripada kebanyakan di luar sana.
Di bawah ini adalah tautan ke halaman demo sehingga Anda dapat memverifikasinya berfungsi. http://jqueryui.com/demos/autocomplete/#default
Anda akan mendapatkan manfaat paling banyak dari membaca sumber dan melihat bagaimana mereka menyelesaikannya. Anda dapat menemukannya di sini: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Pada dasarnya mereka melakukan semuanya, mereka mengikat input, keydown, keyup, keypress, focus and blur
. Kemudian mereka memiliki penanganan khusus untuk semua jenis kunci seperti page up, page down, up arrow key and down arrow key
. Penghitung waktu digunakan sebelum mendapatkan isi dari kotak teks. Ketika pengguna mengetik kunci yang tidak sesuai dengan perintah (tombol atas, tombol bawah dan sebagainya) ada timer yang mengeksplorasi konten setelah sekitar 300 milidetik. Sepertinya ini dalam kode:
// 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 );
},
Alasan untuk menggunakan timer adalah agar UI mendapat kesempatan untuk diperbarui. Ketika Javascript sedang berjalan, UI tidak dapat diperbarui, oleh karena itu panggilan ke fungsi penundaan. Ini berfungsi dengan baik untuk situasi lain seperti menjaga fokus pada kotak teks (digunakan oleh kode itu).
Jadi Anda bisa menggunakan widget atau menyalin kode ke widget Anda sendiri jika Anda tidak menggunakan jQuery UI (atau dalam kasus saya mengembangkan widget khusus).