Durchlaufen Sie die Kontrollkästchen und zählen Sie jedes aktivierte oder nicht aktivierte Kontrollkästchen

81

Ich bin auf ein Problem gestoßen. Hier ist eine kurze Erklärung.

Ich habe 12 Kontrollkästchen auf einem Standardformular. Was ich tun muss, ist, jeden von ihnen zu durchlaufen und zu erfahren, welche aktiviert und welche nicht aktiviert sind.

Auf diese Weise kann ich dann eine Zeichenfolge erstellen, die ich dann in ein Datenbankfeld eingebe. Hier ist ein Beispiel.

(Check1 - geprüft)
(Check2 - nicht geprüft)
(Check3 - geprüft)

1,0,1

Bisher habe ich diesen Code.

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

Es funktioniert perfekt, außer dass nur die geprüften zurückgebracht werden, nicht alle.

Entschuldigung für die neue Frage. Ich bin ein bisschen neu in jquery.

Richard M.
quelle
5
Sie sollten Ihr Datenbankschema neu gestalten.
SLaks
Wie neu gestalten? Ist es nicht besser, eine Gruppe von Kontrollkästchen in einem Feld zu speichern, als ein Feld für jedes Kontrollkästchen zu haben?
Richard M
4
Dies hängt natürlich von den Kontrollkästchen ab, aber Sie sollten wahrscheinlich entweder einzelne Felder oder eine
untergeordnete
"Ist es nicht besser, eine Gruppe von Kontrollkästchen in einem Feld zu speichern, als ein Feld für jedes Kontrollkästchen zu haben?" Nein, da Ihre Einsen und Nullen nicht als Bits gespeichert sind, werden sie als Bytes gespeichert. Wenn Ihr Grund für das Speichern einer Bitliste mit durch Kommas getrennten Werten in einem Feld die Effizienz ist, verlieren Sie das Komma und verwenden Sie stattdessen bitweise und Maskenoperationen . Obwohl MySQL heutzutage den Bit-Datentyp implementiert hat, sind Bitweise und Maske möglicherweise nicht erforderlich, es sei denn, Sie programmieren Kreditkartenchips oder benötigen etwas absolut blitzschnelles.
Blaues Wasser

Antworten:

125

Um eine Ergebniszeichenfolge genau in dem von Ihnen angezeigten Format zu erstellen, können Sie Folgendes verwenden:

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

Ich würde jedoch @SLaks zustimmen. Ich denke, Sie sollten die Struktur, in der Sie dies speichern, in Ihrer Datenbank überdenken.

EDIT : Entschuldigung, ich habe das gesuchte Ausgabeformat falsch gelesen. Hier ist ein Update:

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);
Ed Schembor
quelle
1
Soweit ich weiß, möchte er eine Zeichenfolge für 1s und 0s.
SLaks
Vielen Dank. Ich werde das ausprobieren und dich wissen lassen.
Richard M
Hmm. Ich habe es versucht, aber es zeigte die gesamte js-Datei im Konsolenprotokoll an.
Richard M
1
Ich kann nicht verwenden , dies aber notwendig verwenden $ (this)
V-SHY
1
@ Si8 - Ich habe die Geige aktualisiert, daher ignoriert der Code die nicht ausgewählten Kontrollkästchen, wodurch die zusätzlichen Kommas verringert werden
Ed Schembor
61

Verwenden von Selektoren

Sie können alle aktivierten Kontrollkästchen wie folgt erhalten:

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

Und alles nicht geprüft wie folgt:

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

Sie können lediglich eine dieser Sammlungen durchlaufen und diese Namen speichern. Wenn etwas fehlt, wissen Sie, dass es entweder überprüft wurde oder nicht. Wenn Sie in PHP eine Reihe von Namen hatten, die überprüft wurden, können Sie einfach eine in_array()Anfrage stellen, um zu erfahren, ob ein bestimmtes Kontrollkästchen zu einem späteren Zeitpunkt aktiviert werden soll oder nicht.

Serialisieren

jQuery verfügt außerdem über eine Serialisierungsmethode , mit der der Status Ihrer Formularsteuerelemente beibehalten wird. Das auf der Website von jQuery bereitgestellte Beispiel lautet beispielsweise wie folgt:

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

Auf diese Weise können Sie auch die Informationen behalten, auf die Elemente überprüft wurden.

Sampson
quelle
16

Sie können alle Kontrollkästchen durch Schreiben durchlaufen $(':checkbox').each(...).

Wenn ich Ihre Frage richtig verstehe, suchen Sie nach folgendem Code:

var str = "";

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

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

Dieser Code durchläuft alle Kontrollkästchen und fügt entweder 1,oder 0,zu einer Zeichenfolge hinzu.

SLaks
quelle
Vielen Dank. Ich werde es auch versuchen.
Richard M
Sie können auch das Wertattribut verwenden. Wenn Sie versuchen, einen Binärwert zu erstellen, geben Sie jedem Kontrollkästchen eine Inkaktion von 2 und addieren Sie einfach die aktivierten. Die Summe in Binär entspricht der Anhängung von Einsen und Nullen. Sie sind auf 32 Kontrollkästchen beschränkt (der größte numerische Wert ist 2 ^ 32 in JavaScript [ich denke, könnte 64 sein]. Ein besseres Datenbankdesign wäre flexibler)
Jason Sperske
0

Ich glaube, es wurde nicht genügend Zeit darauf verwendet, die im ursprünglichen Beitrag angesprochenen Schemaüberlegungen zu berücksichtigen. Also, hier ist etwas für Neulinge zu beachten.

Angenommen, Sie haben diese Lösung entwickelt. Alle Ihre einfachen Werte werden zu einem einzigen Wert zusammengefasst und in der Datenbank gespeichert. Sie sparen in der Tat [ein wenig] Speicherplatz in Ihrer Datenbank und etwas Zeit beim Codieren.

Betrachten wir nun, dass Sie die häufige und einfache Aufgabe ausführen müssen, ein neues Kontrollkästchen zwischen den aktuellen Kontrollkästchen 3 und 4 hinzuzufügen. Ihr Entwicklungsmanager, Kunde, was auch immer dies erwartet, ist eine einfache Änderung.

Sie fügen also das Kontrollkästchen zur Benutzeroberfläche hinzu (der einfache Teil). Ihr Schleifencode würde die Werte bereits verketten, unabhängig von der Anzahl der Kontrollkästchen. Sie stellen auch fest, dass Ihr Datenbankfeld nur ein Varchar oder ein anderer Zeichenfolgentyp ist, sodass es auch in Ordnung sein sollte.

Was passiert, wenn Kunden oder Sie versuchen, die Daten vor der Änderung anzuzeigen? Sie serialisieren im Wesentlichen von links nach rechts. Jetzt sind die Werte nach 3 jedoch alle um 1 Zeichen versetzt. Was machen Sie mit all Ihren vorhandenen Daten? Schreiben Sie eine Anwendung, ziehen Sie alles wieder aus der Datenbank, verarbeiten Sie es, um einen Standardwert für die neue Fragenposition hinzuzufügen, und speichern Sie es dann wieder in der Datenbank? Was passiert, wenn Sie im Abstand von einer Woche oder einem Monat mehrere neue Werte haben? Was ist, wenn Sie die Standorte verschieben und jQuery sie in einer anderen Reihenfolge verarbeitet? Alle Ihre Daten sind abgespritzt und müssen erneut verarbeitet werden, um sie neu anzuordnen.

Das gesamte Konzept, KEINE enge Schlüssel-Wert-Beziehung bereitzustellen, ist ludacris und wird Sie eher früher als später in Schwierigkeiten bringen. Für diejenigen unter Ihnen, die dies in Betracht ziehen, bitte nicht. Die anderen Vorschläge für Schemaänderungen sind in Ordnung. Verwenden Sie eine untergeordnete Tabelle, mehr Felder in der Haupttabelle, eine Frage-Antwort-Tabelle usw. Speichern Sie nur keine nicht beschrifteten Daten, wenn sich die Struktur dieser Daten ändern kann.

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

$("input:checked")
$("input:unchecked")
Thulasiram
quelle