Ich würde empfehlen, einen Blick auf das Widget für die automatische Vervollständigung der jQuery-Benutzeroberfläche zu werfen. Sie haben die meisten Fälle dort bearbeitet, da ihre Codebasis ausgereifter ist als die der meisten anderen.
Unten finden Sie einen Link zu einer Demoseite, auf der Sie überprüfen können, ob sie funktioniert. http://jqueryui.com/demos/autocomplete/#default
Sie werden den größten Nutzen daraus ziehen, die Quelle zu lesen und zu sehen, wie sie sie gelöst haben. Sie finden es hier: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Im Grunde machen sie alles, an das sie sich binden input, keydown, keyup, keypress, focus and blur
. Dann haben sie spezielle Handhabung für alle Arten von Schlüsseln wie page up, page down, up arrow key and down arrow key
. Ein Timer wird verwendet, bevor der Inhalt des Textfelds abgerufen wird. Wenn ein Benutzer eine Taste eingibt, die keinem Befehl entspricht (Aufwärts-Taste, Abwärts-Taste usw.), gibt es einen Timer, der den Inhalt nach etwa 300 Millisekunden untersucht. Im Code sieht es so aus:
// 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 );
},
Der Grund für die Verwendung eines Timers besteht darin, dass die Benutzeroberfläche aktualisiert werden kann. Wenn Javascript ausgeführt wird, kann die Benutzeroberfläche nicht aktualisiert werden, daher der Aufruf der Verzögerungsfunktion. Dies funktioniert gut in anderen Situationen, z. B. wenn Sie sich auf das Textfeld konzentrieren (das von diesem Code verwendet wird).
Sie können also entweder das Widget verwenden oder den Code in Ihr eigenes Widget kopieren, wenn Sie nicht die jQuery-Benutzeroberfläche verwenden (oder in meinem Fall ein benutzerdefiniertes Widget entwickeln).