views:

500

answers:

4

I've got a load of checkboxes that are by default checked. My users will probably uncheck a few of the checkboxes (if any) and leave the rest of them checked. Is there any way to get the checkboxes that are NOT checked in a form post, rather than the ones that are checked?

+2  A: 

You can do some Javascript in the form's submit event. That's all you can do though, there's no way to get browsers to do this by themselves. It also means your form will break for users without Javascript. Better is to know on the server which checkboxes there are, so you can deduce that those absent from the posted form values ($_POST in PHP) are unchecked.

Bart van Heukelom
or $_POST if the form was submitted using post
RMcLeod
Edited the question. POST is more likely than GET
Bart van Heukelom
I've gone with the server approach. Seems to work fine - thanks.
reach4thelasers
A: 

This can solely be accomplished with some javascript, as unchecked checkboxes don't get transmitted. So you need javascript that e.g. behind the scenes adds hidden fields on unchecking a checkbox. Without javascript this could not be done.

Augenfeind
+1  A: 

A common technique around this is to carry a hidden variable along with each checkbox.

<input type="checkbox" name="mycheckbox" />
<input type="hidden" name="mycheckbox.hidden"/>

On the server side, we first detect list of hidden variables and for each of the hidden variable, we try to see if the corresponding checkbox entry is submitted in the form data or not.

The server side algorithm would probably look like:

for input in form data such that input.name endswith .hidden
  checkboxName = input.name.rstrip('.hidden')
  if chceckbName is not in form, user has unchecked this checkbox

The above doesn't exactly answer the question, but provides an alternate means of achieving similar functionality.

Shailesh Kumar
+1  A: 

The solution I liked the most so far is to put a hidden input with the same name as the checkbox that might not be checked. I think it works so that if the checkbox isn't checked, the hidden input is still successful and sent to the server but if the checkbox is checked it will override the hidden input before it. This way you don't have to keep track of which values in the posted data were expected to come from checkboxes.

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>
Sam
Now that I re-read the question it seems this wasn't really what you wanted. However I got to this question when I was trying to figure out this answer so maybe it could be useful to someone else.
Sam