我会推荐看看 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(或者在我的情况下开发自定义小部件),您可以使用小部件或将代码复制到您自己的小部件中。