views:

876

answers:

2

I have a CheckBoxList and one of the options is 'All'. I want to select all the options including All if the user checked 'All' and if the user unchecked 'All', I want to clear selections. If they select any other option except 'All', do nothing. Can anyone help me with jQuery to do this? I am using jQuery 1.2.6

<table border="0" onclick="SelectMe(this);" id="one">
<tbody>
    <tr>
        <td>
            <input type="checkbox" checked="checked" name="one$0" id="one_0"/><label for="one_0">All</label>
        </td>
        <td>
            <input type="checkbox" name="two$1" id="two_1"/><label for="two_1">Option One</label>
        </td>
        <td>
            <input type="checkbox" name="three$2" id="three_2"/><label for="three_2">Option Two</label>
        </td>
        <td>
            <input type="checkbox" name="four$3" id="four_3"/><label for="four_3">Option Three</label>
        </td>
        <td>
            <input type="checkbox" name="five$4" id="five_4"/><label for="five_4">Option Four</label>
        </td>
    </tr>
</tbody>

THANKS ALL FOR HELPING OUT. HERE IS MY ANSWER -

Bind this function to onclick attribute for each of checkboxlist.items

function selectAll(box) { 

 //check if this is 'All' checkbox

 var isAll = ($(box).next('label').text() == 'All');

 //get the checkboxlist

 var theList = $(box).parents('table:first'); 

  //if 'All' is checked/clicked, check all options

  if (isAll) {
    var check = theList.find('input:checkbox')[0].checked; 
     $.each(theList.find('input:checkbox'), function(i, v) {
        v.checked = check;
     });
  } 

 // check 'All' option if all other checkboxes are checked     
 else {
     var allchecked = true;
     $.each(theList.find('input:checkbox'), function(i, v) { 
         if(i) if (!v.checked) allchecked = false;
     });
     theList.find('input:checkbox')[0].checked = allchecked; 
}
+1  A: 

the following should work [updated]

$(':checkbox').click( function() {
  // check if the label following the checkbox  is 'All'
  if ( $(this).next('label').text() == 'All') 
    {
     if ( $(this).is(':checked'))
       $(':checkbox').attr('checked', true)
     else
       $(':checkbox').attr('checked', false);
    }
} );

And more correct, instead of checking the next label, we should check the label that corresponds to the clicked checkbox according to the for attribute..

so

if ( $(this).next('label').text() == 'All') 

could be

if ( $('label[for="'+$(this).attr('id')+'"]').text() == 'All') 
Gaby
Thanks. But this is a dynamic checkboxlist and therefore I can't possibly know the id of the 'All' option. I can only bind jquery to the entire checkboxlist as shown above. Is it possible to find which option was checked or unchecked? That is, detect if the user checked 'All' option with the jquery bound to the entire list?
Dave
@Dave , check the changes above which make it generic
Gaby
A: 

Hi

$(document).ready(function() {

    $('input[type=checkbox]').click(function(){       //detects a check box click
        if ($(this).attr('id').indexOf("one_0") > -1){  //Checks if 'all' check box was clicked
            checkUncheckAll($(this).attr('checked'));   //Function call to check uncheck based on checked/unchecked state of All check box
        }
    });
});

//Function to check uncheck all check boxes
function checkUncheckAll(checkedValue) {
    $('input[type=checkbox]').each(function() {        
        this.checked = checkedValue;
    });
}

This approach has a flaw - the function checkUncheckAll loops over all check boxes in your form and checks/unchecks all of them. You can do it for a specific set of check boxes, if you assign their ID appropriately (i.e. checkSpec1, checkSpec2 etc.) and detect the check boxes whose id have checkSpec word.

I hope this helps.

cheers

Andriyev