JQuery UI otomatik tamamlama widget'ına bir göz atmanızı tavsiye ederim. Kod tabanları orada olanlardan daha olgun olduğu için, vakaların çoğunu ele aldılar.
Aşağıda bir demo sayfasının bağlantısı bulunmaktadır, böylece çalıştığını doğrulayabilirsiniz. http://jqueryui.com/demos/autocomplete/#default
Kaynağı okumaktan ve nasıl çözdüklerini görmekten en iyi şekilde faydalanırsınız. Burada bulabilirsiniz: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Temelde her şeyi yapıyorlar, bağlanıyorlar input, keydown, keyup, keypress, focus and blur
. Sonra her türlü anahtar için özel kullanım var page up, page down, up arrow key and down arrow key
. Metin kutusunun içeriğini almadan önce bir zamanlayıcı kullanılır. Bir kullanıcı bir komuta karşılık gelmeyen bir anahtar yazdığında (yukarı tuşu, aşağı tuşu vb.) Yaklaşık 300 milisaniyeden sonra içeriği araştıran bir zamanlayıcı vardır. Kodda şöyle görünüyor:
// 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 );
},
Bir zamanlayıcı kullanmanın nedeni, kullanıcı arayüzünün güncellenme şansı elde etmesidir. Javascript çalışırken UI güncellenemez, bu nedenle gecikme işlevine çağrı. Bu, metin kutusuna odaklanma (bu kod tarafından kullanılan) gibi diğer durumlar için iyi çalışır.
Yani jQuery kullanıcı arabirimi kullanmıyorsanız widget'ı kullanabilir veya kodu kendi widget'ınıza kopyalayabilirsiniz (veya benim durumumda özel bir widget geliştiriyorsunuz).