HTML'de üç durumlu onay kutusu mu?


163

HTML'de üç durumlu kontrol düğmesi (evet, hayır, null) olmanın bir yolu yoktur, değil mi?

Her şeyi tek başına yapmak zorunda kalmadan basit hileler veya geçici çözümler var mı?


İşlevsel olarak, kullanımınızdaki 'hayır' ve 'null' arasındaki fark nedir?
David, Monica

5
Aşağıdaki cevaplara bakınız (benimkiler hariç). "Boş", "Yanıt yok" gibi bir şey anlamına gelir ...
Franz

2
Kesinlikle. Ataları olan bir öğedir ve "null", "üst değeri kullan" anlamına gelir.
Pekka

7
Üç durumlu onay kutusu için alternatif bir kullanım, arama / filtreleme sırasındadır. Örneğin, kullanılmış arabaların listesini aramak için bir arayüzüm olduğunu varsayalım. Arama seçeneklerinden biri, arabanın sunroof olup olmadığı olabilir. Üç durum aşağıdaki gibi kullanılabilir: Sadece sunrooflu arabaları göster Sadece sunroof OLMAYAN arabaları göster üç radyo düğmesinden ... ancak üç durumlu bir onay kutusunun (boş, yeşil bir onay işareti veya içinde kırmızı bir x bulunması) da güzel bir çözümdür.
Mir

2
Geri kalan tüm kutuları işaretlemek veya işaretlerini kaldırmak için listenin başında bir onay kutusu bulunan bir onay kutuları listesi için yararlı olacaktır. Tümü işaretlenirse, başlık onay kutusu bunu yansıtabilir. Tümünün işareti kaldırılırsa, başlık onay kutusu da bunu yansıtabilir. Liste, işaretli ve işaretsiz kutuların bir kombinasyonunu içeriyorsa, başlık onay kutusunu ara durumda göstermek görsel geri bildirim sağlar. Bu başlık onay kutusu hiçbir zaman değer taşımaz - yalnızca görsel bir ipucu ve kullanıcı arayüzü yardımcısıdır. Kafa onay kutusunu her üç durum arasında değiştirebilmek de kullanışlı olacaktır.
Jason

Yanıtlar:


119

Edit - Janus Troelsen'in yorumu sayesinde daha iyi bir çözüm buldum:

HTML5 adlı onay kutuları için bir özellik tanımlar indeterminate

W3c başvuru kılavuzuna bakın . Onay kutusunun görsel olarak belirsiz görünmesini sağlamak için doğru olarak ayarlayın:

element.indeterminate = true;

İşte Janus Troelsen'in kemanı . Ancak şunu unutmayın:

  • Durum indeterminateHTML işaretlemesinde ayarlanamaz, yalnızca Javascript ile yapılabilir (bu JSfiddle testine ve CSS hilelerindeki bu ayrıntılı makaleye bakın )

  • Bu durum onay kutusunun değerini değiştirmez, yalnızca girişin gerçek durumunu maskeleyen görsel bir ipucudur.

  • Tarayıcı testi: Chrome 22, Firefox 15, Opera 12 ve IE7'ye geri döndü. Mobil tarayıcılarla ilgili olarak, iOS 3.1'deki Android 2.0 tarayıcısı ve Safari mobil desteği desteklemiyor.

Önceki cevap

Başka bir alternatif (Gmail, "bazı seçilmiş" devlet için onay kutusu şeffaflık ile oynamak olurdu gelmez önceki sürümlerinde yapmak için kullanılır). Bazı javascript ve CSS sınıfı gerektirir. Burada, kontrol edilebilir öğeler içeren bir liste ve tümünü / hiçbirini seçmeyi sağlayan bir onay kutusunu işleyen belirli bir örnek koydum. Bazı liste öğeleri seçildiğinde bu onay kutusu "bazı seçili" durumlarını gösterir.

Kimliği #select_allolan bir onay kutusu ve bir sınıfı olan birkaç onay kutusu verildiğinde .select_one,

"Tümünü seç" onay kutusunu kaybeden CSS sınıfı aşağıdaki gibidir:

.some_selected {
    opacity: 0.5;
    filter: alpha(opacity=50);
}

Tümünü seç onay kutusunun üç durumunu işleyen JS kodu şudur:

$('#select_all').change (function ()
{
    //Check/uncheck all the list's checkboxes
    $('.select_one').attr('checked', $(this).is(':checked'));
    //Remove the faded state
    $(this).removeClass('some_selected');
});

$('.select_one').change (function ()
{
  if ($('.select_one:checked').length == 0)
      $('#select_all').removeClass('some_selected').attr('checked', false);
  else if ($('.select_one:not(:checked)').length == 0)
      $('#select_all').removeClass('some_selected').attr('checked', true);
  else
      $('#select_all').addClass('some_selected').attr('checked', true);
});

Burada deneyebilirsiniz: http://jsfiddle.net/98BMK/

Umarım yardımcı olur!



1
Chrome v35'te test edildi ve "tümü" onay kutusu, yalnızca ilk tıklandığında diğer kutuları kontrol eder. Bundan sonra sadece diğer onay kutularının işaretini kaldırmaya çalışır. Bu sürümde düzeltildi: jsfiddle.net/CHRSb/1
rdans

2
.prop('checked', ...)yerine kullanılmalıdır .attr('checked', ...).
Luna

Ross'un işaret ettiği hataları düzelttim; burada yeni bir keman .
Mike DeSimone

48

Sen HTML'nin kullanabilirsiniz indeterminateIDL niteliğini üzerinde inputelemanları.


3
Bert Bos'a göre 2002'den gelen bir e-postada (< lists.w3.org/Archives/Public/www-dom/2002JanMar/0014.html> ), IE / Win ve IE / Mac sürüm 4'ten beri destekledi. 3.6 sürümünde uyguladık. Ayrıca 2008 yılında Safari'de uygulanmış gibi görünüyor. Bence bu pek çok son kullanıcı değil.
13'te Ms2ger

bunun yerine bu url'yi kullanın ( help.dottoro.com/ljuocesd.php ). O zamandan beri kimin desteklediğini (herkes bar operası) gösterir ve ne olduğunu görsel olarak gösterir. İnsanlar özellik sayfalarından korkuyor. Eklenti olmayan bir çözüm için +1
Hashbrown

15

Teklifim

  • üç durum için üç uygun unicode karakter, örneğin ❓, ✅, ❌
  • düz metin giriş alanı (boyut = 1)
  • sınır yok
  • Sadece oku
  • imleç gösterme
  • üç eyalet arasında geçiş yapmak için onclick işleyicisi

Örneklere bakın:

/**
 *  loops thru the given 3 values for the given control
 */
function tristate(control, value1, value2, value3) {
  switch (control.value.charAt(0)) {
    case value1:
      control.value = value2;
    break;
    case value2:
      control.value = value3;
    break;
    case value3:
      control.value = value1;
    break;
    default:
      // display the current value if it's unexpected
      alert(control.value);
  }
}
function tristate_Marks(control) {
  tristate(control,'\u2753', '\u2705', '\u274C');
}
function tristate_Circles(control) {
  tristate(control,'\u25EF', '\u25CE', '\u25C9');
}
function tristate_Ballot(control) {
  tristate(control,'\u2610', '\u2611', '\u2612');
}
function tristate_Check(control) {
  tristate(control,'\u25A1', '\u2754', '\u2714');
}
<input type='text' 
       style='border: none;' 
       onfocus='this.blur()' 
       readonly='true' 
       size='1' 
       value='&#x2753;' onclick='tristate_Marks(this)' />

<input style="border: none;"
       id="tristate" 
       type="text"  
       readonly="true" 
       size="1" 
       value="&#x2753;"  
       onclick="switch(this.form.tristate.value.charAt(0)) { 
     case '&#x2753': this.form.tristate.value='&#x2705;'; break;  
     case '&#x2705': this.form.tristate.value='&#x274C;'; break; 
     case '&#x274C': this.form.tristate.value='&#x2753;'; break; 
       };" />  



3

Bu işlevselliği elde etmek için radyo gruplarını kullanabilirsiniz:

<input type="radio" name="choice" value="yes" />Yes
<input type="radio" name="choice" value="No" />No
<input type="radio" name="choice" value="null" />null

1
Bunu biliyorum, teşekkürler. :) Şu anda seçimleri kullanıyorum, ancak form biraz dağınık hale geliyor.
Pekka

1
Peki, üçüncü devlet neye benziyor? Onay kutusunun devre dışı bırakılması gibi? Bunu nasıl tetiklemek istersiniz?
Franz


3

Bahsedilen indeterminateözelliği kullanarak çalıştırılabilir bir örnek :

const indeterminates = document.getElementsByClassName('indeterminate');
indeterminates['0'].indeterminate  = true;
<form>
  <div>
    <input type="checkbox" checked="checked" />True
  </div>
  <div>
    <input type="checkbox" />False
  </div>
  <div>
    <input type="checkbox" class="indeterminate" />Indeterminate
  </div>
</form>

Nasıl göründüğünü görmek için kod snippet'ini çalıştırmanız yeterlidir.


2

@Franz yanıtı gibi bunu bir seçim ile de yapabilirsiniz. Örneğin:

<select>
  <option></option>
  <option value="Yes">Yes</option>
  <option value="No">No</option>
</select>

Bu da formu ile gönderilecek somut bir değer verebilir, ben onay kutusunun javascript belirsiz sürümü ile, onay kutusunun alt çizgi değerini göndereceğini düşünüyorum.

En azından javascript devre dışı bırakıldığında geri arama olarak kullanabilirsiniz. Örneğin, bir kimlik verin ve load olayında, belirsiz durumdaki onay kutusunun javascript sürümüne değiştirin.


2

Yukarıda belirtilenlerin yanı sıra, yardımcı olabilecek jQuery eklentileri de vardır:

ayrı onay kutuları için:

ağaç benzeri davranış onay kutuları için:

DÜZENLEME Her iki kütüphane 'kullanır belirsiz HTML5 bu niteliği (Stil için sadece olduğundan,' kutusu özelliğini https://www.w3.org/TR/2011/WD-html5-20110113/number-state.html#checkbox-state ), null değeri hiçbir zaman sunucuya gönderilmez (onay kutularında yalnızca iki değer olabilir).

Bu değeri sunucuya gönderebilmek için, bazı javascript kullanarak form gönderiminde doldurulmuş gizli karşı alanlar oluşturdum. Sunucu tarafında, elbette orijinal onay kutuları yerine bu karşı alanları kontrol etmeniz gerekir.

İlk kütüphaneyi (bağımsız onay kutuları) kullandım:

  • İşaretli, denetlenmemiş, belirsiz değerleri başlatın
  • gerçek değeri almak için .val () işlevini kullanın
  • İş yapamıyorum. Devlet (muhtemelen benim hatam)

Umarım yardımcı olur.


2

İşte basit jQuery ve özelliği ile diğer Örnek data-checked:

 $("#checkbox")
  .click(function(e) {
    var el = $(this);

    switch (el.data('checked')) {

      // unchecked, going indeterminate
      case 0:
        el.data('checked', 1);
        el.prop('indeterminate', true);
        break;

        // indeterminate, going checked
      case 1:
        el.data('checked', 2);
        el.prop('indeterminate', false);
        el.prop('checked', true);
        break;

        // checked, going unchecked
      default:
        el.data('checked', 0);
        el.prop('indeterminate', false);
        el.prop('checked', false);

    }
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label><input type="checkbox" name="checkbox" value="" checked id="checkbox"> Tri-State Checkbox </label>


1

@BoltClock cevabına atıfta bulunarak , daha karmaşık bir özyinelemeli yöntem için benim çözümüm:

http://jsfiddle.net/gx7so2tq/2/

En güzel çözüm olmayabilir ama benim için iyi çalışıyor ve oldukça esnektir.

Kapsayıcıyı tanımlayan iki veri nesnesi kullanıyorum:

data-select-all="chapter1"

ve elementlerin kendisi:

data-select-some="chapter1"

Her ikisi de aynı değere sahip. Bir onay kutusundaki her iki veri nesnesinin birleşimi, yinelemeli olarak taranan alt düzeylere izin verir. Bu nedenle, değişiklik tetikleyicisini önlemek için iki "yardımcı" işlev gereklidir.



0

HTML form öğelerini devre dışı bırakmak mümkündür - öyle değil mi? Kullanıcılarınız üç durumdan birinde, yani işaretlenmiş, işaretlenmemiş ve devre dışı bırakılmış olarak görünecek ve bunlar gri renkte olacak ve tıklanamayacak. Bana göre, bu "null" veya "uygulanabilir değil" ya da üçüncü durumda aradığın şeye benziyor.


Çok iyi bir fikir, ama kullanıcının tekrar tıklayabilmesi için ihtiyacım var. Engelli bir onay kutusunda, olayları tetikleme konusunda sorun yaşayacağımdan korkuyorum.
Pekka

değer önemli değilse kullanıcı için kafa karıştırıcı olan devre dışı bırakılmış bir onay kutusunun değerini görmeye devam edebilirsiniz.
Janus Troelsen

Bence 'null' soruyu cevaplamayan kullanıcıyı temsil etmek anlamına geliyor. Bu, sorunun geçerli olmadığı anlamına gelmez.
bdsl


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.