2015-04-26 18 views
39

Şu anda çoğu ana tarayıcıda (Safari hariç) HTML5 <datalist> öğesi destekleniyor ve bir girdiye öneri eklemek için ilginç bir yol gibi görünüyor. Bununla birlikte, value özniteliğinin uygulanmasıyla <option> iç metninin iç kısımları arasında bazı tutarsızlıklar var gibi görünmektedir. Örneğin:Veri etiketlerini göster ama asıl değeri gönder

Krom ve Opera:
Datalist in Chrome/Opera

FireFox ve IE 11:

<input list="answers" name="answer"> 
<datalist id="answers"> 
    <option value="42">The answer</option> 
</datalist> 

Bu farklı farklı tarayıcılar tarafından ele alınır
Datalist in FireFox

birini seçtikten sonra Girdi, iç metinle değil, değerle doldurulur. Sadece kullanıcının açılır menüdeki ve girişteki metni ("Cevap") görmesini istiyorum, ancak select gibi bir 42 değerini gönderim sırasında ilet.

Tüm tarayıcılarda, açılan listenin <option> s etiketlerini (iç metin) göstermesini, ancak form gönderildiğinde value özniteliğini nasıl gönderebilirim?

+0

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

+0

@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

+0

@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

cevap

49

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

+0

Aynı iç metinle, ancak farklı veri değerleriyle nasıl ilgilenirdiniz? Örneğin. http://jsfiddle.net/7k3sovht/78/ – bigbearzhu

+1

Anlatabildiğim kadarıyla, iki seçenek arasında ayrım yapmanın bir yolu yok. Çünkü dinlemek için kullanıcı olayı, seçtikleri ikisinden hangisinin seçildiğini bilmek imkansızdır; Tüm bildiğimiz, giriş alanında hangi değerin bittiğidir. –

+0

@StephanMuller benim gibi daha fazla HTML5 öğrenen biri için harika bir yanıt, teşekkürler! Gönderildikten sonra demo için metin kutusunu nasıl temizlersiniz? – Chris22

16

i kullanma çözelti

<input list="answers" id="answer"> 
<datalist id="answers"> 
    <option data-value="42" value="The answer"> 
</datalist> 

olduğu javascript yoluyla sunucuya gönderilecek değere erişim

umarım yardımcı olur

+0

Herhangi bir sebep tanımsız alıyorum? – Dejell

+1

Sorun, her adımda console.log ile çekilir. Aramakta olduğunuz aynı kimlik değerini kullandığınızdan emin olun. Ve ayrıca yarıçapları da kontrol edin. –

İlgili konular