Jaka jest różnica między „nie” a „null” w Twoim użyciu?
David mówi, że przywróć Monikę
5
Spójrz na odpowiedzi poniżej (z wyjątkiem moich). „Brak” oznacza coś w rodzaju „Brak odpowiedzi” ...
Franz,
2
Dokładnie. Jest to pozycja z przodkami, a „null” oznacza „użyj wartości nadrzędnej”.
Pekka,
7
Alternatywnym zastosowaniem trójstanowego pola wyboru jest wyszukiwanie / filtrowanie. Na przykład załóżmy, że mam interfejs do przeszukiwania listy używanych samochodów. Jedną z opcji wyszukiwania może być to, czy samochód ma szyberdach. Te trzy stany mogą być użyte w następujący sposób: Pokaż tylko samochody z szyberdachem Pokaż tylko samochody BEZ szyberdachu Pokaż oba Teraz z pewnością można to załatwić na wiele sposobów ... możemy skorzystać z listy rozwijanej lub zestawu trzech przycisków opcji ... ale trójstanowe pole wyboru (które jest albo puste, ma zielony znacznik lub czerwony x) jest również dobrym rozwiązaniem.
Mir,
2
Przydałaby się lista pól wyboru, z jednym polem wyboru na początku listy, aby zaznaczyć lub odznaczyć wszystkie pozostałe pola. Jeśli wszystkie są zaznaczone, pole wyboru nagłówka może to odzwierciedlać. Jeśli wszystkie nie są zaznaczone, pole wyboru nagłówka również może to odzwierciedlać. Jeśli lista zawiera kombinację zaznaczonych i niezaznaczonych pól, wówczas wyświetlenie pola wyboru nagłówka w stanie pośrednim zapewni wizualną informację zwrotną. To pole wyboru w nagłówku nigdy nie zawierałoby wartości - to tylko wizualna wskazówka i pomoc w interfejsie użytkownika. Możliwość przełączania pola wyboru głowicy między wszystkimi trzema stanami również byłaby przydatna.
Jason
Odpowiedzi:
119
Edycja - dzięki komentarzowi Janusa Troelsena znalazłem lepsze rozwiązanie:
HTML5 definiuje właściwość dla pól wyboru o nazwie indeterminate
Ten stan nie zmienia wartości pola wyboru, jest jedynie wizualną wskazówką, która maskuje rzeczywisty stan wejścia.
Test przeglądarki: działał dla mnie w Chrome 22, Firefox 15, Opera 12 iz powrotem do IE7. Jeśli chodzi o przeglądarki mobilne, przeglądarka Android 2.0 i mobilna Safari na iOS 3.1 nie obsługują tego.
Poprzednia odpowiedź
Inną alternatywą byłaby gra z przezroczystością pola wyboru dla stanu „niektóre wybrane” (tak jak robił to Gmail w poprzednich wersjach). Będzie to wymagało trochę javascript i klasy CSS. Tutaj umieściłem konkretny przykład, który obsługuje listę z elementami możliwymi do zaznaczenia i polem wyboru, które pozwala wybrać wszystkie / żadne z nich. To pole wyboru pokazuje stan „niektóre wybrane”, gdy wybrane są niektóre elementy listy.
Biorąc pod uwagę pole wyboru z identyfikatorem #select_alli kilka pól wyboru z klasą .select_one,
Klasa CSS, która zanika pole wyboru „wybierz wszystko”, wyglądałaby następująco:
A kod JS obsługujący trójstanowe pole wyboru zaznacz wszystko jest następujący:
$('#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);elseif($('.select_one:not(:checked)').length ==0)
$('#select_all').removeClass('some_selected').attr('checked',true);else
$('#select_all').addClass('some_selected').attr('checked',true);});
Testowane w przeglądarce Chrome v35, a pole wyboru „wszystkie” zaznacza pozostałe pola tylko przy pierwszym kliknięciu. Po tym działa tylko odznaczenie innych pól wyboru. Naprawiono w tej wersji: jsfiddle.net/CHRSb/1
rdans
2
.prop('checked', ...)powinno być używane zamiast .attr('checked', ...).
Według Berta Bosa w e-mailu z 2002 roku (< lists.w3.org/Archives/Public/www-dom/2002JanMar/0014.html> ), IE / Win i IE / Mac obsługują go od wersji 4. Firefox wydaje się wdrożyliśmy go w wersji 3.6. Wygląda na to, że został również zaimplementowany w Safari w 2008 roku. Myślę, że to nie ma wielu użytkowników końcowych.
Ms2ger
użyj tego adresu URL ( help.dottoro.com/ljuocesd.php ). Pokazuje, kto ją wspiera (wszyscy opera barowa), od kiedy i wizualnie pokazuje, co to jest. Ludzie boją się stron specyfikacji. +1 za to rozwiązanie niebędące wtyczką
Hashbrown
15
Moja propozycja dotyczyłaby
trzy odpowiednie znaki Unicode dla trzech stanów, np. ❓, ✅, ❌
zwykłe pole tekstowe (rozmiar = 1)
bez granic
tylko czytać
nie wyświetlać kursora
obsługi onclick, aby przełączyć się przez trzy stany
/**
* 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');}
Możesz użyć stanu nieokreślonego: http://css-tricks.com/indeterminate-checkboxes/ . Jest obsługiwany przez przeglądarki po wyjęciu z pudełka i nie wymaga żadnych zewnętrznych bibliotek js.
Wiem, dzięki. :) Obecnie używam zaznaczeń, ale formularz jest trochę zaśmiecony.
Pekka,
1
Więc jak właściwie wyglądałby trzeci stan? Tak jak wtedy, gdy pole wyboru jest wyłączone? Jak chciałbyś to wywołać?
Franz
3
Myślę, że najbardziej semantycznym sposobem jest użycie readonlyatrybutu, który mogą mieć pola wyboru. Bez css, bez obrazów itp. wbudowana właściwość HTML!
Dzięki temu możesz również podać konkretną wartość, która zostanie wysłana z formularzem, myślę, że przy nieokreślonej wersji checkboxa javascript wyśle wartość podkreślenia checkboxa.
Przynajmniej możesz go użyć jako wywołania zwrotnego, gdy javascript jest wyłączony. Na przykład, nadaj mu identyfikator iw zdarzeniu load zmień go na wersję javascript pola wyboru o nieokreślonym statusie.
Aby móc przesłać tę wartość do serwera, utworzyłem ukryte pola odpowiedników, które są wypełniane podczas przesyłania formularza za pomocą javascript. Oczywiście po stronie serwera trzeba by zaznaczyć te pola odpowiedników zamiast oryginalnych pól wyboru.
Użyłem pierwszej biblioteki (samodzielne pola wyboru), w której ważne jest, aby:
Zainicjuj zaznaczone, niezaznaczone, nieokreślone wartości
użyj funkcji .val (), aby uzyskać rzeczywistą wartość
Może nie jest to najpiękniejsze rozwiązanie, ale dla mnie działa dobrze i jest dość elastyczne.
Używam dwóch obiektów danych definiujących kontener:
data-select-all="chapter1"
i same elementy:
data-select-some="chapter1"
Obie mają tę samą wartość. Połączenie obu obiektów danych w jednym polu wyboru umożliwia stosowanie podpoziomów, które są skanowane rekurencyjnie. Dlatego potrzebne są dwie funkcje „pomocnicze”, aby zapobiec wyzwalaniu zmiany.
Możliwe jest wyłączenie elementów formularza HTML - czy to nie zadziała? Twoi użytkownicy widzieliby go w jednym z trzech stanów, tj. Zaznaczony, niezaznaczony i wyłączony, który byłby wyszarzony i nie można go było kliknąć. Wydaje mi się, że jest to podobne do „nie dotyczy” lub „nie dotyczy” lub czegokolwiek, czego szukasz w tym trzecim stanie.
Bardzo dobry pomysł, ale potrzebuję, aby użytkownik mógł go ponownie kliknąć. Obawiam się, że na wyłączonym checkboxie będę miał problemy z odpalaniem zdarzeń i tak dalej.
Pekka
nadal możesz zobaczyć wartość wyłączonego pola wyboru, co jest mylące dla użytkownika, jeśli wartość nie jest ważna.
Janus Troelsen
Myślę, że „null” ma oznaczać, że użytkownik nie udziela odpowiedzi na pytanie. Nie musi to oznaczać, że pytanie nie ma zastosowania.
Odpowiedzi:
Edycja - dzięki komentarzowi Janusa Troelsena znalazłem lepsze rozwiązanie:
HTML5 definiuje właściwość dla pól wyboru o nazwie
indeterminate
Zobacz przewodnik referencyjny w3c . Aby pole wyboru wyglądało na nieokreślone wizualnie, ustaw je na true:
Oto skrzypce Janusa Troelsena . Należy jednak pamiętać, że:
indeterminate
Państwo nie może być ustawiony w znacznikach HTML, można to zrobić tylko poprzez JavaScript (zobacz tę próbę JSfiddle i to szczegółowy artykuł w sztuczek CSS )Ten stan nie zmienia wartości pola wyboru, jest jedynie wizualną wskazówką, która maskuje rzeczywisty stan wejścia.
Test przeglądarki: działał dla mnie w Chrome 22, Firefox 15, Opera 12 iz powrotem do IE7. Jeśli chodzi o przeglądarki mobilne, przeglądarka Android 2.0 i mobilna Safari na iOS 3.1 nie obsługują tego.
Poprzednia odpowiedź
źródło
.prop('checked', ...)
powinno być używane zamiast.attr('checked', ...)
.Możesz użyć
indeterminate
atrybutu IDL HTML nainput
elementach.źródło
Moja propozycja dotyczyłaby
Zobacz przykłady na:
źródło
Możesz użyć stanu nieokreślonego: http://css-tricks.com/indeterminate-checkboxes/ . Jest obsługiwany przez przeglądarki po wyjęciu z pudełka i nie wymaga żadnych zewnętrznych bibliotek js.
źródło
Możesz użyć grup radiowych, aby osiągnąć tę funkcję:
źródło
Myślę, że najbardziej semantycznym sposobem jest użycie
readonly
atrybutu, który mogą mieć pola wyboru. Bez css, bez obrazów itp. wbudowana właściwość HTML!Zobacz Fiddle:
http://jsfiddle.net/chriscoyier/mGg85/2/
Jak opisano tutaj w ostatniej sztuczce: http://css-tricks.com/indeterminate-checkboxes/
źródło
Oto działający przykład z użyciem wspomnianego
indeterminate
atrybutu :Po prostu uruchom fragment kodu, aby zobaczyć, jak to wygląda.
źródło
Podobnie jak odpowiedź @Franz, możesz to również zrobić za pomocą zaznaczenia. Na przykład:
Dzięki temu możesz również podać konkretną wartość, która zostanie wysłana z formularzem, myślę, że przy nieokreślonej wersji checkboxa javascript wyśle wartość podkreślenia checkboxa.
Przynajmniej możesz go użyć jako wywołania zwrotnego, gdy javascript jest wyłączony. Na przykład, nadaj mu identyfikator iw zdarzeniu load zmień go na wersję javascript pola wyboru o nieokreślonym statusie.
źródło
Oprócz wszystkich wymienionych powyżej, istnieją wtyczki jQuery, które również mogą pomóc:
dla poszczególnych checkboxów:
dla pól wyboru zachowań drzewiastych:
EDYCJA Obie biblioteki używają atrybutu pola wyboru „ nieokreślony ”, ponieważ ten atrybut w języku Html5 służy tylko do stylizacji ( https://www.w3.org/TR/2011/WD-html5-20110113/number-state.html#checkbox-state ), wartość null nigdy nie jest wysyłana na serwer (pola wyboru mogą mieć tylko dwie wartości).
Aby móc przesłać tę wartość do serwera, utworzyłem ukryte pola odpowiedników, które są wypełniane podczas przesyłania formularza za pomocą javascript. Oczywiście po stronie serwera trzeba by zaznaczyć te pola odpowiedników zamiast oryginalnych pól wyboru.
Użyłem pierwszej biblioteki (samodzielne pola wyboru), w której ważne jest, aby:
Mam nadzieję, że to pomoże.
źródło
Oto inny przykład z prostym jQuery i właściwością
data-checked
:źródło
W odniesieniu do odpowiedzi @BoltClock , oto moje rozwiązanie dla bardziej złożonej metody rekurencyjnej:
http://jsfiddle.net/gx7so2tq/2/
Może nie jest to najpiękniejsze rozwiązanie, ale dla mnie działa dobrze i jest dość elastyczne.
Używam dwóch obiektów danych definiujących kontener:
i same elementy:
Obie mają tę samą wartość. Połączenie obu obiektów danych w jednym polu wyboru umożliwia stosowanie podpoziomów, które są skanowane rekurencyjnie. Dlatego potrzebne są dwie funkcje „pomocnicze”, aby zapobiec wyzwalaniu zmiany.
źródło
Aby to sfałszować, musisz użyć javascript / css.
Wypróbuj tutaj przykład: http://www.dynamicdrive.com/forums/archive/index.php/t-26322.html
źródło
Możliwe jest wyłączenie elementów formularza HTML - czy to nie zadziała? Twoi użytkownicy widzieliby go w jednym z trzech stanów, tj. Zaznaczony, niezaznaczony i wyłączony, który byłby wyszarzony i nie można go było kliknąć. Wydaje mi się, że jest to podobne do „nie dotyczy” lub „nie dotyczy” lub czegokolwiek, czego szukasz w tym trzecim stanie.
źródło
Istnieje prosta implementacja trójstanowego pola wejściowego JavaScript pod adresem https://github.com/supernifty/tristate-checkbox
źródło
Wtyczka jQuery "jstree" z wtyczką checkbox może to zrobić.
http://www.jstree.com/documentation/checkbox
-Matt
źródło