限制允许检查的复选框数

时间:2013-01-22 16:24:41

标签: javascript jquery forms

  

可能重复:
  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>

BODY部分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">

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

这是一个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
    });
});

答案 2 :(得分:1)

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)

答案 3 :(得分:0)

我不是这方面的专家,但这是我在我的网站上做的,你应该能够修改它以满足你的需要...只记得给你的输入同一个类名。

<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;
} 

答案 4 :(得分:0)

您也可以使用类似的函数进行动态处理:

$('.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/

这并不完美,你可能希望在天数改变后清除复选框,但这应该让你走上正确的轨道。