Awesome radio button grouping with jQuery
Saturday, December 19th, 2009 Tags: forms, grouping, Javascript, jQuery, radio
I was asked to do something rather interesting with some radio button inputs the other day. I haven't come across this particular problem before and google didn't return anything helpful, so I decided to share what I came up with.
Live Demo
First, the scenario
We have a standard form with 4 radio button groups. Each group has 4 radio buttons labeled from "1" to "4". Now, when the user selects "option 1" in "group 1", all the remaining "option 1" items need to be disabled. To see an example in action, you can view the demo here.
The problem
When I first started, I thought that it's simply a matter of giving each "option" (regardless of group) a common class name - then just disabling all other options with the same class name. That works, to a point, but what if the user changes his mind and selects another option ? Now I had to find all previously disabled options, re-enable them and start all over again.
The solution
Essentially what I came up with was a basic nested loop to handle setting and unsetting the relevant "disabled" attributes. To achieve this, first we assign all "option 1" a class of "number1", "option 2" a class of "number2" and so on.
Next, we run a basic for loop, and go through each "number" class (i.e. number1 to number4). For each class, we call a function. Inside this function is another loop - this time iterating over each radio button assigned the current class name. Using this loop, we remove any "disabled" attributes which may have been assigned previously.
We also find out which item in that group is currently selected (if any) - this is so we can run a second loop to disable all those options not currently selected. Confused ? Now might be a good time to go through the code.
The code
$(function(){
// fire our code when a radio button has been selected
$("input[type=radio]").change(function(){
var name = $(this).attr("name"); // get the current button's group name
$("input[name="+name+"]").removeAttr("selected"); // first we deselect "all" radio buttons within the same group
$(this).attr("selected","selected"); // make sure our currently "changed" button is selected
for(i=1;i<=4;i++){ // go through the 4 radio classes
processRadio(".radio"+i);
}
});
/**
Loops through each item with same "class" name and disables/enables where appropriate
**/
function processRadio(myclass){
var empty;
var id = "";
var buttons = $(myclass); // read all buttons with the specified class name into a jQuery object
buttons.each(function(){ // loop through each item
var me = $(this);
var isSelected = me.attr("selected"); // bool value, based on whether the "selected" attribute is present or not
me.removeAttr("disabled"); // clear the disabled attribute if present
me.siblings("label").removeClass("disabled"); // same with the associated label element
if (isSelected != empty && isSelected != ""){
id = $(this).attr("id"); // set our tmp id var to our currently selected item
}
});
// make sure we have an id, otherwise we'll get an error
if (id != empty && id != ""){
buttons.each(function(){ // loop through each radio button once again
if ($(this).attr("id") != id){ // set the disabled attributes if id attribute doesn't match our tmp id var
$(this).attr("disabled", "disabled").siblings("label").addClass("disabled");
}
});
}
}
});
I've commented as best I could, which hopefully makes more sense than my rambling above. Once again, there is a working demo available for you to play with. Be sure to have a look at the markup as well, might clear up a few questions.
I strongly suspect that there's a more efficient method for achieving the same result - so if you have a better suggestion, tweak or link please let me know - I'd greatly appreciate it.
Live Demo
Editors Note - PHP Book Giveaway
I'll be announcing the winner for the PHP For Absolute Beginners book giveaway on monday, so now is your last second chance to get your comment in for a chance to win. See here for more details and to enter.
Tags: forms, grouping, Javascript, jQuery, radioIf you enjoyed this article, you might consider subscribing to our rss feed to stay updated with all the latest tips and articles!
Article Sponsored by:
Looking to become a WordPress rockstar? Theme like a pro with this straight forward tutorial-style guide to WordPress theming, that takes you from the basics to the advanced!









Hi:
The demos not working, but nice idea.
Strange. Works for me with FF 3.5 (mac) but returns a syntax error in Safari – thanks for pointing it out – will adjust.
Ok fixed. Safari didn’t like the “class” parameter defined in the processRadio function, renamed to “myclass”.
I’m afraid I find a bug aswell. If you fill in a few buttons and then press reset the script doesn’t enable all the buttons.
Reset is not working…but great idea!
@deeja, @Viktor : Thanks for the comments. I purposely left the reset button as a straight “reset button” as I only wanted to demonstrate the js necessary to get my point across.
Adding some “reset” js is pretty straightforward ala :
$(“input[type=reset]“).click(function(){
$(“input[type=radio]“).each(function(){
$(this).removeAttr(“selected”).removeClass(“disabled”);
});
});
Something like that
Hi, I recently started a bloghosting platform (based on wordpress MU) and when I stumbled your blog I paid attention to your theme (looking good) so I was wondering can you tell me is it custom made theme or one of those free ones? thanks in advance! regards, blogiskewl
I think that using radio buttons for the above problem is not ideal. There are situations where the user gets stuck and cannot continue selecting different option.