A datalist
ile aynı şey olmadığını unutmayın select
. Kullanıcıların listede olmayan özel bir değer girmelerine olanak tanır ve bu tür bir giriş için önce onu tanımlamadan alternatif bir değer getirmek imkansız olacaktır.
Kullanıcı girdilerini işlemenin olası yolları, girilen değeri olduğu gibi göndermek, boş bir değer göndermek veya göndermeyi önlemektir. Bu cevap yalnızca ilk iki seçeneği ele alır.
Kullanıcı girişine tamamen izin vermemek istiyorsanız, belki select
daha iyi bir seçim olabilir.
option
Açılır listedeki yalnızca metin değerini göstermek için , bunun için iç metni kullanırız ve value
niteliği dışarıda bırakırız . Göndermek istediğimiz gerçek değer, özel bir data-value
öznitelikte saklanır :
Bunu göndermek data-value
için bir <input type="hidden">
. Bu durumda name="answer"
, normal girdiyi dışarıda bırakır ve onu gizli kopyaya taşırız.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
Bu şekilde, orijinal girdideki metin değiştiğinde, metnin de içinde bulunup bulunmadığını kontrol etmek için javascript kullanabiliriz datalist
ve data-value
. Bu değer gizli girdiye eklenir ve gönderilir.
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;
}
}
});
Komut dosyasının hangi girdinin hangi gizli sürüme ait olduğunu bilmesi için id answer
ve answer-hidden
normal ve gizli girdiye ihtiyaç vardır. Bu şekilde input
, bir veya daha fazla datalist
öneriyle aynı sayfada birden çok URL'ye sahip olmak mümkündür .
Herhangi bir kullanıcı girişi olduğu gibi gönderilir. Kullanıcı girişi veri listesinde bulunmadığında boş bir değer göndermek için şu şekilde değiştirin hiddenInput.value = inputValue
:hiddenInput.value = ""
Çalışma jsFiddle örnekleri: düz javascript ve jQuery
value=""
, birvalue=""
bildirilen olduğunda, etiketlerin içindeki bir dizeden öncelikli olması gerektiği görülüyor . Dolayısıyla öneri, değer özelliğinizin "cevabını" yapmanız olacaktır.