遍历复选框并计数每个已选中或未选中的复选框


82

我遇到了一个问题。这是一个简短的解释。

我在标准表单上有12个复选框。我需要做的是遍历它们中的每一个,并了解哪些已选中,哪些未选中。

然后,我可以使用它构建一个字符串,然后将其输入数据库字段。这是一个例子。

(检查
1-选中)
(检查2-未选中)(检查3-已选中)

1,0,1

到目前为止,我已经有了这段代码。

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

除了只带回已检查的内容,而不是全部,它可以正常工作。

对不起,新问题。我是jquery的新手。


5
您应该重新设计数据库架构。
SLaks

重新设计如何?在一个字段中存储一组复选框是否比每个复选框都具有一个字段更好?
理查德M 2009年

4
显然,这取决于复选框是什么,但是您可能应该使用单个字段或子表(每个[选中的]复选框每行一个字段)
SLaks 2009年

“难道不是在一个字段中存储一组复选框要比每个复选框具有一个字段好吗?” 不,因为您的1和0不会存储为位,所以它们将存储为字节。如果将一个逗号分隔值位列表存储在一个字段中的原因是为了提高效率,那么请不要使用逗号,而应使用按位和掩码操作。尽管如今mysql已实现了bit数据类型,但是除非您正在编程信用卡芯片或需要绝对快速的功能,否则按位和掩码可能不是必需的。
Blue Water

Answers:


126

要完全按照您显示的格式构建结果字符串,可以使用以下命令:

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

谢谢。我会尝试的,让您知道。
理查德M 2009年

嗯 我试过了,但是它在控制台日志中显示了整个js文件。
理查德·M

1
我不能使用它,但需要使用$(this)
V-SHY 2016年

1
@ Si8-我更新了小提琴,因此代码忽略了未选中的复选框,这将减轻多余的逗号:jsfiddle.net/m4k6vj8x
Ed Schembor

61

使用选择器

您可以像这样获得所有选中的复选框:

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

以及所有未选中的内容,如下所示:

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

您只能循环浏览这些集合之一,并存储这些名称。如果不存在任何内容,则说明已检查或未检查任何内容。在PHP中,如果您检查了一组名称,则可以简单地提出一个in_array()请求,以了解是否应在以后检查任何特定的框。

连载

jQuery还具有一个序列化方法,该方法将维护表单控件的状态。例如,jQuery网站上提供的示例如下:

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 2009年

您也可以使用value属性。如果您试图创建一个二进制值,则为每个复选框增加2的幂,然后将选中的值加起来,二进制的总和将等于附加的1和0。您将被限制为32个复选框(JavaScript中的最大数值为2 ^ 32 [我认为可能是64]。更好的数据库设计将更加灵活)
Jason Sperske 09年

0

我认为没有足够的时间来关注原始文章中提出的架构注意事项。因此,这是任何新手都应考虑的事项。

假设您继续并构建了此解决方案。您的所有重要值都集中为一个值,并存储在数据库中。实际上,您确实在数据库中节省了[一点点]空间,并节省了一些时间编码。

现在,让我们考虑一下,您必须执行频繁且轻松的任务,即在当前复选框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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.