HTMLのトライステートチェックボックス?


163

HTMLにトライステートチェックボタン(はい、いいえ、null)を設定する方法はありませんよね?

全体を自分でレンダリングする必要のない簡単なトリックや回避策はありますか?


機能的に、使用方法の「いいえ」と「null」の違いは何ですか?
デビッドはモニカを

5
以下の答えを見てください(私のものを除く)。「ヌル」は「無回答」のようなものを意味します...
フランツ

2
丁度。これは祖先を持つアイテムであり、「null」は「親の値を使用」を意味します。
Pekka、

7
トライステートチェックボックスの別の使用法は、検索/フィルタリング時です。たとえば、中古車のリストを検索するためのインターフェースがあるとしましょう。検索オプションの1つは、車にサンルーフがあるかどうかです。3つの状態は次のように使用できます。サンルーフ付きの車のみを表示しますサンルーフなしの車のみを表示します両方を表示します3つのラジオボタンの...トライステートチェックボックス(空、緑のチェック、または赤いxのいずれか)も、優れたソリューションです。
Mir

2
チェックボックスのリストに役立ちます。リストの先頭に1つのチェックボックスがあり、残りのすべてのボックスをオンまたはオフにします。すべてがチェックされている場合、ヘッダーチェックボックスはそれを反映できます。すべてがオフになっている場合、ヘッダーのチェックボックスもそれを反映できます。リストにチェックされたボックスとチェックされていないボックスの組み合わせが含まれている場合、中間状態でヘッダーチェックボックスを表示すると、視覚的なフィードバックが得られます。そのヘッダーのチェックボックスは決して値を運びません-それは単なる視覚的な合図とUI補助です。3つの状態すべての間でヘッドチェックボックスを切り替えることができることも便利です。
Jason

回答:


119

編集 — Janus Troelsenのコメントのおかげで、より良い解決策を見つけました。

HTML5は、呼び出されるチェックボックスのプロパティを定義します indeterminate

参照してくださいW3Cリファレンスガイドを。チェックボックスを視覚的に不確定に表示するには、trueに設定します。

element.indeterminate = true;

ここでヤヌスTroelsenのフィドルが。ただし、次のことに注意してください。

  • indeterminate状態は、HTMLマークアップに設定することができない、それだけで(この参照Javascriptを介して行うことができるJSfiddleテストし、このCSSのトリックで詳細な記事を

  • この状態はチェックボックスの値を変更しません。入力の実際の状態をマスクするのは視覚的な合図にすぎません。

  • ブラウザテスト:Chrome 22、Firefox 15、Opera 12で動作し、IE7に戻りました。モバイルブラウザーについては、Android 2.0ブラウザーとiOS 3.1上のSafariモバイルはサポートしていません。

前の答え

別の代替案は、「Gmail が行うように、「一部が選択された」状態のチェックボックスの透明度を試すことです以前のバージョンで使用していました)。それはいくつかのJavaScriptとCSSクラスを必要とします。ここでは、チェック可能な項目を含むリストと、それらのすべてを選択するかどうかを選択できるチェックボックスを処理する特定の例を示します。このチェックボックスは、一部のリスト項目が選択されているときに「一部が選択されている」状態を示します。

ID #select_allを持つチェックボックスとクラスを持ついくつかのチェックボックスが与えられた.select_one

「すべて選択」チェックボックスをフェードするCSSクラスは次のようになります。

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

そして、すべて選択チェックボックスのトライステートを処理するJSコードは次のとおりです。

$('#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);
});

ここで試すことができます:http : //jsfiddle.net/98BMK/

お役に立てば幸いです。



1
Chrome v35でテストされ、「すべて」のチェックボックスは、最初にクリックされたときに他のボックスのみをチェックします。この後は、他のチェックボックスをオフにするだけで機能します。:このバージョンで修正されたjsfiddle.net/CHRSb/1
rdans

2
.prop('checked', ...)の代わりに使用する必要があり.attr('checked', ...)ます。
ルナ

ロスが指摘したバグを修正しました。ここで新しいフィドル
Mike DeSimone、2015

48

要素でHTMLのindeterminateIDL属性を使用できますinput


3
2002年からのメールのBert Bos(< lists.w3.org/Archives/Public/www-dom/2002JanMar/0014.html>)によると、IE / WinおよびIE / Macはバージョン4以降でそれをサポートしています。Firefoxはバージョン3.6で実装されています。また、2008年にSafariに実装されたようです。これにより、エンドユーザーの数は多くなりません。
Ms2ger 2013年

代わりにこのURL(help.dottoro.com/ljuocesd.php)を使用してください。それは、いつから誰がそれをサポートするか(誰でも)を示し、それが何であるかを視覚的に表示します。人々はスペックページを怖がっています。このプラグインではないソリューションの+1
Hashbrown 2013年

15

私の提案は

  • 3つの状態に適切な3つのUnicode文字(例:❓、✅、❌)
  • プレーンテキスト入力フィールド(サイズ= 1)
  • 境界はない
  • 読み取り専用
  • カーソルを表示しない
  • 3つの状態を切り替えるonclickハンドラー

以下の例を参照してください。

/**
 *  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

ラジオグループを使用して、その機能を実現できます。

<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
わかっています、ありがとう。:)現在、selectを使用していますが、フォームが少し乱雑になっています。
Pekka、

1
さて、それでは、とにかく第3の状態はどのように見えるのでしょうか?チェックボックスが無効になっているときと同じですか?どのようにトリガーしますか?
フランツ、

3

最もセマンティックな方法はreadonly、チェックボックス入力が持つことができる属性を使用することだと思います。CSS、画像などはありません。組み込みのHTMLプロパティ!

Fiddleを参照してください: http :
//jsfiddle.net/chriscoyier/mGg85/2/

ここで最後のトリックで説明したように:http : //css-tricks.com/indeterminate-checkboxes/


素晴らしい解決策ですが、残念なことに、IEで動作しません(バージョン11でテスト)。高速クリックが認識されなくなったためです。
ViRuSTriNiTy 2015

3

上記のindeterminate属性を使用した実行可能な例を次に示します

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>

コードスニペットを実行して、どのように見えるかを確認してください。


2

@Franzの回答のように、selectを使用してそれを行うこともできます。例えば:

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

これにより、フォームで送信される具体的な値を指定することもできます。JavaScriptの不確定バージョンのチェックボックスでは、チェックボックスの下線の値が送信されると思います。

少なくとも、JavaScriptが無効になっている場合は、コールバックとして使用できます。たとえば、IDを指定し、ロードイベントで、ステータスが不確定のチェックボックスのJavaScriptバージョンに変更します。


2

上記のすべてに加えて、以下のjQueryプラグインも役立ちます。

個々のチェックボックス:

ツリーのような動作のチェックボックス:

EDIT 両方のライブラリは、 ' indeterminate 'チェックボックス属性を使用します。これは、Html5のこの属性がスタイリング(https://www.w3.org/TR/2011/WD-html5-20110113/number-state.html#checkbox-state)、null値がサーバーに送信されることはありません(チェックボックスは2つの値しか持てません)。

この値をサーバーに送信できるようにするために、JavaScriptを使用してフォームの送信時に入力される非表示の対応するフィールドを作成しました。サーバー側では、もちろん、元のチェックボックスではなく、対応するフィールドをチェックする必要があります。

最初のライブラリ(スタンドアロンのチェックボックス)を使用しましたが、次のことが重要です。

  • チェック済み、チェックなし、不確定の値を初期化する
  • .val()関数を使用して実際の値を取得する
  • 作業状態を作成できません(おそらく私の間違い)

お役に立てば幸いです。


2

単純なjQueryとプロパティを使用した他の例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 answerを参照して、より複雑な再帰的方法の解決策を次に示します

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

それは最もきれいな解決策ではないかもしれませんが、私にとってはうまく機能し、非常に柔軟です。

コンテナーを定義する2つのデータオブジェクトを使用します。

data-select-all="chapter1"

そして要素自体:

data-select-some="chapter1"

どちらも同じ値です。1つのチェックボックス内で両方のデータオブジェクトを組み合わせると、サブレベルが可能になり、再帰的にスキャンされます。したがって、変更トリガーを防止するには、2つの「ヘルパー」関数が必要です。



0

HTMLフォーム要素を無効にすることは可能です-そうではないでしょうか?ユーザーには、チェックされている、チェックされていない、および無効の3つの状態のいずれかで表示されます。これらはグレー表示され、クリックできません。私にとって、これは「null」や「該当なし」など、その3番目の状態で探しているものに似ています。


非常に良いアイデアですが、ユーザーがもう一度クリックできるようにする必要があります。チェックボックスが無効になっていると、イベントの起動などに問題が発生するのではないかと心配です。
Pekka

無効になっているチェックボックスの値は引き続き表示されますが、値が重要でない場合はユーザーを混乱させます。
Janus Troelsen 2012

「null」とは、質問に対する回答を提供していないユーザーを表すことを意味すると思います。それは必ずしも質問が当てはまらないことを意味するものではありません。
bdsl 2016年


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.