ฉันได้เขียนฟังก์ชันเติมข้อความอัตโนมัติพื้นฐานที่รับอาร์เรย์ข้อมูลและแสดงไว้ใต้แถบค้นหา เมื่อผู้ใช้ป้อนอักขระตัวเดียว ทุกอย่างทำงานได้ดี - รายการจะแสดงรายการที่ตรงกันและการคลิกที่รายการในรายการจะเป็นการปิดรายการและเพิ่มรายการที่คลิกลงในแถบค้นหา อย่างไรก็ตาม หากมีคนต้องการเปลี่ยน/ปรับแต่งค่าการค้นหาด้วยอักขระมากกว่าหนึ่งตัว ฉันสังเกตเห็นว่ามีบางอย่างเกิดขึ้น:
1. ฟังก์ชันจะวาดสำเนาเพิ่มเติม (ด้วยค่าใหม่) ของรายการผลลัพธ์ <ul>
แทนที่จะวาดรายการเดิมใหม่
<แข็งแกร่ง>2. การคลิกที่เป้าหมาย <li>
ในรายการไม่ได้เป็นการปิดรายการ
ฟังก์ชันนี้จะถูกเรียกใช้เมื่อใดก็ตามที่ตรวจพบ keyup
filterAutocomplete
รับอินพุตของแถบค้นหาที่เหมาะสมและรับอาร์เรย์ของรายการเพื่อส่งผ่านไปยังฟังก์ชันหลักของฉัน doAutocomplete
$(document).ready(function(){
$("#projectIDFrom").on('keyup', (function(){
var val = $(this).val().trim();
val = val.replace(/\s+/g, '');
var id = $("#projectIDFrom").attr('id');
filterAutoComplete(val, id);
}
));
})
ด้านล่างเป็นฟังก์ชั่นหลัก
function doAutocomplete(list, storeInput){
var query = $("#"+storeInput).val()
var drew = false;
//assign unique ID to results (handles multiple search bars on a page)
var resID = storeInput+ "Res";
//Build the box only if there's a value greater than 0
//in the target search bar
if($("#"+storeInput).val().length > 0){
//Case insensitive search for our array
var results = $.grep(list, function(item){
return item.search(RegExp(query, "i")) != -1;
});
//First search (no pre-existing list)
if(drew == false){
//Create list for results
$("#"+storeInput).after("<ul class='autoResult' id='"+ resID +"'></ul>");
//Prevent redrawing/binding of list
drew = true;
//Bind click event to list elements in results
$("#"+resID).on("click", "li", function(){
$("#"+storeInput).val($(this).text());
$("#"+resID).remove();
});
}
//remove if the value in search bar changes
//redraw occurs on next keypress
else if (drew == true){
$("#"+resID).remove();
}
//Add matching results to the list
for(var i = 0; i < results.length; i++){
$("#"+resID).append("<li>" + results[i] + "</li>");
}
}
//Handle backspace/delete so results don't remain
else if($("#"+storeInput).val().length < 1){
$("#"+resID).remove();
}
}
ฉันจะหลีกเลี่ยงการวาดสำเนารายการผลลัพธ์หลายชุด และรับฟังก์ชันเพื่อวาด/วาดใหม่รายการเดียวด้วยผลลัพธ์ใหม่ได้อย่างไร
ลิงก์ไปยัง JSFiddle ที่สร้างปัญหาที่ฉันอธิบายไว้ข้างต้นซ้ำ
ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก