โปรดทราบว่าdatalist
ไม่เหมือนกับไฟล์select
. ช่วยให้ผู้ใช้ป้อนค่าแบบกำหนดเองที่ไม่ได้อยู่ในรายการและจะเรียกค่าอื่นสำหรับอินพุตดังกล่าวโดยไม่ได้กำหนดค่าไว้ก่อน
วิธีที่เป็นไปได้ในการจัดการอินพุตของผู้ใช้คือการส่งค่าที่ป้อนตามที่เป็นอยู่ส่งค่าว่างหรือป้องกันการส่ง คำตอบนี้จัดการเฉพาะสองตัวเลือกแรกเท่านั้น
หากคุณต้องการไม่อนุญาตให้ผู้ใช้ป้อนข้อมูลทั้งหมดอาจselect
เป็นทางเลือกที่ดีกว่า
หากต้องการแสดงเฉพาะค่าข้อความของoption
รายการแบบเลื่อนลงเราใช้ข้อความด้านในสำหรับค่านั้นและไม่ต้องใช้value
แอตทริบิวต์ ค่าจริงที่เราต้องการส่งไปจะถูกเก็บไว้ในdata-value
แอตทริบิวต์ที่กำหนดเอง:
ในการส่งสิ่งนี้data-value
เราต้องใช้<input type="hidden">
ไฟล์. ในกรณีนี้เราจะไม่name="answer"
ใส่อินพุตปกติและย้ายไปยังสำเนาที่ซ่อนอยู่
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
วิธีนี้เมื่อข้อความในการป้อนข้อมูลเดิมที่มีการเปลี่ยนแปลงที่เราสามารถใช้จาวาสคริปต์ในการตรวจสอบว่าข้อความที่ยังอยู่ในและดึงข้อมูลของตนdatalist
data-value
ค่านั้นจะถูกแทรกลงในอินพุตที่ซ่อนและส่งแล้ว
document.querySelector('input[list]').addEventListener('input', function(e) {
var input = e.target,
list = input.getAttribute('list'),
options = document.querySelectorAll('#' + list + ' option'),
hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
inputValue = input.value;
hiddenInput.value = inputValue;
for(var i = 0; i < options.length; i++) {
var option = options[i];
if(option.innerText === inputValue) {
hiddenInput.value = option.getAttribute('data-value');
break;
}
}
});
จำเป็นต้องใช้id answer
และanswer-hidden
ในอินพุตปกติและที่ซ่อนไว้เพื่อให้สคริปต์ทราบว่าอินพุตใดเป็นของเวอร์ชันที่ซ่อนอยู่ วิธีนี้เป็นไปได้ที่จะมีหลายรายการinput
ในหน้าเดียวกันโดยมีdatalist
คำแนะนำอย่างน้อยหนึ่งรายการ
การป้อนข้อมูลของผู้ใช้จะถูกส่งตามที่เป็นอยู่ หากต้องการส่งค่าว่างเมื่อไม่มีอินพุตของผู้ใช้ในดาต้าลิสต์ให้เปลี่ยนhiddenInput.value = inputValue
เป็นhiddenInput.value = ""
ตัวอย่างการทำงาน jsFiddle: javascript ธรรมดาและjQuery
value=""
ควรมีความสำคัญเหนือสตริงภายในแท็กเมื่อใดก็ตามที่มีการvalue=""
ประกาศ ดังนั้นคำแนะนำคือให้ "คำตอบ" แอตทริบิวต์ค่าของคุณ