Checkbox-Eingabefelder können nur zwei Zustände haben: ausgewählt oder nicht ausgewählt. Sie können jeden Wert haben, aber sie übermitteln diesen Wert (ausgewählt) oder nicht (nicht ausgewählt) bei einer Formularübermittlung. Der Standard ist nicht ausgewählt. Sie können das in HTML wie folgt steuern
<!-- Default to unchecked -->
<input type="checkbox">
<!-- Default to checked, XHTML -->
<input type="checkbox" checked="checked" />
<!-- Default to checked, HTML5 -->
<input type="checkbox" checked>
Visuell gibt es tatsächlich drei Zustände, in denen sich eine Checkbox befinden kann: ausgewählt, nicht ausgewählt oder unbestimmt. Sie sehen so aus

Hier sind einige Dinge, die Sie über unbestimmte Checkboxen wissen sollten
Sie können eine Checkbox nicht über HTML unbestimmt machen. Es gibt kein Attribut für unbestimmt. Es ist jedoch eine Eigenschaft von Checkboxen, die Sie über JavaScript ändern können.
var checkbox = document.getElementById("some-checkbox");
checkbox.indeterminate = true;
oder im jQuery-Stil
$("#some-checkbox").prop("indeterminate", true); // prop is jQuery 1.6+
Der unbestimmte Zustand ist nur visuell. Die Checkbox hat immer noch entweder den Status ausgewählt oder nicht ausgewählt. Das bedeutet, dass der visuelle unbestimmte Zustand den tatsächlichen Wert der Checkbox verbirgt, also sollte das in Ihrer Benutzeroberfläche Sinn ergeben!
Wie die Checkboxen selbst, **sieht der unbestimmte Zustand in verschiedenen Browsern unterschiedlich aus.** Hier ist Opera 11.50 auf Mac

Anwendungsfall
Der Grund, warum ich das schreibe, ist, dass mir gerade ein Anwendungsfall für diesen Zustand aufgefallen ist: verschachtelte Checkboxen. Jede Checkbox kann Kind-Checkboxen haben. Wenn alle diese Kinder ausgewählt sind, kann sie ausgewählt werden. Wenn keines ausgewählt ist, ist sie nicht ausgewählt. Wenn *einige* davon ausgewählt sind, befindet sie sich in einem unbestimmten Zustand (in diesem Fall symbolisch „teilweise“ ausgewählt).

Hier ist das in jQuery
Siehe den Pen Indeterminate Checkboxes von Chris Coyier (@chriscoyier) auf CodePen.
Hier ist eine alternative jQuery-Version von TheNotary.
Und hier ist eine reine JavaScript-Version von Jakob Eriksen
Siehe den Pen
Indeterminate Checkboxes (Vanilla JS) von jakob-e (@jakob-e)
auf CodePen.
Und ein paar alternative Ansätze von Alvaro Montoro , Bramus, Gridbuilder, Lewin Probst und Jason Wilson.
Verwendung von StimulusJS von Stephen Margheim
Siehe den Pen
checkbox family von Stephen Margheim (@smargh)
auf CodePen.
Rotation zwischen den Zuständen
Jon Stuebe hat mit der Idee experimentiert, den Zustand mit einem Klick zwischen nicht ausgewählt, unbestimmt und ausgewählt zu wechseln. Hier ist etwas jQuery, um das zu tun
var $check = $("input[type=checkbox]"), el;
$check
.data('checked',0)
.click(function(e) {
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);
}
});
Siehe den Pen Rotate Through Indeterminate Checkboxes von Chris Coyier (@chriscoyier) auf CodePen.
Der Leser Casual Trash hat mir eine bibliotheksfreie und wesentlich prägnantere Version zum Durchwechseln aller drei visuellen Zustände geschickt, die das `readonly`-Attribut nutzt, das Checkbox-Eingabefelder haben können.
<!-- Inline click handler, just for demo -->
<input type="checkbox" id="cb1" onclick="ts(this)">
function ts(cb) {
if (cb.readOnly) cb.checked=cb.readOnly=false;
else if (!cb.checked) cb.readOnly=cb.indeterminate=true;
}
Siehe den Pen Rotate Through Indeterminate Checkboxes von Chris Coyier (@chriscoyier) auf CodePen.
Vielen Dank,
Ich habe gerade vor ein paar Tagen versucht herauszufinden, wie man es implementiert.
Ich habe beschlossen, es wie bei Gmail zu machen: opacity: .5;
Jetzt denke ich darüber nach, den Code neu zu schreiben.
Danke für das Teilen, das wusste ich nie :)
Sie beginnen damit, dass Checkboxen nur zwei Werte haben. Checkboxen haben jedoch auch das Attribut „value“. Meinten Sie so etwas wie „state“?
http://w3schools.com/html5/att_input_value.asp
Ich stimme zu… kleiner Fehler von Chris, ich bin sicher, er hat es in Eile gemacht.
Aber eine großartige Lektion.
Wie ist die Browserunterstützung dafür?
Ich habe ein wenig getestet und festgestellt, dass es bis zurück zu IE 6 funktioniert.
PS: Gutes Tutorial Chris, ich habe das kürzlich irgendwo gesehen, nicht so detailliert wie dieses.
Aus reiner Neugier: Welchen Wert würde eine unbestimmte Checkbox in diesem Beispiel zurückgeben?
Das Attribut `indeterminate` steht nicht in Bezug zu `checked`/`unchecked` oder dem `value`-Attribut. Eine unbestimmte, ausgewählte Checkbox mit dem Wert 42 würde 42 zurückgeben, eine unbestimmte, nicht ausgewählte Checkbox mit dem Wert 37 würde nichts zurückgeben.
Ich glaube nicht, dass Chrome uns das erlaubt :/
Funktioniert bei mir in Chrome einwandfrei
Ja, in Chrome funktioniert es wirklich nicht.
Funktioniert bei mir einwandfrei? Haben Sie die neueste Version von Chrome?
Natürlich :) Chrome-Version – 13.0.782.112 m (für Windows)
Der Grund, warum Checkboxen in Opera in Ihrer Demo so hässlich aussehen, ist diese CSS-Regel
Wenn Sie versuchen, Checkboxen (und auch Radios) in Opera zu stylen, bekommen sie diesen hässlichen „Windows 98“-Look.
Warum haben Sie .prop() anstelle von .attr() verwendet?
Ich bin kein Experte auf diesem Gebiet – `.prop()` ist für mich neu – aber hier ist, was die Dokumentation sagt
Das wusste ich nicht.
Vielen Dank für das Teilen.
Wow, das ist verrückt! Ich hatte keine Ahnung, dass Browser das überhaupt unterstützen.
Danke!
Hallo Chris,
Ich weiß nicht, ob das normal ist
wählen Sie zuerst „giants“ aus, dann deaktivieren Sie „andre“ und „paul bunyan“ und sehen Sie dann, was passiert
Siehe letzte Zeile.
Nun, ich sehe viel Logik darin… Wenn keine der Kinder ausgewählt sind, gibt es keinen Grund, warum die Eltern ausgewählt sein sollten.
Es ist eine sehr logische Einschränkung….
Ich benutze seit über 10 Jahren Checkboxen und andere Formularelemente, aber ich lerne wohl jeden Tag etwas Neues!
Der beste Anwendungsfall, den ich dafür gesehen habe, ist in der Git-Tower-App. Sie verwenden die unbestimmte Checkbox, wenn nur ein Teil einer Datei gestaged ist.
Hier ist ein Screenshot, der es zeigt
http://bit.ly/ornzBG
Danke! Man lernt jeden Tag etwas Neues!
Man lernt etwas Neues… manchmal.
Ausgezeichnet, kannte diesen Trick nicht,
Meine Javascript/jQuery-Kenntnisse sind sehr begrenzt, aber ich wollte versuchen, Änderungen rekursiv zu machen. Es gibt immer noch Probleme damit. Jemand anderes könnte es wahrscheinlich viel besser machen.
Ich denke immer wieder über einen anderen Weg nach
- Ereignisdelegation mit jQuery
$(‘ul’).delegate(‘li’, ‘click’, function(event) {
// this == li element
});
- ein multidimensionales Array, das alle aktuellen Zustände der `
um einen Mechanismus bereitzustellen, um die Klasse „indeterminate“ zu allen benötigten `li`-Elementen hinzuzufügen oder zu entfernen.
Ich werde sehen, ob ich morgen Code zusammenstellen kann.
Oh mein Gott! Ich wusste nicht einmal, dass das möglich ist! Großartig :D
Chris,
Das Label für „Short Things“ scheint falsch zu sein
<label for="tall">Short Things</label>Sollte es nicht `<label for="short">...` sein?
Auf jeden Fall... das Klicken auf den Text „Short Things“ aktiviert die Checkbox „Tall Things“.
Es ist nur ein Tippfehler :)
Wenn Sie es in „short“ ändern (offensichtlich in der zweiten Instanz), funktioniert es wie erwartet; das heißt, es werden alle „Short Things“ ausgewählt.
behoben.
Hier ist mein Versuch
http://jsfiddle.net/davishmcclurg/fzELD/
Funktioniert auf meinem Nexus One mit Android nicht.
Toller Artikel und ein großartiges neues Design für die Website, Chris! Wirklich großartiges Design.
Neues Design sieht gut aus, mag die Buttons und den Regenbogen-Hover aber nicht
Schönes neues Design!
Ich frage mich, ob es irgendeine Möglichkeit gibt, diesen unbestimmten Status nach einer Formularübermittlung abzurufen.
Dies könnte nützlich sein, wenn Sie eine Art Umfrage interpretieren, um festzustellen, ob die Checkbox überhaupt angeklickt wurde (auf wahr oder falsch gesetzt) oder ob sie vollständig ignoriert wurde und somit nicht einmal angeklickt wurde.
Chris, hast du Informationen dazu?
Ich wette, das wäre auch für Wufoo von Vorteil. ;)
Da Sie es mit JS einstellen müssen, müssten Sie den tatsächlichen Wert der Checkbox irgendwie ändern. Also z.B. value = value + „-indeterminate“.
Ja,
Ich denke, eine Umgehungslösung würde funktionieren, da Sie bereits JS für die Anpassung verwenden.
Vielleicht macht HTML6 das. ;)
Danke für die schnelle Antwort!
Boolesche Eingabefelder mit mehr als 2 Zuständen?
Das ist fast so schlimm wie durch Null zu teilen!
Es funktioniert gut in Firefox und IE, aber ich habe Probleme mit Chrome. Gibt es eine schnelle Lösung?
Sieht gut aus, das einzige, was mir aufgefallen ist, ist, wenn man auf eine unbestimmte Checkbox klickt, verliert sie ihre „grüne“ Füllung/ihren Zustand, was meiner Meinung nach kein erwünschtes Verhalten ist?
Hallo,
Ich würde gerne dasselbe finden, aber mit einer „init“-Funktion. Dann, wenn einige Checkboxen „vorab“ ausgewählt sind (Formular vorab ausfüllen, z. B.) => es bestimmt die Zustände der übergeordneten Boxen vor jeder Änderung, mit niedriger zu hoher Priorität.
Irgendwelche Ideen?
Vielen Dank!!!
Ein Fehler im Zusammenhang mit dem unsachgemäßen Installationsattribut `indeterminate` wurde behoben und der Code optimiert. Jetzt hat er ein kleineres Volumen und unnötige Zyklen wurden entfernt.
Wie erreicht man das für das einfache HTML?
<input type="checkbox" value="something" indeterminate/>das funktioniert nicht
<input type="checkbox" value="something" indeterminate="true"/>auch dieses nicht
<input type="checkbox" value="something" indeterminate="indeterminate"/>Wie kann man es zum Funktionieren bringen.
Der Code schlägt in einem Szenario für meinen Code fehl, ich weiß nicht warum……
http://jsfiddle.net/sameerengg/84ajt/6/
Bitte helfen Sie.
Ich habe das Problem gefunden, `ul` war überflüssig und wurde entfernt, das funktioniert jetzt.
Es gibt noch ein Problem, das ich unter IE gefunden habe, wo wir eine teilweise ausgewählte Checkbox haben
Wenn Sie das ändern, wird das `change`-Ereignis nicht ausgelöst. Ich habe es auf das `click`-Ereignis umgestellt und es funktioniert für mich.