【问题标题】:Jquery - How can I check if all of the checkboxes are unchecked?Jquery - 如何检查是否所有复选框都未选中?
【发布时间】:2013-08-26 19:43:46
【问题描述】:

由于某种原因我的代码不起作用?!我需要选中复选框,如果所有复选框都“未选中”,则启用隐藏字段并将值发送到 db,这样我就可以确定复选框未选中。

问题 1:为什么我的 jquery 代码不起作用?

问题 2: 我需要将选中或未选中的值记录到 DB。我的计划是检查是否没有在 php.ini 中选择。这是一个好习惯吗?

HTML

<tr class="more_info">
        <th valign="top">Other options:</th>
        {foreach from=$HTML_cOPTIONS key=dbname item=optname}
            {if ! empty($CARINFO[car].{$dbname})}
                <td><input type="checkbox" id="forced_checkbox" name="c_options[]" value="{$dbname}" checked/> {$optname} </br></td>
            {else}
                <td><input type="checkbox" id="forced_checkbox" name="c_options[]" value="{$dbname}"/> {$optname} </br></td>
            {/if}
        {/foreach}
        <input type="hidden" id="forceSendCheckBox" name="c_options[]" value="nocheckboxes"/>
        <input type="button" value="Check" id="check" />
    </tr>

jQuery

$('#check').bind('click',function()
{
    if ($('#forced_checkbox').filter(':not(:checked)').length == 0) {
        console.log('at least one checked');
        $("#forceSendCheckBox").prop('disabled',true);//do not send this field to DB
    } else {
        console.log('nothing checked');
        $("#forceSendCheckBox").prop('disabled',false);//send empty checkboxes
    }
});

更新

这是一个小提琴,它似乎仍然坏了。 :-/

http://jsfiddle.net/L5J96/

【问题讨论】:

  • 为什么你的标题说你需要检查是否所有都被选中,而你的描述却说你需要询问是否所有都未选中?
  • 你没有元素id="check"
  • @crazy train,这是一个错字。您有超过 2000 个代表,并且无法编辑错字?!你花了更长的时间才发表评论。
  • @Timur:我不知道你想要哪个。大多数人会感谢你指出矛盾。归根结底,你的问题是你的责任,不是我的。
  • ...您知道,此代码:.filter(':not(:checked)').length == 0 与此消息相结合:console.log('at least one checked'),这看起来很奇怪。如果有0 未选中的框,那么会声明"all are checked",而不是"at least one checked"。因此,如果您想查看是否所有内容都“未选中”,那么您应该执行.filter(":checked").length == 0。或者如果您想知道是否至少检查了一个,那么:.filter(":checked").length

标签: php javascript jquery checkbox smarty


【解决方案1】:

ID 必须是唯一的。改用类。

在您的小提琴中,您遇到了几个问题。首先,您忘记从菜单中选择 jQuery 框架,因此没有任何 jQuery 代码起作用。其次,您将过滤器从not(:checked) 更改为(:checked),但没有将== 0 更改为&gt; 0。第三,没有not,过滤器选择器周围不应该有括号。第四,您尝试使用.text()在输入字段中显示消息,但正确的方法是.val()

这是更正后的代码:

$('#check').on('click', function () {
    if ($('.forced_checkbox').filter(':checked').length > 0) {
        $('#forceSendCheckBox').val('at least one checked');
    } else {
        $('#forceSendCheckBox').val('nothing checked');
    }
});

FIDDLE

【讨论】:

  • 我试过了,好像没用,我还在帖子里附上了小提琴
  • 我已经解决了你小提琴中的所有问题。
  • 实际上,改变了我的答案并选择了你的。我将事件附加到复选框,它就像一个魅力。我想我缺少的主要信息是 > 标志。谢谢。
【解决方案2】:

正如 Barmar 所说,ID 必须是唯一的。

接下来,使用.on() 而不是.bind() - 类似的语法,很容易做到。 (.bind 已弃用)

但是,要回答您的问题,您可以通过选中所有未选中的复选框并遍历它们来快速发现哪些复选框未选中。

如果您需要创建一个未选中复选框的列表,那么您需要每个复选框都具有独特性(如果房间里的每个人都被命名为“Bob”,那么列出所有棕色头发的男人的有用列表将很难)。为此使用 ID attr,如底部的 jsFiddle 示例所示。

$("input:checkbox:not(:checked)").each(function() {
    alert($(this).attr('id')); 
});

jsFiddle here

Here is an expanded jsFiddle example 演示了如何根据您的帖子中的要求将未选中的复选框列表保存到隐藏字段中。


关于您的 jsFiddle,需要调整以下内容:

See revised jsFiddle

  1. 使用.on() 语法。请改用.on(document).on(body)

    $('document').on('action', '#elementID', function() { //Do stuff here });

  2. 为了通过未检查对象的集合进行交互,您应该使用 jQuery 的.each() 方法。

    $('.forced_checkbox').filter(':not(:checked)').each(function() { //Do stuff });

希望这会有所帮助。

【讨论】:

  • 我从 bind() 改为 on() 并用 class 替换了 ID,它似乎仍然不起作用
  • 感谢 jsFiddle。 Try this one: http://jsfiddle.net/L5J96/1/。我相信这是你想要的。请注意,如果您希望跟踪 哪些 复选框未被选中,则可以使用唯一 ID 属性。
  • 谢谢,+1 迭代方法。那是我最终选择的那个。
猜你喜欢
  • 2012-05-14
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多