How do I enable/disable checkboxes when another checkbox is selected?
checkbox, javascript
Solution
All in all, not too difficult.
http://jsfiddle.net/A5TGf/19/
HTML:
<form action="./" id="checkForm" method="post">
<fieldset>
<label for="foo">foo</label>
<input type="checkbox" id="foo" value="foo" />
<label for="bar">bar</label>
<input type="checkbox" id="bar" value="bar" />
<label for="baz">baz</label>
<input type="checkbox" id="baz" value="baz" />
</fieldset>
</form>
JS:
var form = document.getElementById("checkForm");
form.onclick = delegateFormClick;
addChangeHandlers(form);
function addChangeHandlers(form)
{
for(var i=0;i<form.elements.length;i++)
{
var element = form.elements[i];
if(element.tagName === "INPUT" && element.type === "checkbox")
{
if(!element.onchange)
{
element.onchange = checkBoxChanged;
}
}
}
}
function delegateFormClick(evt)
{
var target;
if(!evt)
{
//Microsoft DOM
target = window.event.srcElement;
}else if(evt)
{
//w3c DOM
target = evt.target;
}
if(target.nodeType === 1 && target.tagName === "INPUT" && target.type === "checkbox")
{
if(target.checked)
{
disableCheckBoxes(target.id, document.getElementById("checkForm"));
}else if(!target.checked)
{
enableCheckBoxes(document.getElementById("checkForm"));
}
}
}
function checkBoxChanged()
{
if(this.checked)
{
disableCheckBoxes(this.id, document.getElementById("checkForm"));
}else if(!this.checked)
{
enableCheckBoxes(document.getElementById("checkForm"));
}
}
function disableCheckBoxes(id, form)
{
var blacklist = [];
if(id)
{
switch(id)
{
case "foo":
blacklist = ["bar", "baz"];
break;
case "bar":
blacklist = ["foo"];
break;
case "baz":
blacklist = ["foo", "bar"];
break;
}
}else
{
throw new Error("id is needed to hard-wire input blacklist");
}
for(var i=0;i<blacklist.length;i++)
{
var element = document.getElementById(blacklist[i]);
if(element && element.nodeType === 1)
{
//check for element
if(element.tagName === "INPUT" && element.type === "checkbox" && !element.checked)
{
element.disabled = "disabled";
}
}else if(!element || element.nodeType !== 1)
{
throw new Error("input blacklist item does not exist or is not an element");
}
}
}
function enableCheckBoxes(form)
{
for(var i=0;i<form.elements.length;i++)
{
var element = form.elements[i];
if(element.tagName === "INPUT" && element.type === "checkbox" && !element.checked)
{
element.disabled = "";
}
}
}
Some quick notes on what I'm doing:
- I'm using event delegation to minimize the amount of event handlers. The form listens for a click event bubbling up, then calls a function depending on which element was clicked and its `checked` DOM property.
- I'm traversing the HTMLFormElement.elements collection to easily access the checkboxes.
- I'm setting the `disabled` DOM property to "disabled" on the checkbox if it's not the target checkbox.
- I'm setting the `disabled` DOM property to "" (an empty string) on the checkbox if no checkboxes are checked.
- This also works if the user selects the checkbox by tabbing/entering or another method via the `onchange` handler.
- This code should work in IE, though I'm having some serious problems with IE via Wine at work, so I'll have to test later.
- It uses a "blacklist", which is an array that contains ids to checkboxes you don't want enabled when the corresponding checkbox is clicked.
Let me know if you're looking for anything further.
Problem
I got on how to check/unchecked or hide/show when one checkbox is checked but what im looking for is when I have 5 checkboxes Fastfood, Catering, Carryout, Delivery and Bar when user clicked Fastfood ,rest checkboxes are disable, when user checked Catering, rest are disable but when user checked Carryout only Fastfood and Catering are disable. Then when user unchecked, all checkboxes back to enable/show. thanks! – Here my code: ``` <script type="text/javascript"> function HideOrShowStuff(controlToHide1) { if (document.getElementById) { if(controlToHide1==1) { document.getElementById('2').disabled=true; document.getElementById('3').disabled = true; document.getElementById('4').disabled = true; document.getElementById('5').disabled = true; document.getElementById('1').disabled = false; } if(controlToHide1==2) { document.getElementById('1').disabled=true; document.getElementById('2').disabled = false; document.getElementById('4').disabled = true; document.getElementById('5').disabled = true; document.getElementById('3').disabled = true; } if(controlToHide1==3) { document.getElementById('1').disabled=true; document.getElementById('2').disabled = true; document.getElementById('4').disabled = false; document.getElementById('5').disabled = false; document.getElementById('3').disabled = false; } } } </script> Type of restaurant are you?<br /> <br /> <input type="checkbox" name="restaupop1" id="1"value="fastfood" onclick="HideOrShowStuff(1)" <?PHP print $fastfood_status; ?>> Fast Food/Drive Thru <br /> <input type="checkbox" name="restaupop2" id="2"value="catering" onclick="HideOrShowStuff(2); setVisible('restaubar');" <?PHP print $catering_status; ?>> Catering<br /> <input type="checkbox" name="restaupop3" id="3" value="carryout" onclick="HideOrShowStuff(3)" <?PHP print $carryout_status; ?>> Carry-Out<br /> <input type="checkbox" name="restaupop4" id="4"value="delivery" onclick="setVisible('barpop1');" <?PHP print $delivery_status; ?>> Delivery<br /> <input type="checkbox" name="restaupop5" id="5"value="bargrill" onclick="setVisible('restaubar');" <?PHP print $bargrill_status; ?>>Bar/Grill ```