Lưu ý rằng datalistkhông giống như a select. Nó cho phép người dùng nhập một giá trị tùy chỉnh không có trong danh sách và sẽ không thể tìm nạp một giá trị thay thế cho đầu vào đó mà không xác định nó trước.
Các cách có thể để xử lý thông tin nhập của người dùng là gửi giá trị đã nhập nguyên trạng, gửi giá trị trống hoặc ngăn việc gửi. Câu trả lời này chỉ xử lý hai tùy chọn đầu tiên.
Nếu bạn muốn hoàn toàn không cho phép người dùng nhập, có lẽ selectsẽ là lựa chọn tốt hơn.
Để chỉ hiển thị giá trị văn bản của optionmenu thả xuống, chúng tôi sử dụng văn bản bên trong cho nó và loại bỏ valuethuộc tính. Giá trị thực tế mà chúng tôi muốn gửi được lưu trữ trong data-valuethuộc tính tùy chỉnh :
Để gửi cái này, data-valuechúng tôi phải sử dụng một <input type="hidden">. Trong trường hợp này, chúng tôi loại bỏ name="answer"thông tin đầu vào thông thường và chuyển nó vào bản sao ẩn.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
Bằng cách này, khi văn bản trong đầu vào ban đầu thay đổi, chúng ta có thể sử dụng javascript để kiểm tra xem văn bản có hiện diện trong datalistvà tìm nạp nó hay không data-value. Giá trị đó được chèn vào đầu vào ẩn và được gửi.
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 answervà answer-hiddentrên đầu vào thông thường và đầu vào ẩn là cần thiết để tập lệnh biết đầu vào nào thuộc phiên bản ẩn nào. Bằng cách này, có thể có nhiều người inputtrên cùng một trang với một hoặc nhiều người datalistcung cấp đề xuất.
Mọi đầu vào của người dùng đều được gửi nguyên trạng. Để gửi một giá trị trống khi đầu vào của người dùng không có trong danh sách dữ liệu, hãy thay đổi hiddenInput.value = inputValuethànhhiddenInput.value = ""
Các ví dụ về jsFiddle đang làm việc: javascript thuần và jQuery
value=""sẽ được ưu tiên hơn một chuỗi trong các thẻ, bất cứ khi nào có mộtvalue=""khai báo. Vì vậy, đề xuất sẽ là đặt "câu trả lời" thuộc tính giá trị của bạn.