Perhatikan bahwa datalisttidak sama dengan a select. Ini memungkinkan pengguna memasukkan nilai khusus yang tidak ada dalam daftar, dan tidak mungkin mengambil nilai alternatif untuk masukan seperti itu tanpa menentukannya terlebih dahulu.
Cara yang mungkin untuk menangani masukan pengguna adalah dengan mengirimkan nilai yang dimasukkan sebagaimana adanya, mengirimkan nilai kosong, atau mencegah pengiriman. Jawaban ini hanya menangani dua opsi pertama.
Jika Anda ingin melarang masukan pengguna sepenuhnya, mungkin selectakan menjadi pilihan yang lebih baik.
Untuk hanya menampilkan nilai teks dari optiondalam dropdown, kami menggunakan teks bagian dalam untuk itu dan meninggalkan valueatributnya. Nilai sebenarnya yang ingin kami kirimkan disimpan dalam data-valueatribut khusus :
Untuk mengirimkan ini data-valuekita harus menggunakan file <input type="hidden">. Dalam hal ini kita membiarkan name="answer"input reguler dan memindahkannya ke salinan tersembunyi.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
Dengan cara ini, ketika teks dalam masukan asli berubah, kita dapat menggunakan javascript untuk memeriksa apakah teks juga ada di datalistdan mengambilnya data-value. Nilai itu dimasukkan ke dalam input tersembunyi dan dikirimkan.
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 answerdan answer-hiddenpada input reguler dan tersembunyi diperlukan agar skrip mengetahui input mana yang termasuk dalam versi tersembunyi mana. Dengan cara ini dimungkinkan untuk memiliki beberapa inputs pada halaman yang sama dengan satu atau lebih datalists memberikan saran.
Setiap masukan pengguna dikirimkan apa adanya. Untuk mengirimkan nilai kosong saat input pengguna tidak ada di datalist, ubah hiddenInput.value = inputValuekehiddenInput.value = ""
Contoh jsFiddle yang berfungsi: javascript dan jQuery biasa
value=""harus didahulukan daripada string di dalam tag, setiap kali ada yangvalue=""dideklarasikan. Jadi sarannya adalah menjadikan "jawaban" sebagai atribut nilai Anda.