【问题标题】:Disable checkbox after reaching a limit达到限制后禁用复选框
【发布时间】:2016-12-23 00:13:39
【问题描述】:

我正在寻找一种原生 JavaScript 解决方案,通过禁用剩余的复选框(如果用户取消选中其中一个选项,则再次启用它们)来防止用户检查超过 2 个项目

下面是我的复选框:

<div class="checkboxdiv">
    <input type="hidden" name="Extras" value="">
    <input type="checkbox" name="Extras" value="Wedges"><label>Wedges</label> <br/>
    <input type="checkbox" name="Extras" value="Chips"><label>Chips</label> <br/>
    <input type="checkbox" name="Extras" value="Garlic Bread"><label>Garlic Bread</label> <br/>
    <input type="checkbox" name="Extras" value="Chicken Wings"><label>Chicken Wings</label> <br/>
    <input type="checkbox" name="Extras" value="Cheese Sticks"><label>Cheese Sticks</label>
</div>

我知道这已经使用 JQuery 进行了介绍,但我正在寻找一个本地解决方案,以便更好地了解代码的工作原理。

解决方案

这是我在大家的帮助下想出的最终解决方案。

function checkboxlimit(checkgroup, limit){
    var checkgroup=checkgroup;
    var limit=limit;
    //Changes onclick funtion for each checkbox
    for (var i=0; i<checkgroup.length; i++){
        checkgroup[i].onclick=  function(){

            var checkedcount=0;
            //Loops through checkboxes
            for (var i=0; i<checkgroup.length; i++){
            //adds 1 if checked, 0 if not
            checkedcount+=(checkgroup[i].checked)? 1 : 0;
            }

            //Loops through checkboxes
            for (var i=0; i<checkgroup.length; i++){

                //Disables check box if it's unchecked and the limit has been reached
                if(!checkgroup[i].checked && checkedcount==limit){
                    checkgroup[i].disabled=true;
                }

                //Enables all checkboxes otherwise
                else{
                    checkgroup[i].disabled=false;
                }
            }
        }
    }
}

【问题讨论】:

  • 你有没有想过解决方案?
  • 首先检查这个问题:stackoverflow.com/questions/32438068/… 您的 onchange 处理程序将简单地检查所有复选框的状态并禁用所有未选中的复选框,当两个复选框是 checked 时。
  • afaik,复选框既没有 readonly 也没有 disabled 属性。因此,从技术上讲,您需要手动实现此类行为,例如stackoverflow.com/questions/155291/…

标签: javascript


【解决方案1】:

查看CSS pseudo class ":checked"document.querySelectorAll

这是一个fiddle 开头:

var currentlyCheckedCount = 0

function disableRemainingCheckboxes() {
  Array.from(document.querySelectorAll('input[type="checkbox"]:not(:checked)')).forEach(function(element) {
    element.disabled = 'disabled'
  })
}

function enableAllCheckboxes() {
  Array.from(document.querySelectorAll('input[type="checkbox"]')).forEach(function(element) {
    element.disabled = undefined
  })

}

Array.from(document.querySelectorAll("input[type='checkbox']")).forEach(function(checkbox) {
  checkbox.addEventListener('change', onCheckboxClick)
})

function onCheckboxClick() {
  if(this.checked) {
    currentlyCheckedCount++
  } else {
    currentlyCheckedCount--
  }

  if(currentlyCheckedCount == 2) {
    disableRemainingCheckboxes()
  } else {
    enableAllCheckboxes()
  }
}

【讨论】:

    【解决方案2】:

    Geekonaut 的答案/代码很棒,但是,如果您关心 IE 支持(Array.from() 在其中不起作用),这里是简化的、更直接的版本:

    limit = 0; //set limit
    
    checkboxes = document.querySelectorAll('.checkboxdiv input[type="checkbox"]'); //select all checkboxes
    
    function checker(elem) {
      if (elem.checked) { //if checked, increment counter
        limit++;
      } else {
        limit--; //else, decrement counter
      }
    
      for (i = 0; i < checkboxes.length; i++) { // loop through all 
    
        if (limit == 2) {
          if (!checkboxes[i].checked) {
            checkboxes[i].disabled = true; // and disable unchecked checkboxes
    
          }
    
        } else { //if limit is less than two
    
          if (!checkboxes[i].checked) {
            checkboxes[i].disabled = false; // enable unchecked checkboxes
          }
    
        }
      }
    
    }
    
    for (i = 0; i < checkboxes.length; i++) {
      checkboxes[i].onclick = function() { //call function on click and send current element as param
        checker(this);
      }
    }
    <div class="checkboxdiv">
        <input type="hidden" name="Extras" value="">
        <input type="checkbox" name="Extras" value="Wedges"><label>Wedges</label> <br/>
        <input type="checkbox" name="Extras" value="Chips"><label>Chips</label> <br/>
        <input type="checkbox" name="Extras" value="Garlic Bread"><label>Garlic Bread</label> <br/>
        <input type="checkbox" name="Extras" value="Chicken Wings"><label>Chicken Wings</label> <br/>
        <input type="checkbox" name="Extras" value="Cheese Sticks"><label>Cheese Sticks</label>
    </div>

    希望代码很清晰(容易理解),而且还有cmets。

    【讨论】:

    • 这很有效,并且适合我正在使用的解决方案,谢谢。通过快速点击很容易“欺骗”计数,但我应该能够轻松解决这个问题,并会尽快发布解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2016-01-16
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多