チェックボックスをループして、チェックされているものとチェックされていないものをそれぞれ数えます


82

私は少し問題に遭遇しました。ここに簡単な説明があります。

標準フォームに12個のチェックボックスがあります。私がする必要があるのは、それらのそれぞれをループして、どれがチェックされ、どれがチェックされていないかを学ぶことです。

これを使用して、文字列を作成し、それをデータベースフィールドに入力できます。これが例です。

(Check1-チェック済み)
(Check2-チェックなし)
(Check3-チェック済み)

1,0,1

これまでのところ、私はこのビットのコードを持っています。

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

すべてではなく、チェックされたものだけを戻すことを除いて、完全に機能します。

newbの質問でごめんなさい。私はjqueryに少し慣れていません。


5
データベーススキーマを再設計する必要があります。
SLaks 2009

どのように再設計しますか?チェックボックスのグループを1つのフィールドに格納する方が、チェックボックスごとに1つのフィールドを格納するよりも優れているのではないでしょうか。
リチャードM

4
これは明らかにチェックボックスが何であるかに依存しますが、おそらく個々のフィールドまたは子テーブル([チェック済み]チェックボックスごとに行ごとに1つのフィールド)を使用する必要があります
SLaks 2009

「チェックボックスのグループを1つのフィールドに格納する方が、チェックボックスごとに1つのフィールドを格納するよりも優れているのではないでしょうか。」 いいえ、1と0はビットとして保存されないため、バイトとして保存されます。1つのフィールドにコンマ区切り値のビットリストを格納する理由が効率のためである場合は、コンマを失い、代わりにビット単位のマスク操作を使用してください。ただし、最近のmysqlはビットデータ型を実装しているため、クレジットカードチップをプログラミングしている場合や、非常に高速なものが必要な場合を除いて、ビット単位とマスクは必要ない場合があります。
ブルーウォーター

回答:


127

表示した形式で結果文字列を正確に作成するには、次を使用できます。

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

ただし、@ SLaksには同意します。これをデータベースに格納する構造を、再検討する必要があると思います。

編集:申し訳ありませんが、私はあなたが探していた出力形式を読み間違えました。更新は次のとおりです。

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);

1
私が理解しているように、彼は1sと0sの文字列を望んでいます。
SLaks 2009

ありがとう。これを試して、お知らせします。
リチャードM

うーん。これを試しましたが、jsファイル全体がコンソールログに表示されました。
リチャードM

1
これは使用できませんが、$(this)
V-SHY 2016年

1
@ Si8-フィドルを更新したので、コードは選択されていないチェックボックスを無視します。これにより、余分なコンマが軽減されます。jsfiddle.net
Ed Schembor 2017年

61

セレクターの使用

次のように、すべてのチェックボックスをオンにすることができます。

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

そして、すべてこのようにチェックされていません:

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

これらのコレクションのいずれかを循環して、それらの名前を保存するだけで済みます。何かが欠けている場合は、チェックされているかチェックされていないかがわかります。PHPでは、チェックされた名前の配列がある場合in_array()、特定のボックスを後日チェックする必要があるかどうかを知るために要求を行うことができます。

シリアライズ

jQueryには、フォームコントロールの状態を維持するserializeメソッドもあります。たとえば、jQueryのWebサイトで提供されている例は次のとおりです。

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

これにより、チェックされた要素の情報も保持できるようになります。


16

を書くことで、すべてのチェックボックスをループできます$(':checkbox').each(...)

私があなたの質問を正しく理解しているなら、あなたは次のコードを探しています:

var str = "";

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

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

このコードは、すべてのチェックボックスをループして、1,または0,を文字列に追加します。


ありがとう。これも試してみます。
リチャードM

value属性を使用することもできます。バイナリ値を作成しようとしている場合は、各チェックボックスに2の累乗を与え、チェックされた値を加算するだけです。バイナリの合計は、1と0を加算するのと同じになります。チェックボックスは32個に制限されます(JavaScriptでは最大の数値は2 ^ 32です[64になる可能性があります]。データベース設計が優れていると、柔軟性が
高まります

0

元の投稿で取り上げられたスキーマの考慮事項に十分な時間が費やされていなかったと思います。だから、ここに初心者のために考慮すべきことがあります。

先に進んでこのソリューションを構築したとしましょう。すべてのmenial値は単一の値にまとめられ、データベースに保存されます。あなたは確かにあなたのデータベースの[少し]スペースとコーディングの時間を節約しています。

ここで、現在のチェックボックス3と4の間に新しいチェックボックスを追加するという頻繁で簡単なタスクを実行する必要があると考えてみましょう。開発マネージャー、顧客、これが単純な変更であると期待するものは何でも。

したがって、チェックボックスをUIに追加します(簡単な部分)。ループコードは、チェックボックスの数に関係なく、すでに値を連結しています。また、データベースフィールドは単なるvarcharまたはその他の文字列型であるため、問題ないはずです。

顧客またはあなたが変更前のデータを表示しようとするとどうなりますか?基本的に、左から右にシリアル化しています。ただし、3以降の値はすべて1文字ずれています。既存のすべてのデータをどうしますか?アプリケーションを作成し、それをすべてデータベースから引き出し、処理して新しい質問位置のデフォルト値を追加してから、すべてをデータベースに保存しますか?週または月ごとにいくつかの新しい値がある場合はどうなりますか?場所を移動し、jQueryがそれらを異なる順序で処理するとどうなりますか?すべてのデータはホースで接続されており、再配置するには再処理する必要があります。

緊密なキーと値の関係を提供しないという全体的な概念はリュダクリスであり、後でではなく早くトラブルに巻き込まれることになります。これを検討している方は、ご遠慮ください。スキーマ変更に関する他の提案は問題ありません。子テーブル、メインテーブルのその他のフィールド、質問と回答のテーブルなどを使用します。データの構造が変更される可能性がある場合は、ラベルのないデータを保存しないでください。


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

$("input:checked")
$("input:unchecked")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.