Przeglądaj pola wyboru i policz wszystkie zaznaczone lub niezaznaczone

82

Mam mały problem. Oto krótkie wyjaśnienie.

Mam 12 pól wyboru na standardowym formularzu. Muszę przejść przez każdy z nich i dowiedzieć się, które z nich są zaznaczone, a które niezaznaczone.

Korzystając z tego, mogę następnie zbudować ciąg, który następnie wprowadzam do pola bazy danych. Oto przykład.

(Check1 - zaznaczone)
(Check2 -
niesprawdzone ) (Check3 - zaznaczone)

1,0,1

Jak dotąd mam ten kawałek kodu.

$('input[type=checkbox]').each(function () {
           if (this.checked) {
               console.log($(this).val()); 
           }
});

Działa idealnie, z tym wyjątkiem, że przywraca tylko te sprawdzone, a nie wszystkie.

Przepraszam za nowe pytanie. Jestem trochę nowy w jquery.

Richard M.
źródło
5
Należy przeprojektować schemat bazy danych.
SLaks
Jak przeprojektować? Czy przechowywanie grupy pól wyboru w jednym polu nie jest lepsze niż posiadanie jednego pola dla każdego pola wyboru?
Richard M
4
To oczywiście zależy od tego, jakie są pola wyboru, ale prawdopodobnie powinieneś użyć pojedynczych pól lub tabeli podrzędnej (z jednym polem na wiersz na [zaznaczone] pole wyboru)
SLaks
„Czy przechowywanie grupy pól wyboru w jednym polu nie jest lepsze niż posiadanie jednego pola dla każdego pola wyboru?” Nie, ponieważ twoje jedynki i zera nie są przechowywane jako bity, są przechowywane jako bajty. Jeśli powodem przechowywania listy bitów wartości rozdzielanych przecinkami w jednym polu jest wydajność, to zgub przecinek i zamiast tego użyj operacji bitowych i maskowania . Chociaż mysql w dzisiejszych czasach zaimplementował typ danych bitowych, więc bitowa i maska ​​mogą nie być konieczne, chyba że programujesz chipy kart kredytowych lub potrzebujesz czegoś niesamowicie szybkiego.
Blue Water

Odpowiedzi:

126

Aby zbudować ciąg wynikowy dokładnie w pokazanym formacie, możesz użyć tego:

var sList = "";
$('input[type=checkbox]').each(function () {
    sList += "(" + $(this).val() + "-" + (this.checked ? "checked" : "not checked") + ")";
});
console.log (sList);

Zgodziłbym się jednak z @SLaks, myślę, że powinieneś ponownie przemyśleć strukturę, w której będziesz przechowywać to w swojej bazie danych.

EDYCJA : Przepraszam, źle odczytałem format wyjściowy, którego szukałeś. Oto aktualizacja:

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);
Ed Schembor
źródło
1
Jak rozumiem, chce napisu na 1s i 0s.
SLaks
Dzięki. Spróbuję tego i dam ci znać.
Richard M
Hmm. Próbowałem tego, ale wyświetlał cały plik js w dzienniku konsoli.
Richard M
1
Nie mogę korzystać z tego , ale trzeba używać $ (this)
V-SHY
1
@ Si8 - Zaktualizowałem skrzypce, więc kod ignoruje niezaznaczone pola wyboru, co powinno wyeliminować
Ed Schembor
61

Korzystanie z selektorów

Możesz uzyskać wszystkie zaznaczone pola wyboru w ten sposób:

var boxes = $(":checkbox:checked");

I wszystkie nie sprawdzone w ten sposób:

var nboxes = $(":checkbox:not(:checked)");

Możesz po prostu przejrzeć jedną z tych kolekcji i zapisać te nazwy. Jeśli czegoś nie ma, wiesz, że zostało sprawdzone lub nie. W PHP, jeśli masz tablicę nazw, które zostały sprawdzone, możesz po prostu in_array()poprosić o sprawdzenie, czy dane pole powinno zostać sprawdzone w późniejszym terminie.

Serializuj

jQuery ma również metodę serializacji, która zachowa stan kontrolek formularza. Na przykład przykład udostępniony na stronie jQuery jest następujący:

single=Single2&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio2

Umożliwi to zachowanie informacji, które elementy zostały również sprawdzone.

Sampson
źródło
16

Możesz przeglądać wszystkie pola wyboru, pisząc $(':checkbox').each(...).

Jeśli dobrze rozumiem Twoje pytanie, szukasz następującego kodu:

var str = "";

$(':checkbox').each(function() {
    str += this.checked ? "1," : "0,";
});

str = str.substr(0, str.length - 1);    //Remove the trailing comma

Ten kod przejdzie przez wszystkie pola wyboru i doda jeden 1,lub 0,do ciągu.

SLaks
źródło
Dzięki. Spróbuję również tego.
Richard M
Możesz również użyć atrybutu value. Jeśli próbujesz utworzyć wartość binarną, to nadaj każdemu polu wyboru moc wklęsłą 2 i po prostu dodaj zaznaczone, suma binarna będzie taka sama, jak dołączanie jedynek i zer. Będziesz ograniczony do 32 pól wyboru (największa wartość liczbowa to 2 ^ 32 w JavaScript [myślę, że może to być 64]. Lepszy projekt bazy danych byłby bardziej elastyczny)
Jason Sperske,
0

Nie sądzę, aby poświęcono wystarczająco dużo czasu na rozważania dotyczące schematu poruszone w oryginalnym poście. Więc tutaj jest coś do rozważenia dla każdego początkującego.

Powiedzmy, że poszedłeś do przodu i stworzyłeś to rozwiązanie. Wszystkie twoje wartości pomocnicze są łączone w jedną wartość i przechowywane w bazie danych. Rzeczywiście oszczędzasz [trochę] miejsca w swojej bazie danych i trochę czasu na kodowaniu.

Rozważmy teraz, że musisz wykonać częste i łatwe zadanie polegające na dodaniu nowego pola wyboru między obecnymi polami wyboru 3 i 4. Twój kierownik ds. Rozwoju, klient, cokolwiek oczekuje, że będzie to prosta zmiana.

Dodajesz więc pole wyboru do interfejsu użytkownika (łatwa część). Twój kod pętli już połączyłby wartości bez względu na liczbę pól wyboru. Wydajesz się również, że twoje pole bazy danych jest po prostu varchar lub innym typem ciągu, więc powinno też być w porządku.

Co się dzieje, gdy klienci lub Ty próbujesz przeglądać dane sprzed zmiany? Zasadniczo serializujesz od lewej do prawej. Jednak teraz wszystkie wartości po 3 są zmniejszone o 1 znak. Co zamierzasz zrobić ze wszystkimi istniejącymi danymi? Czy zamierzasz napisać aplikację, wyciągnąć ją z bazy danych, przetworzyć w celu dodania domyślnej wartości dla nowej pozycji pytania, a następnie zapisać ją z powrotem w bazie danych? Co się dzieje, gdy masz kilka nowych wartości w odstępie tygodnia lub miesiąca? Co się stanie, jeśli przeniesiesz lokalizacje, a jQuery przetwarza je w innej kolejności? Wszystkie twoje dane są w węźle i muszą zostać ponownie przetworzone, aby je zmienić.

Cała koncepcja NIE zapewniania ścisłej relacji klucz-wartość jest ludacris i zakończy się wpędzaniem cię w kłopoty raczej wcześniej niż później. Ci z was, którzy to rozważają, nie powinni. Inne sugestie dotyczące zmian schematu są w porządku. Użyj tabeli podrzędnej, większej liczby pól w tabeli głównej, tabeli pytań i odpowiedzi itp. Po prostu nie przechowuj danych bez etykiet, gdy struktura tych danych może ulec zmianie.

Nathon
źródło
-1
$.extend($.expr[':'], {
        unchecked: function (obj) {
            return ((obj.type == 'checkbox' || obj.type == 'radio') && !$(obj).is(':checked'));
        }
    });

$("input:checked")
$("input:unchecked")
Thulasiram
źródło