Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JQuery - Select All CheckBoxes within current table only

Tags:

jquery

I have two nested repeaters in C#. The outer has some grouping information and the inner has a table with X number of checkboxes.

So I will have Y number of tables. At the top of each table there will be a check box (as well as a checkbox on each row). What I want to do is be able to select all check boxes in a single table from the checkbox at the top of each table.

I can select ALL checkboxes in one go as follows:

$(document).ready(function() {
        $("#checkboxflipflop").click(function() {
            var checked_status = this.checked;
            $(".storecheckbox input").each(function() {
                this.checked = checked_status;
            });
        });
    });

I just can't figure out how to narrow the selection to the current table, (the checkbox at the top of each table is in the th row).

Thanks

EDIT.... sorry forgot to mention that we are on 1.26 of JQuery and not sure if I am allowed to move us up at all. Which means "closest" is not there.

like image 508
Jon Avatar asked Nov 16 '09 12:11

Jon


3 Answers

Something like the following ought to do it

$('th input:checkbox').click(function(e) {

var table = $(e.target).closest('table');
$('td input:checkbox', table).attr('checked', e.target.checked);

});

Here's a Working Demo with two tables nested in another table (semantically horrible I'll admit). Add /edit to the URL to see the code

EDIT:

Since you're still using jQuery 1.2.6, use parents() instead of closest()

$('th input:checkbox').click(function(e) {

var table = $(e.target).parents('table:first');
$('td input:checkbox', table).attr('checked', e.target.checked);

});
like image 161
Russ Cam Avatar answered Sep 18 '22 14:09

Russ Cam


So each table has a "check all" checkbox, right? Why not give it a class of .checkall? Then you could do this (untested):

$('.checkall').click(function(){
  var checked_status = this.checked;
  $(this).closest('table').find('input:checkbox').each(function(){
    this.checked = checked_status;
  });
})

Alternately, if you don't want to use the .checkall class, you use a selector like:

$('.storecheckbox input:nth-child(1)').click`

Meaning, "when the first input inside an element with class .storecheckbox is clicked..."

like image 34
Nathan Long Avatar answered Sep 21 '22 14:09

Nathan Long


Here's the snippet that should work as per your current design of the page.

// iterate over all the tables in the page
$("table").each(function() {
    // attach a click event on the checkbox in the header in each of table
    $(this).find("th:first input:checkbox").click(function() {
        var val = this.checked;
        // when clicked on a particular header, get the reference of the table & hence all the rows in that table, iterate over each of them.
        $(this).parents("table").find("tr").each(function() {
            // access the checkbox in the first column, and updates its value.
            $(this).find("td:first input:checkbox")[0].checked = val;
        });
    });
});
like image 34
a6hi5h3k Avatar answered Sep 20 '22 14:09

a6hi5h3k