How can I make a group of checkboxes mutually exclusive?

前端 未结 6 1916
名媛妹妹
名媛妹妹 2020-12-16 11:54

I have to make mutually exculsive checkboxes. I have come across numerous examples that do it giving example of one checkbox group. One example is at http://blog.schuager.c

相关标签:
6条回答
  • 2020-12-16 12:02

    I hope this one will work

    HTML

    A <input type="checkbox" class="alpha" value="A" /> | 
    B <input type="checkbox" class="alpha" value="B" /> | 
    C <input type="checkbox" class="alpha" value="C" /> 
    <br />
    
    1 <input type="checkbox" class="num" value="1" /> |
    2 <input type="checkbox" class="num" value="2" /> |
    3 <input type="checkbox" class="num" value="3" /> 
    

    JavaScript

    // include jQuery library
    var enforeMutualExcludedCheckBox = function(group){
        return function() {
          var isChecked= $(this).prop("checked");
          $(group).prop("checked", false);
          $(this).prop("checked", isChecked);
        }
    };
    
    $(".alpha").click(enforeMutualExcludedCheckBox(".alpha"));
    $(".num").click(enforeMutualExcludedCheckBox(".num"));
    

    well, radio button should be the one to be used in mutually excluded options, though I've encountered a scenario where the client preferred to have zero to one selected item, and the javaScript'ed checkbox works well.

    Update

    Looking at my answer, I realized it's redundant to refer to the css class twice. I updated my code to convert it into a jquery plugin, and created two solutions, depending on ones preference

    Get all checkboxes whose check is mutually excluded

    $.fn.mutuallyExcludedCheckBoxes = function(){
        var $checkboxes = this; // refers to selected checkboxes
    
        $checkboxes.click(function() {
          var $this = $(this),
              isChecked = $this.prop("checked");
    
          $checkboxes.prop("checked", false);
          $this.prop("checked", isChecked);
        });
    };
    
    // more elegant, just invoke the plugin
    $("[name=alpha]").mutuallyExcludedCheckBoxes();
    $("[name=num]").mutuallyExcludedCheckBoxes();
    

    HTML

    A <input type="checkbox" name="alpha" value="A" /> | 
    B <input type="checkbox" name="alpha" value="B" /> | 
    C <input type="checkbox" name="alpha" value="C" /> 
    <br />
    
    1 <input type="checkbox" name="num" value="1" /> |
    2 <input type="checkbox" name="num" value="2" /> |
    3 <input type="checkbox" name="num" value="3" /> 
    

    sample code

    Group all mutually excluded checkboxes in a containing element

    JavaScript

    $.fn.mutuallyExcludedCheckBoxes = function(){
        var $checkboxes = this.find("input[type=checkbox]");
    
        $checkboxes.click(function() {
          var $this = $(this),
              isChecked = $this.prop("checked");
    
          $checkboxes.prop("checked", false);
          $this.prop("checked", isChecked);
        });
    };
    
    // select the containing element, then trigger the plugin 
    // to set all checkboxes in the containing element mutually 
    // excluded
    $(".alpha").mutuallyExcludedCheckBoxes();
    $(".num").mutuallyExcludedCheckBoxes();
    

    HTML

    <div class="alpha">
    A <input type="checkbox" value="A" /> | 
    B <input type="checkbox" value="B" /> | 
    C <input type="checkbox" value="C" /> 
    </div>
    
    <div class="num">
    1 <input type="checkbox" value="1" /> |
    2 <input type="checkbox" value="2" /> |
    3 <input type="checkbox" value="3" /> 
    </div>
    

    sample code

    Enjoy :-)

    0 讨论(0)
  • 2020-12-16 12:11

    Try this:

    HTML

    <div>
        Car: <input id="chkVehicleCar" name="chkVehicle" type="checkbox" value="Car" class="radiocheckbox">
        Moto: <input id="chkVehicleMoto" name="chkVehicle" type="checkbox" value="Moto" class="radiocheckbox">
        Byke: <input id="chkVehicleByke" name="chkVehicle" type="checkbox" value="Byke" class="radiocheckbox">
        Feet: <input id="chkVehicleFeet" name="chkVehicle" type="checkbox" value="Feet">
    </div>
    
    <span>    
        Red: <input id="chkColorRed" name="chkColor" type="checkbox" value="Red" class="radiocheckbox">
        Blue: <input id="chkColorBlue" name="chkColor" type="checkbox" value="Blue" class="radiocheckbox">
        Green: <input id="chkColorGreen" name="chkColor" type="checkbox" value="Green" class="radiocheckbox">
    
        Mango: <input id="chkFruitMango" name="chkFruit" type="checkbox" value="Mango" class="radiocheckbox">
        Orange: <input id="chkFruitOrange" name="chkFruit" type="checkbox" value="Orange" class="radiocheckbox">
        Banana: <input id="chkFruitBanana" name="chkFruit" type="checkbox" value="Banana" class="radiocheckbox">
    </span>
    

    ​JavaScript/jQuery

    $(':checkbox.radiocheckbox').click(function() {
        this.checked
            && $(this).siblings('input[name="' + this.name + '"]:checked.' + this.className)
                      .prop('checked', false);
    });​
    

    Mutually exclusive checkboxes are grouped by container+name+classname. You can use different groups in same container and also mix exclusive with non-exclusive checkbox with same name. JavaScript code is highly optimized. You can see a working example.

    0 讨论(0)
  • 2020-12-16 12:12

    I guess this is what you want.

    Consider the HTML below:

    <form action="">
        My favourite colors are:<br />
        <br />
        <input type="checkbox" value="red" name="color" /> Red<br />
        <input type="checkbox" value="yellow" name="color" /> Yellow<br />
        <input type="checkbox" value="blue" name="color" /> Blue<br />
        <input type="checkbox" value="orange" name="color1" /> Orange<br />
        <input type="checkbox" value="green" name="color1" /> Green<br />
        <input type="checkbox" value="purple" name="color1" /> Purple
    </form>
    

    Note that there's two names for color groups: red, yellow, blue and orage, green, purple

    And this JavaScript noted below will work generically to all checkbox on the page.

    jQuery("input[type=checkbox]").unbind("click");
    jQuery("input[type=checkbox]").each(function(index, value) {
        var checkbox = jQuery(value);
        checkbox.bind("click", function () {
            var check = checkbox.attr("checked");
            jQuery("input[name=" + checkbox.attr('name') + "]").prop("checked", false);
            checkbox.attr("checked", check);
        });
    });
    

    Take a look at this LIVE example

    0 讨论(0)
  • 2020-12-16 12:14

    Using Mutual Checkboxes when there is Radio button is a bad idea but still you can do this as follows

    HTML

    <div>    
        Red: <input id="chkRed" name="chkRed" type="checkbox" value="red" class="checkbox">
        Blue: <input id="chkBlue" name="chkBlue" type="checkbox" value="blue" class="checkbox">
        Green: <input id="chkGreen" name="chkGreen" type="checkbox" value="green" class="checkbox">
    </div>
    
    <div>
        Mango: <input id="chkRed" name="chkMango" type="checkbox" value="Mango" class="checkbox">
        Orange: <input id="chkBlue" name="chkOrange" type="checkbox" value="Orange" class="checkbox">
        Banana: <input id="chkGreen" name="chkBanana" type="checkbox" value="Banana" class="checkbox">
    </div>
    

    Jquery

    $('div .checkbox').click(function () { 
                     checkedState = $(this).attr('checked');
                      $(this).parent('div').children('.checkbox:checked').each(function () {
                          $(this).attr('checked', false);
                      });
                      $(this).attr('checked', checkedState);
    });
    

    And here is fiddle

    0 讨论(0)
  • 2020-12-16 12:20

    Like I said in my comment, you should really use <radio> elements for this. Give them the same name and they work almost the same way:

    <label><input type="radio" name="option" value="Option 1">Option 1</label>
    <label><input type="radio" name="option" value="Option 2">Option 2</label>
    

    The only significant difference is that, once one of them is selected, at least one of them has to be on (ie, you can't uncheck them again).

    If you really feel the need to do it with check boxes, remind yourself that users with JavaScript disabled will be able to select all the options if they like. If you still feel the need to do it, then you'll need to give each checkbox group a unique class name. Then, handle the change event of each checkbox element and uncheck all the other elements matching the same class name as the clicked element.

    0 讨论(0)
  • 2020-12-16 12:24

    No matter where the check box is located on your page, you just need to specify the group and here you go!

        <input type='checkbox' data-group='orderState'> pending
        <input type='checkbox' data-group='orderState'> solved
        <input type='checkbox' data-group='orderState'> timed out
    
        <input type='checkbox' data-group='sex'> male
        <input type='checkbox' data-group='sex'> female
    
        <input type='checkbox'> Isolated
    
    
        <script>
           $(document).ready(function () {
              $('input[type=checkbox]').click(function () {
                var state = $(this)[0].checked, 
                    g = $(this).data('group');
                 $(this).siblings()
                 .each(function () {
         $(this)[0].checked = g==$(this).data('group')&&state ? false : $(this)[0].checked;
                 });
      });
     })</script>
    
    0 讨论(0)
提交回复
热议问题