HTMLにトライステートチェックボタン(はい、いいえ、null)を持つ方法はありませんか?
全体を自分でレンダリングする必要がない単純なトリックや回避策はありますか?
Edit— Janus Troelsenのコメントのおかげで、より良い解決策が見つかりました。
indeterminate
と呼ばれるチェックボックスのプロパティを定義しますw3cリファレンスガイド を参照してください。チェックボックスを視覚的に不確定に表示するには、trueに設定します。
element.indeterminate = true;
ヤヌストロエルセンのフィドル です。ただし、次のことに注意してください。
indeterminate
状態はHTMLマークアップでは設定できません。Javascriptを介してのみ設定できます(この JSfiddleテスト およびこの CSSトリックの詳細な記事 を参照)
この状態はチェックボックスの値を変更せず、入力の実際の状態をマスクする視覚的な合図にすぎません。
ブラウザテスト:Chrome 22、Firefox 15、Opera 12でIE7に戻りました。モバイルブラウザに関しては、Android 2.0ブラウザとiOS 3.1上のSafariモバイルはサポートしていません。
前の回答
もう1つの方法は、「選択された」状態のチェックボックスの透明度を使用することです(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/
お役に立てば幸いです!
HTMLの indeterminate
IDL属性 をinput
要素で使用できます。
私の提案は
以下の例を参照してください。
HTMLソース:
<input type='text'
style='border: none;'
onfocus='this.blur()'
readonly='true'
size='1'
value='❓' onclick='tristate_Marks(this)' />
またはインラインjavascriptとして:
<input style="border: none;"
id="tristate"
type="text"
readonly="true"
size="1"
value="❓"
onclick="switch(this.form.tristate.value.charAt(0)) {
case '❓': this.form.tristate.value='✅'; break;
case '✅': this.form.tristate.value='❌'; break;
case '❌': this.form.tristate.value='❓'; break;
};" />
Javascriptソースコード:
<script type="text/javascript" charset="utf-8">
/**
* 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');
}
</script>
不定状態を使用できます: http://css-tricks.com/indeterminate-checkboxes/ 。すぐに使えるブラウザでサポートされており、外部jsライブラリは必要ありません。
最もセマンティックな方法は、チェックボックス入力が持つことができるreadonly
属性を使用していると思います。 CSS、画像なしなど。ビルトインHTMLプロパティ!
フィドルを参照:
http://jsfiddle.net/chriscoyier/mGg85/2/
最後のトリックでここに説明されているように: http://css-tricks.com/indeterminate-checkboxes/
ラジオグループを使用して、その機能を実現できます。
<input type="radio" name="choice" value="yes" />Yes
<input type="radio" name="choice" value="No" />No
<input type="radio" name="choice" value="null" />null
@Franzの回答のように、selectでそれを行うこともできます。例えば:
<select>
<option></option>
<option value="Yes">Yes</option>
<option value="No">No</option>
</select>
これにより、フォームで送信される具体的な値を指定することもできます。javascriptの不確定バージョンのチェックボックスでは、チェックボックスの下線値を送信すると思います。
少なくとも、javascriptが無効になっている場合は、コールバックとして使用できます。たとえば、idを指定し、loadイベントで、ステータスが不確定のJavaScriptバージョンのチェックボックスに変更します。
上記のすべてに加えて、役立つjQueryプラグインもあります。
個々のチェックボックスの場合:
ツリーのような動作のチェックボックスの場合:
EDIT両方のライブラリは、 'indeterminate'チェックボックス属性を使用します。 Html5のこの属性はスタイリングのためだけです( https://www.w3.org/TR/2011/WD-html5-20110113/number-state.html#checkbox-state )、null値サーバーに送信されることはありません(チェックボックスに指定できる値は2つだけです)。
この値をサーバーに送信できるように、JavaScriptを使用してフォームの送信時に入力される非表示の対応フィールドを作成しました。サーバー側では、もちろん、元のチェックボックスではなく、対応するフィールドをチェックする必要があります。
重要な最初のライブラリ(スタンドアロンチェックボックス)を使用しました。
それが役に立てば幸いです。
@BoltClock answer を参照すると、より複雑な再帰的メソッドのための私のソリューションがあります:
http://jsfiddle.net/gx7so2tq/2/
それは最もきれいな解決策ではないかもしれませんが、私にとってはうまく機能し、非常に柔軟です。
コンテナーを定義する2つのデータオブジェクトを使用します。
data-select-all="chapter1"
および要素自体:
data-select-some="chapter1"
両方とも同じ値を持ちます。 1つのチェックボックス内の両方のデータオブジェクトの組み合わせにより、サブレベルが許可され、再帰的にスキャンされます。したがって、変更トリガーを防ぐには、2つの「ヘルパー」関数が必要です。
https://github.com/supernifty/tristate-checkbox に簡単なJavaScriptトライステート入力フィールドの実装があります
HTMLフォーム要素を持つことは可能ですdisabled-そうではありませんか?ユーザーには、チェック、チェック解除、無効の3つの状態のいずれかで表示され、グレー表示されてクリックできません。私にとっては、それは「null」や「該当なし」、あるいはその3番目の状態で探しているものに似ています。
偽造するにはjavascript/cssを使用する必要があります。
例については、こちらをお試しください: http://www.dynamicdrive.com/forums/archive/index.php/t-26322.html