Tôi khuyên bạn nên xem qua tiện ích tự động hoàn thành giao diện người dùng jQuery. Họ đã xử lý hầu hết các trường hợp ở đó vì cơ sở mã của họ trưởng thành hơn hầu hết các trường hợp ngoài kia.
Dưới đây là một liên kết đến một trang demo để bạn có thể xác minh nó hoạt động. http://jqueryui.com/demos/autocomplete/#default
Bạn sẽ nhận được nhiều lợi ích nhất từ việc đọc nguồn và xem cách họ giải quyết nó. Bạn có thể tìm thấy nó ở đây: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Về cơ bản họ làm tất cả, họ ràng buộc input, keydown, keyup, keypress, focus and blur
. Sau đó, họ có xử lý đặc biệt cho tất cả các loại khóa như page up, page down, up arrow key and down arrow key
. Một bộ đếm thời gian được sử dụng trước khi nhận được nội dung của hộp văn bản. Khi người dùng nhập một khóa không tương ứng với một lệnh (phím lên, phím xuống và vv), có một bộ đếm thời gian khám phá nội dung sau khoảng 300 mili giây. Có vẻ như trong mã này:
// 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 );
},
Lý do để sử dụng bộ đếm thời gian là để UI có cơ hội được cập nhật. Khi Javascript đang chạy, UI không thể được cập nhật, do đó, gọi chức năng trì hoãn. Điều này hoạt động tốt cho các tình huống khác như giữ tập trung vào hộp văn bản (được sử dụng bởi mã đó).
Vì vậy, bạn có thể sử dụng tiện ích con hoặc sao chép mã vào tiện ích của riêng mình nếu bạn không sử dụng Giao diện người dùng jQuery (hoặc trong trường hợp của tôi là phát triển tiện ích tùy chỉnh).