Perhatikan bahwa datalist
tidak 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 select
akan menjadi pilihan yang lebih baik.
Untuk hanya menampilkan nilai teks dari option
dalam dropdown, kami menggunakan teks bagian dalam untuk itu dan meninggalkan value
atributnya. Nilai sebenarnya yang ingin kami kirimkan disimpan dalam data-value
atribut khusus :
Untuk mengirimkan ini data-value
kita 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 datalist
dan 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 answer
dan answer-hidden
pada input reguler dan tersembunyi diperlukan agar skrip mengetahui input mana yang termasuk dalam versi tersembunyi mana. Dengan cara ini dimungkinkan untuk memiliki beberapa input
s pada halaman yang sama dengan satu atau lebih datalist
s memberikan saran.
Setiap masukan pengguna dikirimkan apa adanya. Untuk mengirimkan nilai kosong saat input pengguna tidak ada di datalist, ubah hiddenInput.value = inputValue
kehiddenInput.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.