datalist
'un select
ile aynı olmadığını unutmayın. Kullanıcıların listede olmayan bir özel değer girmelerine izin verir ve ilk önce bu tür girdiler için alternatif bir değer elde etmek imkansız olurdu.
Kullanıcı girdisini işlemenin olası yolları, girilen değeri olduğu gibi göndermek, boş bir değer göndermek veya göndermeyi engellemektir. Bu cevap sadece ilk iki seçeneği ele alır.
Kullanıcı girişini tamamen engellemek isterseniz, belki de select
daha iyi bir seçim olacaktır.
açılır menüde option
sadece metin değerini göstermek için, bunun için iç metin kullanmak ve value
niteliğini dışarıda bırakın. Birlikte göndermek istediğimiz gerçek değer, bir data-value
özniteliğinde saklanır:
Bu data-value
'u göndermek için bir <input type="hidden">
kullanmamız gerekir. Bu durumda, normal girdideki name="answer"
'u dışarıda bırakır ve gizli kopyaya taşırız. biz javascript kullanabilirsiniz orijinal giriş değişiklikleri metin datalist
metin de mevcut olmadığını kontrol edip data-value
getirmesi
<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,. 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.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;
}
}
});
düzenli ve gizli girişine kimliği answer
ve answer-hidden
hangi gizli versiyonunu ait olduğu giriş bilmek komut dosyası için gereklidir. Bu sayede aynı sayfada birden fazla input
s olması önerileri veren bir veya daha fazla datalist
s ile mümkündür.
Herhangi bir kullanıcı girişi olduğu gibi gönderilir. kullanıcı giriş datalist içinde mevcut değilken hiddenInput.value = label
için hiddenInput.value = ""
Çalışma jsFiddle örnekleri değiştirmek, boş bir değer göndermek için: plain javascript ve jQuery
Sanırım Firefox ve IE11 burada yanlış; [Bir] (https://html.spec.whatwg.org/multipage/forms.html#the-option-element) ve [Two] özelliklerine göre (http://www.w3.org/TR/2011) /WD-html5-author-20110809/the-option-element.html#the-option-element), "value =" "', bir "value =" olduğunda, etiketler içindeki bir dizgenin önüne geçmelidir. "" bildirildi. Yani öneri, değer öznitelik "cevabını" yapmak olurdu. – TylerH
@TylerH Hayır - Firefox ve IE11 burada doğru: Etiket niteliği, öğe için bir etiket sağlar. ** Bir seçenek öğesinin etiketi, etiket içeriği özniteliğinin değeridir, eğer varsa veya öğenin metin IDL özniteliğinin değeri. ** http://www.w3.org/ TR/html5/forms.html # attr-option-label – easwee
@easwee Sadece etiketin bir etiket varsa etiketin içinde olması gerektiği ve bir değer varsa değerin içinde olması gereken değer olması gerektiği yazıyor. Hangisinin öncelikli olduğunu belirtmez. – TylerH