ฉันอยากจะแนะนำให้ดูที่วิดเจ็ตเติมข้อความอัตโนมัติ 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
จากนั้นพวกเขามีการจัดการพิเศษสำหรับทุกประเภทของคีย์เช่น มีการใช้ตัวจับเวลาก่อนรับเนื้อหาของกล่องข้อความ เมื่อผู้ใช้พิมพ์คีย์ที่ไม่สอดคล้องกับคำสั่ง (คีย์ up, down down และอื่น ๆ ) จะมีตัวจับเวลาที่สำรวจเนื้อหาหลังจากนั้นประมาณ 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 (หรือในกรณีของฉันในการพัฒนาวิดเจ็ตที่กำหนดเอง)