jQuery checkbox checked state changed event jQuery checkbox checked state changed event javascript javascript

jQuery checkbox checked state changed event


Bind to the change event instead of click. However, you will probably still need to check whether or not the checkbox is checked:

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

The main benefit of binding to the change event over the click event is that not all clicks on a checkbox will cause it to change state. If you only want to capture events that cause the checkbox to change state, you want the aptly-named change event. Redacted in comments

Also note that I've used this.checked instead of wrapping the element in a jQuery object and using jQuery methods, simply because it's shorter and faster to access the property of the DOM element directly.

Edit (see comments)

To get all checkboxes you have a couple of options. You can use the :checkbox pseudo-selector:

$(":checkbox")

Or you could use an attribute equals selector:

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


For future reference to anyone here having difficulty, if you are adding the checkboxes dynamically, the correct accepted answer above will not work. You'll need to leverage event delegation which allows a parent node to capture bubbled events from a specific descendant and issue a callback.

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

Note that it's almost always unnecessary to use document for the parent selector. Instead choose a more specific parent node to prevent propagating the event up too many levels.

The example below displays how the events of dynamically added dom nodes do not trigger previously defined listeners.

$postList = $('#post-list');$postList.find('h1').on('click', onH1Clicked);function onH1Clicked() {  alert($(this).text());}// simulate added contentvar 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>