jQuery: 判断复选框是否未被选中

145

我在解决问题时遇到了困难。我有两个复选框(未来可能会有更多):

  • checkSurfaceEnvironment-1
  • checkSurfaceEnvironment-2

基本上,我想编写一个 if 语句并测试其中一个被选中且另一个未被选中的情况。如何最简单地实现以下操作:

if ( $("#checkSurfaceEnvironment-1").attr('checked', true) &&
     $("#checkSurfaceEnvironment-2").is('**(NOT??)** :checked') ) {
        // do something
}

3
使用 || 而不是 && 来检查是否选中了“其中之一”。&& 用于检查是否 两者都 被选中。 - j08691
19个回答

259

我经常使用的一种可靠方法是:

if($("#checkSurfaceEnvironment-1").prop('checked') == true){
    //do something
}
如果你想迭代已勾选的元素,请使用父元素。
$("#parentId").find("checkbox").each(function(){
    if ($(this).prop('checked')==true){ 
        //do something
    }
});

更多信息:

这样做很有效,因为所有复选框都有一个名为 checked 的属性,它存储了复选框的实际状态。如果您希望检查页面并尝试选中和取消选中复选框,则会注意到属性“checked”(如果存在)将保持不变。此属性仅表示复选框的 初始状态,而不是 当前 状态。当前状态存储在该复选框的 dom 元素的 checked 属性中。

请参见HTML 中的属性和特性


2
嗯...这只是将 checked = true 设置。 - Naftali
@Pablo - 请查看我下面的答案,这也是一个可靠/适宜的选项。 - avijendr
@PabloMescher 你好,能帮我一下吗? 我想确定在多个复选框中哪些被选中了?并且,启用/禁用旁边的文本框。 非常感谢您的帮助。 - 1lastBr3ath
@1lastBr3ath,如果你正在使用jQuery,你只需要找到与复选框相关的文本框选择器,并使用我的第二个示例。它看起来会像这样:if($(this).prop('checked')) { $(this).find("<textboxSelector>").attr("disabled", true); } - Pablo Mescher
你应该使用三个 === 来与 false 进行比较吗? - four-eyes
1
在这种情况下,该属性始终为布尔值,因为它是一个计算属性而不是字符串,所以您可以使用 ==。但是最好始终使用 ===,因为情况并非总是如此。 - Pablo Mescher

101
if (!$("#checkSurfaceEnvironment-1").is(":checked")) {
    // do something if the checkbox is NOT checked
}

34

你也可以使用jQuery的 .not() 方法或者:not() 选择器:

if ($('#checkSurfaceEnvironment').not(':checked').length) {
    // do stuff for not selected
}

JSFiddle示例


附加说明

来自jQuery API文档的:not() 选择器

.not() 方法将为您提供比将复杂的选择器或变量推入:not() 选择器过滤器更可读的选择。在大多数情况下,这是更好的选择。


1
! $ ("#checkSurfaceEnvironment").is(“:checked”)返回一个布尔值。如果复选框未选中,则为true。$('#checkSurfaceEnvironment')。not(':checked')返回DOM元素的数组。使用“if”测试即使选择器没有匹配并且数组为空也会返回“true”。您的答案正确的唯一方法是测试i $('#checkSurfaceEnvironment')。not(':checked')。length,它将返回0或1。 - Thibault Witzig

24

另一种方法:

这里有一个可运行示例,以下是代码,你还应该使用 prop 属性。

$('input[type="checkbox"]').mouseenter(function() { 
    if ($(this).is(':checked')) {
        //$(this).prop('checked',false);
        alert("is checked");
    } else {
         //$(this).prop('checked',true);
        alert("not checked");
    }
});​

我将切换选中属性的方式注释掉了。


18

我认为最简单的方法(使用jQuery)来检查复选框是否被选中是:

如果“被选中”:

if ($(this).is(':checked')) {
// I'm checked let's do something
}

如果未选中:

if (!$(this).is(':checked')) {
// I'm NOT checked let's do something
}

相当简单的问题应该有一个非常简单的答案。他只是问如何检查一个框是否未被选中,而这里大多数答案都是检查它是否已被选中。感谢保持简单。 - RationalRabbit

11
if ( $("#checkSurfaceEnvironment-1").is(":checked") && $("#checkSurfaceEnvironment-2").not(":checked") )

6

我正在寻找像avijendr建议的更直接的实现方式。

他/她的语法让我有些困惑,但我最终使这个代码工作了:

if ($('.user-forms input[id*="chkPrint"]:not(:checked)').length > 0)

在我的情况下,我有一个带有类user-forms的表格,并且我正在检查任何复选框中是否有字符串checkPrint在其id中未被选中。


4

这里有一个针对这个问题的代码片段。

$(function(){
   $("#buttoncheck").click(function(){
        if($('[type="checkbox"]').is(":checked")){
            $('.checkboxStatus').html("Congratulations! "+$('[type="checkbox"]:checked').length+" checkbox checked");
        }else{
            $('.checkboxStatus').html("Sorry! Checkbox is not checked");
         }
         return false;
   })
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <p>
    <label>
      <input type="checkbox" name="CheckboxGroup1" value="checkbox" id="CheckboxGroup1_0">
      Checkbox</label>
    <br>
    <label>
      <input type="checkbox" name="CheckboxGroup1_" value="checkbox" id="CheckboxGroup1_1">
      Checkbox</label>
    <br>
  </p>
  <p>
    <input type="reset" value="Reset">
    <input type="submit" id="buttoncheck" value="Check">
  </p>
  <p class="checkboxStatus"></p>
</form>


3
使用您提供的 .attr() 方法,要检查是否选中,可以使用 .attr("checked", "checked"),如果未选中,则使用 .attr("checked") == undefined。请注意保留原有的HTML标签。

1

try this one

if ($("#checkSurfaceEnvironment-1:checked").length>0) {
    //your code in case of NOT checked
}

在上面的代码中,通过Id选择元素(#checkSurfaceEnvironment-1),然后通过(:checked)筛选出其选中状态。
它将返回选中元素对象的数组。如果数组中存在任何对象,则满足条件。

虽然你的回答可能有所帮助,但你至少应该解释一下原因。目前为止,你的回答已经被传送到低质量帖子的审核队列中(我正在查看它)。我建议你编辑你的回答并添加解释。 - Chris Spittles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接