Search code examples
javascriptformscheckboxdisabled-inputenable-if

Enable/disable all inputs and checkboxes with any checked checkbox


I have a form with many text-input-fields and checkboxes. Whenever a checkbox is checked, all text-input fields and all other checkboxes (exept the one that was checked) should be disabled. After unchecking this checkbox, all disabled fields should be enabled again. This works with the following code (shown are only the first 3 lines):

<form id="myForm">

    Checkbox 1: <input type="checkbox" name="checkbox1" id="checkboxOne" onclick="enableDisableAll();" />
    <input type="text" id="id1" name="name1" /><br>

    Checkbox 2: <input type="checkbox" name="checkbox2" id="checkboxTwo" onclick="enableDisableAll();" />
    <input type="text" id="id2" name="name2" /><br>

    Checkbox 3: <input type="checkbox" name="checkbox3" id="checkboxThree" onclick="enableDisableAll();" />
    <input type="text" id="id3" name="name3" /><br>

</form>


function enableDisableAll() {

    cb1 = document.getElementById('checkboxOne').checked;
    cb2 = document.getElementById('checkboxTwo').checked;
    cb3 = document.getElementById('checkboxThree').checked;


    document.getElementById('checkboxOne').disabled = (cb2 || cb3);
    document.getElementById('id1').disabled = (cb1 || cb2 || cb3);

    document.getElementById('checkboxTwo').disabled = (cb1 || cb3);
    document.getElementById('id2').disabled = (cb1 || cb2 || cb3);

    document.getElementById('checkboxThree').disabled = (cb1 || cb2);
    document.getElementById('id3').disabled = (cb1 || cb2 || cb3);

}

Since the code becomes confusing with many checkboxes (cb1 || cb2 || cb3 || ....... cb(n)), I wonder if there would be a more elegant possibility to do this, e.g.:

function enableDisableAll() {

cb1 = document.getElementById('checkboxOne').checked;
cb2 = document.getElementById('checkboxTwo').checked;
cb3 = document.getElementById('checkboxThree').checked;

var cb_array = [];

cb_array.push("cb1");
cb_array.push("cb2");

var cb_array_imploded = cb_array.join(" || ");

document.getElementById('id1').disabled = (cb_array_imploded);

Unfortunately, this does not work.

Does anyone have a simple solution for my problem?


Solution

  • select all the form elements and loop through and check for id same as clicked element id.if so don't disabled it.

    function enableDisableAll(e) {
            var own = e;
            var form = document.getElementById("myForm");
            var elements = form.elements;
    
        for (var i = 0 ; i < elements.length ; i++) {
              if(own !== elements[i] ){
              
                if(own.checked == true){
                  
                  elements[i].disabled = true;  
                 
                }else{
                
                  elements[i].disabled = false;  
                }
              
               }
    
         }
        
    }
    
    function clearAll(){
     document.getElementById("myForm").reset();
    }
    <form id="myForm">
    
        Checkbox 1: <input type="checkbox" name="checkbox1" id="checkboxOne" onclick="enableDisableAll(this);" />
        <input type="text" id="id1" name="name1" /><br>
    
        Checkbox 2: <input type="checkbox" name="checkbox2" id="checkboxTwo" onclick="enableDisableAll(this);" />
        <input type="text" id="id2" name="name2" /><br>
    
        Checkbox 3: <input type="checkbox" name="checkbox3" id="checkboxThree" onclick="enableDisableAll(this);" />
        <input type="text" id="id3" name="name3" /><br>
     
       
    
    </form>
    
    <input class="field button2" type="button" value="Clear form" size="10" onclick="clearAll(this);">

    Update : To clear all the form fields

    document.getElementById("myForm").reset();