Özel değer girme seçeneğiyle HTML seçim formu


104

Kullanıcıların özel metin değeri girebilecekleri veya açılır menüden seçim yapabilecekleri bir giriş alanına sahip olmak istiyorum. <select>Yalnızca normal , açılır seçenekler sunar.

<select>Özel bir değeri nasıl kabul edebilirim ? Örneğin: Ford?

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

Seçime dinamik olarak bir seçenek eklemek için javascript kullanabilirsiniz, ancak bu bilgiyi kullanmak gerçek bir acıya dönüşür.
David

Bu seçeneği finnmglas.com/contact web siteme özel değerler için eklemedim, ancak birisi benimle özel bir değerle iletişime geçti. Bu çok garip
finnmglas

Yanıtlar:


249

HTML5'te yerleşik bir açılan kutu vardır. Bir metin inputve bir datalist. O zaman bir ekleme listiçin özellik inputdeğeri ile, idbir datalist.

Güncelleme: Mart 2019 itibarıyla tüm büyük tarayıcılar (artık Safari 12.1 ve iOS Safari 12.3 dahil) datalistbu işlevsellik için gereken seviyeyi desteklemektedir . Ayrıntılı tarayıcı desteği için caniuse'ye bakın .

Şöyle görünüyor:

<input type="text" list="cars" />
<datalist id="cars">
  <option>Volvo</option>
  <option>Saab</option>
  <option>Mercedes</option>
  <option>Audi</option>
</datalist>


3
Bu özellik yalnızca tarayıcıların yaklaşık% 50'si tarafından desteklenmektedir. Yalnızca en son firefox, chrome ve opera bunu destekler; IE, Safari ve mobil tarayıcılar bunu yapmaz. Bkz. Http://caniuse.com/
markmarijnissen

2
2016'nın ortalarında (2 yıldan fazla) ve çoğu tarayıcı, en azından önemli hatalar olmadan bunu hala tam olarak desteklemiyor. En azından Safari / Safari iOS dışındaki hemen hemen her şeyin son sürümlerinde bir şey çalışacaktır, ancak kullanım durumlarınızın düzgün çalıştığından emin olmak için test etmeniz gerekir. Hala en iyi cevap bu.
Michael Gaskill

1
Benim için iyi çalışıyor. Çoğu durumda eski tarayıcıları desteklememiz gerekmez. Kullanıcılara genişletilebilir bir ipucu vermek için yalnızca giriş alanının arka planına "aşağı ok" resmi ekledim. Kod (gerçek bir görüntü dosyasına ihtiyacınız var):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
Eugene Kardash

4
IE, Firefox ve Chrome'un son sürümlerinde test ettim ve hepsi iyi çalışıyor. Bunun, birçok durumda bu yaygın soruna harika ve basit bir çözüm olduğunu düşünüyorum.
kerl

3
Bunu gerçekten kullanmak istedim ama varsayılan bir değer belirlemem gerekiyordu. Kullanıcı, açılır menüdeki varsayılanı ve tüm seçenekleri (çünkü filtrelendikleri için) görür. Tüm seçenekleri görmeden önce giriş alanını temizlemeleri gerekir.
Justin

26

Alen Saqe'nin en son JSFiddle'ı benim için Firefox'ta geçiş yapmadı, bu yüzden, veri uzmanı etiketinin tüm tarayıcılar / cihazlar tarafından kabul edildiği güne kadar formlar içinde (gönderimle ilgili olarak) güzelce işleyecek basit bir html / javascript geçici çözümü sunacağımı düşündüm. Daha fazla ayrıntı ve nasıl çalıştığını görmek için şu adrese gidin: http://jsfiddle.net/6nq7w/4/ Not: Geçiş yapan kardeşler arasında boşluk bırakmayın !

<!DOCTYPE html>
<html>
<script>
function toggleField(hideObj,showObj){
  hideObj.disabled=true;        
  hideObj.style.display='none';
  showObj.disabled=false;   
  showObj.style.display='inline';
  showObj.focus();
}
</script>
<body>
<form name="BrowserSurvey" action="#">
Browser: <select name="browser" 
          onchange="if(this.options[this.selectedIndex].value=='customOption'){
              toggleField(this,this.nextSibling);
              this.selectedIndex='0';
          }">
            <option></option>
            <option value="customOption">[type a custom value]</option>
            <option>Chrome</option>
            <option>Firefox</option>
            <option>Internet Explorer</option>
            <option>Opera</option>
            <option>Safari</option>
        </select><input name="browser" style="display:none;" disabled="disabled" 
            onblur="if(this.value==''){toggleField(this,this.previousSibling);}">
<input type="submit" value="Submit">
</form>
</body>
</html>


Yine o şaşkınlığa gitmek istiyorum! Firefox'un cadı sürümü burada desteklenmiyordu! Hatırlamadığım bir sürümle test ettim! Tebrikler!
Alen Saqe

FF'nin hangi sürümünü kullandığımı bilmiyorum. FF34.0'a yeni bir göz attım ve şimdi işlevsellik alıyorum, bu yüzden endişelenmeyin. Ancak, varsayılan geçiş seçeneği "Diğer" kaldırılabilir. Değeri düzenleyerek "Diğer" i kaldırdığımda, açılır menü seçilecek sezgisel bir değer sunmuyor (düzenleme özelliğine erişmek için). Sanırım bu kişisel tercihlere bağlı. Alan düzenlenebilir olduğunda açılır menü oku hala mevcut olduğundan, kullanıcılar alanın düzenlenebilir olduğunun farkında olmayabilir. Size kazı yapmamak; sadece biraz geri bildirim. Snippet'im ayrıca bir <form> içindeki alan adlarını da dikkate alır.
mickmackusa

Bu ustaca ama (bana göre) script + html'nin nihai sonucu, seçilen seçenek değerini veya girilen metni aynı sayfanın GET'ine bir sorgu dizesi olarak eklemektir. Eylemi bir POST'a nasıl dönüştüreceğini bilen var mı, böylece bir php dosyasındaki değeri yakalayabilir ve onunla bir şeyler yapabilir miyim?
Han

Bu betiği, html form gönderimlerine uygun davranması için özel bir niyetle oluşturdum. Post yöntemini form etiketinde bir öznitelik olarak mı kullanıyorsunuz? @Han, izole edilmiş snippet'inizin 3v4l.org bağlantısını oluşturursanız, hızlıca bir göz atabilir ve muhtemelen tavsiyede bulunabilirim.
mickmackusa

1
Oğlum kendimi aptal gibi hissediyorum. Form etiketine bir yöntem eklemeyi unuttum. Bu çok küçük bir değişiklikle gönderildiği gibi çalıştı: <form name = "BrowserSurvey" method = "post" action = "/ gotThis.php"> ... Güzel komut dosyası, mickmackusa. Takip ipucunuz için teşekkürler!
Han

16

jQuery Çözümü!

Demo: http://jsfiddle.net/69wP6/2/

Aşağıda Başka Bir Demo (güncellendi!)

Sabit Seçeneklerim olduğunda ve bir başka seçeneğin düzenlenebilir olmasını istediğim bir durumda benzer bir şeye ihtiyacım vardı! Bu durumda, seçim seçeneğiyle örtüşecek ve düzenlenebilir olacak gizli bir girdi yaptım ve hepsinin sorunsuz çalışmasını sağlamak için jQuery'yi kullandım.

Keman çalmayı hepinizle paylaşıyorum!

HTML

<div id="billdesc">
    <select id="test">
      <option class="non" value="option1">Option1</option>
      <option class="non" value="option2">Option2</option>
      <option class="editable" value="other">Other</option>
    </select>
    <input class="editOption" style="display:none;"></input>
</div>

CSS

body{
    background: blue;
}
#billdesc{
    padding-top: 50px;
}
#test{
    width: 100%;
    height: 30px;
}
option {
    height: 30px;
    line-height: 30px;
}

.editOption{
    width: 90%;
    height: 24px;
    position: relative;
    top: -30px

}

jQuery

var initialText = $('.editable').val();
$('.editOption').val(initialText);

$('#test').change(function(){
var selected = $('option:selected', this).attr('class');
var optionText = $('.editable').text();

if(selected == "editable"){
  $('.editOption').show();


  $('.editOption').keyup(function(){
      var editText = $('.editOption').val();
      $('.editable').val(editText);
      $('.editable').html(editText);
  });

}else{
  $('.editOption').hide();
}
});

Düzenleme: Tasarım açısından bazı basit dokunuşlar eklendi, böylece insanlar girdinin nerede bittiğini açıkça görebilir!

JS Fiddle: http://jsfiddle.net/69wP6/4/


11

Gerçekten yapamazsınız. Hem açılır menüye hem de metin kutusuna sahip olmanız ve formu seçmelerini veya doldurmalarını sağlamanız gerekir. Javascript olmadan, açılır listeyi veya metin girişini seçtikleri ayrı bir radyo düğmesi kümesi oluşturabilirsiniz, ancak bu bana karmaşık geliyor. Bazı javascript'lerde, hangisini seçtiklerine bağlı olarak birini veya diğerini devre dışı bırakabilirsiniz, örneğin, açılır menüde metin alanını tetikleyen bir 'diğer' seçeneğine sahip olabilirsiniz.


9

Veri listesi seçeneği gereksinimlerinizi karşılamıyorsa, Select2 kitaplığına ve " Dinamik seçenek oluşturma " ya bir göz atın.

$(".js-example-tags").select2({
  tags: true
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>


<select class="form-control js-example-tags">
  <option selected="selected">orange</option>
  <option>white</option>
  <option>purple</option>
</select>


0

Yukarıdaki çözümlerden birini (@mickmackusa) kullanarak, Hooks kullanarak React 16.8+ ile çalışan bir prototip yaptım.

https://codesandbox.io/s/heuristic-dewdney-0h2y2

Umarım birine yardımcı olur.


Onur duydum. Kayıtlarımı yeni kontrol ettim ve bu Stack Overflow'da yaptığım 12. gönderiydi - sanki bir milyon yıl önce gibi geliyor.
mickmackusa

Demo bağlantınızla bir oyun oynadım ve iki tür alan arasında süresiz geçiş yapma etkisini kaybetmişsiniz gibi görünüyor.
mickmackusa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.