jQuery复选框选中状态更改事件


628

我希望一个事件在选中/未选中复选框时触发客户端:

$('.checkbox').click(function() {
  if ($(this).is(':checked')) {
    // Do stuff
  }
});

基本上,我希望页面上的每个复选框都发生这种情况。这种触发点击并检查状态的方法可以吗?

我在想必须有一种更清洁的jQuery方式。有人知道解决方案吗?


有没有必要问这个问题再次,在一个极顶投票存在于计算器同样的问题.... stackoverflow.com/questions/901712/...
Ariful伊斯兰教

28
@Arif我不认为它们是重复的,因为链接的问题是关于获取复选框状态的,而这是关于选中事件的。
雷切尔

1
我总是要搜索此选中的属性,有许多方法可以实现,如此处所示
user3199690 2014年

Answers:


1228

绑定到change事件而不是click。但是,您可能仍然需要检查是否已选中该复选框:

$(".checkbox").change(function() {
    if(this.checked) {
        //Do stuff
    }
});

绑定到change事件click而不是事件的主要好处是,并非所有对复选框的单击都会导致其更改状态。如果只想捕获导致复选框更改状态的事件,则需要适当命名的change事件。 删除评论

另请注意,我曾经 this.checked而不是将元素包装在jQuery对象中并使用jQuery方法,只是因为直接访问DOM元素的属性更短,更快。

编辑(请参阅评论)

要获得所有复选框,您有两个选择。您可以使用:checkbox伪选择器:

$(":checkbox")

或者您可以使用属性等于选择器:

$("input[type='checkbox']")

1
实际上,我已经在类中查找复选框。是否有更好的方法来获取所有复选框,而与类无关?
AnonyMouse 2011年

4
@AnonyMouse-查看我的编辑。有两种方法可以做到这一点。
James Allardice 2011年

18
@Vigrond-实际上,单击标签确实会触发关联控件上的click事件:jsfiddle.net/ZFG84
James Allardice 2011年

4
这比清洁得多$(this).is(':checked')。我以为change如果要检测键盘上的更改(制表符,敲击空格)必须使用该事件,但是令人惊讶的是,它click也检测到不是鼠标单击所引起的更改,不确定是不是jQuery,jsfiddle.net / mendesjuan / E39sz
Juan Mendes

41
请注意:绑定任何情况下clickchange或任何页面上的所有复选框可能会导致性能问题(depepending上复选框的量)。尝试绑定到父元素或文档并捕获冒泡事件,即$('form').on('change', ':checkbox', function(){ //stuff });
hitautodestruct

108

为了将来对此处遇到困难的任何人提供参考,如果您动态添加复选框,则上面正确的可接受答案将不起作用。您将需要利用事件委托,它允许父节点从特定后代捕获冒泡事件并发出回调。

// $(<parent>).on('<event>', '<child>', callback);
$(document).on('change', '.checkbox', function() {
    if(this.checked) {
      // checkbox is checked
    }
});

注意,几乎没有必要将其document用于父选择器。而是选择一个更特定的父节点,以防止将事件传播到太多级别。

以下示例显示了动态添加的dom节点的事件如何不触发先前定义的侦听器。

$postList = $('#post-list');

$postList.find('h1').on('click', onH1Clicked);

function onH1Clicked() {
  alert($(this).text());
}

// simulate added content
var title = 2;

function generateRandomArticle(title) {
  $postList.append('<article class="post"><h1>Title ' + title + '</h1></article>');
}

setTimeout(generateRandomArticle.bind(null, ++title), 1000);
setTimeout(generateRandomArticle.bind(null, ++title), 5000);
setTimeout(generateRandomArticle.bind(null, ++title), 10000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="post-list" class="list post-list">
  <article class="post">
    <h1>Title 1</h1>
  </article>
  <article class="post">
    <h1>Title 2</h1>
  </article>
</section>

尽管此示例显示了事件委托的用法,以捕获特定节点的事件(h1在这种情况下),并为此类事件发出回调。

$postList = $('#post-list');

$postList.on('click', 'h1', onH1Clicked);

function onH1Clicked() {
  alert($(this).text());
}

// simulate added content
var title = 2;

function generateRandomArticle(title) {
  $postList.append('<article class="post"><h1>Title ' + title + '</h1></article>');
}

setTimeout(generateRandomArticle.bind(null, ++title), 1000); setTimeout(generateRandomArticle.bind(null, ++title), 5000); setTimeout(generateRandomArticle.bind(null, ++title), 10000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section id="post-list" class="list post-list">
  <article class="post">
    <h1>Title 1</h1>
  </article>
  <article class="post">
    <h1>Title 2</h1>
  </article>
</section>


23

只是另一个解决方案

$('.checkbox_class').on('change', function(){ // on change of state
   if(this.checked) // if changed state is "CHECKED"
    {
        // do the magic here
    }
})

4
尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。
2015年

12

如果您打算仅将事件附加在已选中的复选框上(因此当未选中它们并在稍后再次选中时会触发事件),那么这就是您想要的。

$(function() {
    $("input[type='checkbox']:checked").change(function() {

    })
})

如果您打算将事件附加到所有复选框(已选中和未选中)

$(function() {
    $("input[type='checkbox']").change(function() {

    })
})

如果您希望仅在选中它们(未选中)时将其触发,则@James Allardice会在上方回答。

BTW input[type='checkbox']:checked是CSS选择器。


如果您只想查找未选中的复选框怎么办?我已经为所有选中的$(“#tableUSNW tbody tr td [id = td1]:checkbox:checked”)使用了此方法;但我不知道如何查找所有未选中的内容。
FrenkyB '16

1
@FrenkyB尝试以下操作:$("input[type='checkbox']:not(:checked)")
Matas Vaitkevicius

5
$(document).ready(function () {
    $(document).on('change', 'input[Id="chkproperty"]', function (e) {
        alert($(this).val());
    });
});

3

根据事件(点击事件)采取行动。

$('#my_checkbox').on('click',function(){
   $('#my_div').hide();
   if(this.checked){
     $('#my_div').show();
   }
});

如果没有事件,则根据当前状态采取措施。

$('#my_div').hide();
if($('#my_checkbox').is(':checked')){
  $('#my_div').show();
}

在这种情况下,“点击”事件上的操作无效。关于“变化”的作品。
Mehmood Memon

2

也许这可能是您的替代选择。

<input name="chkproperty" onchange="($(this).prop('checked') ? $(this).val(true) : $(this).val(false))" type="checkbox" value="true" />`

2

这是找到是否选中复选框的解决方案。使用#prop()函数//

$("#c_checkbox").on('change', function () {
                    if ($(this).prop('checked')) {
                        // do stuff//
                    }
                });

1

试试这个jQuery验证

$(document).ready(function() {
  $('#myform').validate({ // initialize the plugin
    rules: {
      agree: {
        required: true
      }

    },
    submitHandler: function(form) {
      alert('valid form submitted');
      return false;
    }
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.js"></script>

<form id="myform" action="" method="post">
  <div class="buttons">
    <div class="pull-right">
      <input type="checkbox" name="agree" /><br/>
      <label>I have read and agree to the <a href="https://stackexchange.com/legal/terms-of-service">Terms of services</a> </label>
    </div>
  </div>
  <button type="submit">Agree</button>
</form>


1

很简单,这就是我使用的方式:

jQuery的:

$(document).on('change', '[name="nameOfCheckboxes[]"]', function() {
    var checkbox = $(this), // Selected or current checkbox
        value = checkbox.val(); // Value of checkbox

    if (checkbox.is(':checked'))
    {
        console.log('checked');
    }else
    {
        console.log('not checked');
    }
});

问候!

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.