Consiglio di dare un'occhiata al widget di completamento automatico dell'interfaccia utente jQuery. Hanno gestito la maggior parte dei casi lì poiché la loro base di codice è più matura della maggior parte di quelli là fuori.
Di seguito è riportato un collegamento a una pagina demo in modo da poter verificare che funzioni. http://jqueryui.com/demos/autocomplete/#default
Otterrai il massimo beneficio leggendo la fonte e vedendo come l'hanno risolta. Puoi trovarlo qui: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Fondamentalmente fanno tutto, a cui si legano input, keydown, keyup, keypress, focus and blur
. Quindi hanno una gestione speciale per tutti i tipi di chiavi come page up, page down, up arrow key and down arrow key
. Un timer viene utilizzato prima di ottenere il contenuto della casella di testo. Quando un utente digita una chiave che non corrisponde a un comando (tasto su, tasto giù e così via) c'è un timer che esplora il contenuto dopo circa 300 millisecondi. Sembra così nel codice:
// 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 );
},
Il motivo per utilizzare un timer è che l'interfaccia utente ha la possibilità di essere aggiornata. Quando Javascript è in esecuzione, l'interfaccia utente non può essere aggiornata, pertanto la chiamata alla funzione di ritardo. Questo funziona bene per altre situazioni come concentrarsi sulla casella di testo (utilizzata da quel codice).
Quindi puoi utilizzare il widget o copiare il codice nel tuo widget se non stai utilizzando l'interfaccia utente di jQuery (o nel mio caso lo sviluppo di un widget personalizzato).