【问题标题】:Limit number of checkboxes allowed to be checked [duplicate]限制允许检查的复选框数量[重复]
【发布时间】:2013-01-05 23:02:02
【问题描述】:

可能重复:
Count the number of checkboxes selected without reloading the page?

我有一个订单表格,询问用户他们想要哪种类型的通行证(1-3 天),并让他们选择他们想要通行证的日期。

目前,当他们选择 3 天时,我的 JQuery 会为他们选择所有 3 个复选框,并在他们选择 1 天或 2 天时取消选择。但是,我想做的是:

当他们选择 2 日通行证时,最多只能选择 2 个复选框。当他们选择 1 天通行证时,它只允许他们选中 1 个框。

我对我的validateDays() 函数中需要执行的操作一无所知 - 运行此验证的最佳方式或这是否实际上是最佳途径。

我想到的每种方法都要求复选框具有相同的名称/ID - 但由于表单的其他部分(省略),很遗憾它们不能。

有什么想法/建议吗?

HEAD 部分 JavaScript:

<script type="text/javascript">

function validateDays() {
    $('#matthewpeckham').find('input[type="checkbox"]').click(function () {
        var pass = parseInt($('input[name="other_1"]:checked').val(), 10) //1,2,3
        var days = $('#matthewpeckham').find('input[type="checkbox"]:checked').length;
        console.log(days, pass);
        if (days == pass) {
            $('#matthewpeckham').find('input[type="checkbox"]').not(':checked').prop('disabled', true);
        }
        else {
            $('#matthewpeckham').find('input[type="checkbox"]').not(':checked').prop('disabled', false);
        }
    })
    $('input[name="other_1"]').change(function () {
        $('#matthewpeckham').find('input[type="checkbox"]').prop({
            'checked': false,
            'disabled': false
        });
        if (parseInt($(this).val(), 10) == 3) $('#matthewpeckham').find('input[type="checkbox"]').prop({
            'checked': true,
            'disabled': false
        });
    });
}

</script>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" ></script>

<script type="text/javascript">
$(document).ready(function() {
    jQuery('#3daypass').click(function() {
        jQuery('#other_2 , #other_3 , #other_4').prop('checked', true);
    });
    jQuery('#2daypass , #1daypass').click(function() {
        jQuery('#other_2 , #other_3 , #other_4').prop('checked', false);
    });
});

</script>

正文部分 HTML:

<input name="other_1" type="radio" value="3daypass" id="3daypass" onClick="validateDays();">
<input name="other_1" type="radio" value="2daypass" id="2daypass" onClick="validateDays();">
<input name="other_1" type="radio" value="1daypass" id="1daypass" onClick="validateDays();">

<input name="other_2" type="checkbox" id="other_2" value="Tues 5 Feb">
<input name="other_3" type="checkbox" id="other_3" value="Wed 6 Feb">
<input name="other_4" type="checkbox" id="other_4" value="Thurs 7 Feb">

【问题讨论】:

    标签: javascript jquery forms


    【解决方案1】:

    无论如何我都不是这方面的专家,但这是我在我的网站上所做的,您应该能够修改它以满足您的需求...只要记住给您的输入提供相同的类名字。

    <script type="text/javascript">
    function Check() {
        var count = 0;
        var checkBoxes = document.getElementsByClassName('chkValidation');
        for (var index = 0; index < checkBoxes.length; index++) {
            if (checkBoxes[index].type == 'checkbox') {
                if (!checkBoxes[index].disabled) {
                    count = checkBoxes[index].checked ? (count + 1) : count;
                }
            }
        }
        if (count > 3) {
            alert('Question two - please select a maximum of 3 sub questions to ask.');
            return false;
        }
        return true;
    } 
    

    【讨论】:

      【解决方案2】:

      您需要检查您的验证功能中的复选框数量:

      function validateDays() {
          var numBoxesChecked = $("input:checkbox:checked").length;
      
          if (document.getElementById("2daypass").checked && numBoxesChecked > 2) {
              // invalid
          }
      
          if (document.getElementById("1daypass").checked && numBoxesChecked > 1) {
              // invalid
          }
      }
      

      请记住,可以绕过任何 javascript 验证,因此请确保您也在服务器上执行某种类型的验证。

      另请注意,如果页面上有其他不相关的复选框,例如将其限制为容器,您可能需要更改 numBoxesChecked 选择器

      var numBoxesChecked = $('#someContainer').find("input:checkbox:checked").length;
      

      【讨论】:

      • 您的代码运行良好,谢谢。有没有办法删除最后一个选中的复选框?其他答案中建议的 jQuery 不起作用。
      • @MatthewPeckham 你的意思是在计算长度时忽略最后一个复选框?您可以将not(:last) 添加到选择器中:"input:checkbox:checked:not(:last)"
      【解决方案3】:

      jQuery 公开了一个checkbox selector,在这里应该证明是有用的。

      你的 validateDays 函数可以按照这些思路做一些事情

      var checkedBoxes = jQuery(":checkbox:checked");
      var numChecked = checkedBoxes.length;
      ...
          else if (document.getElementById("2daypass").checked) {
              if (numChecked > 2) { /*do something*/ }
          }
          else if (document.getElementById("1daypass").checked) {
              if (numChecked > 1) { /*do something*/ }
          }
          else {
              // DO NOTHING
          }
      ...
      

      但是,您可能会遇到“还原”盒子的问题。你也许可以简单地做

      jQuery(this).prop('checked', false)
      

      【讨论】:

      • 不幸的是,恢复框的最后一行似乎不起作用 - 还有其他想法吗?代码已在初始问题中进行了编辑。
      • 您似乎已经有了解决方案,但要澄清一下 - 在编写此答案时,validateDays 的 this 变量应该是复选框之一。这似乎已经改变了。此代码将还原已勾选的框,但您的函数似乎仅用于附加事件,this 关键字将在这些函数中移动。
      【解决方案4】:

      您也可以动态地执行此操作,使用如下函数:

      $('.checkbox').on('click', function(e) {
        var num_checked = 0;
      
        $('.checkbox').each(function() {
          if ( $(this).prop('checked') ) num_checked++;
        });
      
        var max_checked = $('input[name="other_1"]:checked').val();
      
        if ( num_checked > max_checked ) {
          $(this).prop('checked', false);
        }
      });
      

      假设对您的 html 进行一些小的修改:

      <input name="other_1" type="radio" value="3" id="3daypass">
      <input name="other_1" type="radio" value="2" id="2daypass">
      <input name="other_1" type="radio" value="1" id="1daypass">
      
      <input class="checkbox" name="other_2" type="checkbox" id="other_2" value="Tues 5 Feb">
      <input class="checkbox" name="other_3" type="checkbox" id="other_3" value="Wed 6 Feb">
      <input class="checkbox" name="other_4" type="checkbox" id="other_4" value="Thurs 7 Feb">
      

      演示:http://jsbin.com/osecep/1/

      这并不完美,您可能希望在更改天数时清除复选框,但这应该会让您走上正轨。

      【讨论】:

        【解决方案5】:

        这是一个 jQuery 解决方案:jsFiddle example

        $('input[type="checkbox"]').click(function () {
            var pass = parseInt($('input[name="other_1"]:checked').val(), 10) //1,2,3
            var days = $('input[type="checkbox"]:checked').length;
            console.log(days, pass);
            if (days == pass) {
                $('input[type="checkbox"]').not(':checked').prop('disabled', true);
            }
        })
        $('input[name="other_1"]').change(function () {
            $('input[type="checkbox"]').prop({
                'checked': false,
                    'disabled': false
            });
            if (parseInt($(this).val(), 10) == 3) $('input[type="checkbox"]').prop({
                'checked': true,
                    'disabled': false
            });
        });
        

        【讨论】:

        • 这是一个很好的方法 - 物理禁用该框比弹出警报要方便得多。如何调整代码以便在未点击某些框时重新启用最后一个框?
        • 你的意思是这样的? jsfiddle.net/j08691/GH6xJ/3
        • 完美。但是,我将复选框限制为仅在表单的这一部分 (#matthewpeckham) 中找到的复选框,并且由于某种原因,在您第一次单击复选框时验证不起作用 - 仅在随后的时间。是不是我加了太多.finds?
        • 你已经用他所描述的事件替换了validateDays 的内脏。因此,您的事件只会在 validateDays 被调用后才会被绑定(并在后续调用中一次又一次地绑定)。去掉这个函数,只在 DOM Ready 上绑定事件。
        猜你喜欢
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 2021-04-24
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-27
        相关资源
        最近更新 更多