Lưu ý rằng datalist
khô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ẽ select
sẽ là lựa chọn tốt hơn.
Để chỉ hiển thị giá trị văn bản của option
menu thả xuống, chúng tôi sử dụng văn bản bên trong cho nó và loại bỏ value
thuộc tính. Giá trị thực tế mà chúng tôi muốn gửi được lưu trữ trong data-value
thuộc tính tùy chỉnh :
Để gửi cái này, data-value
chú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 datalist
và 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 answer
và answer-hidden
trê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 input
trên cùng một trang với một hoặc nhiều người datalist
cung 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 = inputValue
thà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.