简体   繁体   English

确保至少选中一个复选框

[英]Making sure at least one checkbox is checked

I have a form with multiple checkboxes and I want to use JavaScript to make sure at least one is checked.我有一个带有多个复选框的表单,我想使用 JavaScript 来确保至少选中一个。 This is what I have right now but no matter what is chosen an alert pops up.这就是我现在所拥有的,但无论选择什么,都会弹出警报。

JS (wrong) JS(错误)

function valthis(){
 if (document.FC.c1.checked) {
   alert ("thank you for checking a checkbox")
  } else  {
   alert ("please check a checkbox")
  }
}

HTML HTML

<p>Please select at least one Checkbox</p>
<br>
<br>
<form name = "FC">
<input type = "checkbox" name = "c1" value = "c1"/> C1 
<br>
<input type = "checkbox" name = "c1" value = "c2"/> C2
<br>
<input type = "checkbox" name = "c1" value = "c3"/> C3
<br> 
<input type = "checkbox" name = "c1" value = "c4"/> C4 
<br>
</form>
<br>
<br>

<input type = "button" value = "Edit and Report" onClick = "valthisform();">

So what I ended up doing in JS was this:所以我最终在 JS 中做的是这样的:

function valthisform(){
 var chkd = document.FC.c1.checked || document.FC.c2.checked||document.FC.c3.checked|| document.FC.c4.checked

 if (chkd == true){

 } else {
    alert ("please check a checkbox")
 }

}

I decided to drop the "Thank you" part to fit in with the rest of the assignment.我决定放弃“谢谢”部分以适应作业的其余部分。 Thank you so much, every ones advice really helped out.非常感谢,每个人的建议真的很有帮助。

You should avoid having two checkboxes with the same name if you plan to reference them like document.FC.c1 .如果您打算像document.FC.c1一样引用它们,则应避免使用两个具有相同名称的复选框。 If you have multiple checkboxes named c1 how will the browser know which you are referring to?如果您有多个名为c1复选框,浏览器如何知道您指的是哪个?

Here's a non-jQuery solution to check if any checkboxes on the page are checked.这是一个非 jQuery 解决方案,用于检查页面上是否有任何复选框被选中。

var checkboxes = document.querySelectorAll('input[type="checkbox"]');
var checkedOne = Array.prototype.slice.call(checkboxes).some(x => x.checked);

You need the Array.prototype.slice.call part to convert the NodeList returned by document.querySelectorAll into an array that you can call some on.您需要Array.prototype.slice.call部分的转换NodeList由归国document.querySelectorAll到一个数组,你可以调用some上。

This should work:这应该有效:

function valthisform()
{
    var checkboxs=document.getElementsByName("c1");
    var okay=false;
    for(var i=0,l=checkboxs.length;i<l;i++)
    {
        if(checkboxs[i].checked)
        {
            okay=true;
            break;
        }
    }
    if(okay)alert("Thank you for checking a checkbox");
    else alert("Please check a checkbox");
}

If you have a question about the code, just comment.如果您对代码有疑问,请发表评论。


I use l=checkboxs.length to improve the performance.我使用l=checkboxs.length来提高性能。 See http://www.erichynds.com/javascript/javascript-loop-performance-caching-the-length-property-of-an-array/请参阅http://www.erichynds.com/javascript/javascript-loop-performance-caching-the-length-property-of-an-array/

I would opt for a more functional approach.我会选择更实用的方法。 Since ES6 we have been given such nice tools to solve our problems, so why not use them.自 ES6 以来,我们已经获得了如此出色的工具来解决我们的问题,那么为什么不使用它们呢? Let's begin with giving the checkboxes a class so we can round them up very nicely.让我们从给复选框一个类开始,这样我们就可以很好地将它们围起来。 I prefer to use a class instead of input[type="checkbox"] because now the solution is more generic and can be used also when you have more groups of checkboxes in your document.我更喜欢使用类而不是 input[type="checkbox"] 因为现在该解决方案更通用,并且也可以在文档中有更多复选框组时使用。

HTML HTML

    <input type="checkbox" class="checkbox" value=ck1 /> ck1<br />
    <input type="checkbox" class="checkbox" value=ck2 /> ck2<br />

JavaScript JavaScript

function atLeastOneCheckboxIsChecked(){
    const checkboxes = Array.from(document.querySelectorAll(".checkbox"));
    return checkboxes.reduce((acc, curr) => acc || curr.checked, false);
}

When called, the function will return false if no checkbox has been checked and true if one or both is.调用时,如果没有选中复选框,则该函数将返回 false;如果选中一个或两个复选框,则返回 true。

It works as follows, the reducer function has two arguments, the accumulator (acc) and the current value (curr).它的工作原理如下,reducer 函数有两个参数,累加器 (acc) 和当前值 (curr)。 For every iteration over the array, the reducer will return true if either the accumulator or the current value is true.对于数组上的每次迭代,如果累加器或当前值为真,则reducer 将返回真。 the return value of the previous iteration is the accumulator of the current iteration, therefore, if it ever is true, it will stay true until the end.前一次迭代的返回值是当前迭代的累加器,因此,如果它为真,它将一直保持为真直到结束。

Check this.检查这个。

You can't access form inputs via their name.您无法通过名称访问表单输入。 Use document.getElements methods instead.请改用document.getElements方法。

Vanilla JS:香草JS:

var checkboxes = document.getElementsByClassName('activityCheckbox'); // puts all your checkboxes in a variable

function activitiesReset() {
    var checkboxesChecked = function () { // if a checkbox is checked, function ends and returns true. If all checkboxes have been iterated through (which means they are all unchecked), returns false.
        for (var i = 0; i < checkboxes.length; i++) {
            if (checkboxes[i].checked) {
                return true;
            }
        }
        return false;
    }
    error[2].style.display = 'none'; // an array item specific to my project - it's a red label which says 'Please check a checkbox!'. Here its display is set to none, so the initial non-error label is visible instead. 
        if (submitCounter > 0 && checkboxesChecked() === false) { // if a form submit has been attempted, and if all checkboxes are unchecked
            error[2].style.display = 'block'; // red error label is now visible.
        }
}

for (var i=0; i<checkboxes.length; i++) {  // whenever a checkbox is checked or unchecked, activitiesReset runs.
    checkboxes[i].addEventListener('change', activitiesReset);
}


Explanation:解释:
Once a form submit has been attempted, this will update your checkbox section's label to notify the user to check a checkbox if he/she hasn't yet.一旦尝试提交表单,这将更新您的复选框部分的标签,以通知用户如果他/她尚未选中复选框。 If no checkboxes are checked, a hidden 'error' label is revealed prompting the user to 'Please check a checkbox!'.如果未选中复选框,则会显示隐藏的“错误”标签,提示用户“请选中复选框!”。 If the user checks at least one checkbox, the red label is instantaneously hidden again, revealing the original label.如果用户选中至少一个复选框,红色标签会立即再次隐藏,显示原始标签。 If the user again un-checks all checkboxes, the red label returns in real-time.如果用户再次取消选中所有复选框,红色标签会实时返回。 This is made possible by JavaScript's onchange event (written as .addEventListener('change', function(){});这是通过 JavaScript 的onchange事件实现的(写成.addEventListener('change', function(){});

Prevent user from deselecting last checked checkbox.防止用户取消选择上次选中的复选框。
jQuery (original answer). jQuery(原始答案)。

$('input[type="checkbox"][name="chkBx"]').on('change',function(){
    var getArrVal = $('input[type="checkbox"][name="chkBx"]:checked').map(function(){
        return this.value;
    }).toArray();

    if(getArrVal.length){
        //execute the code
        $('#msg').html(getArrVal.toString());

    } else {
        $(this).prop("checked",true);
        $('#msg').html("At least one value must be checked!");
        return false;

    }
});

UPDATED ANSWER 2019-05-31更新答案 2019-05-31
Plain JS纯JS

 let i, el = document.querySelectorAll('input[type="checkbox"][name="chkBx"]'), msg = document.getElementById('msg'), onChange = function(ev){ ev.preventDefault(); let _this = this, arrVal = Array.prototype.slice.call( document.querySelectorAll('input[type="checkbox"][name="chkBx"]:checked')) .map(function(cur){return cur.value}); if(arrVal.length){ msg.innerHTML = JSON.stringify(arrVal); } else { _this.checked=true; msg.innerHTML = "At least one value must be checked!"; } }; for(i=el.length;i--;){el[i].addEventListener('change',onChange,false);}
 <label><input type="checkbox" name="chkBx" value="value1" checked> Value1</label> <label><input type="checkbox" name="chkBx" value="value2"> Value2</label> <label><input type="checkbox" name="chkBx" value="value3"> Value3</label> <div id="msg"></div>

< script type = "text/javascript" src = "js/jquery-1.6.4.min.js" >  <  / script >
     < script type = "text/javascript" >

function checkSelectedAtleastOne(clsName) {
    if (selectedValue == "select")
        return false;

    var i = 0;
    $("." + clsName).each(function () {

        if ($(this).is(':checked')) {
            i = 1;
        }

    });

    if (i == 0) {
        alert("Please select atleast one users");
        return false;
    } else if (i == 1) {
        return true;
    }

    return true;

}

$(document).ready(function () {
    $('#chkSearchAll').click(function () {

        var checked = $(this).is(':checked');
        $('.clsChkSearch').each(function () {
            var checkBox = $(this);
            if (checked) {
                checkBox.prop('checked', true);
            } else {
                checkBox.prop('checked', false);
            }
        });

    });

    //for select and deselect 'select all' check box when clicking individual check boxes
    $(".clsChkSearch").click(function () {

        var i = 0;
        $(".clsChkSearch").each(function () {

            if ($(this).is(':checked')) {}
            else {

                i = 1; //unchecked
            }

        });

        if (i == 0) {
            $("#chkSearchAll").attr("checked", true)
        } else if (i == 1) {

            $("#chkSearchAll").attr("checked", false)
        }

    });

});

<  / script >

You can check that atleast one checkbox is checked or not using this simple code.您可以使用这个简单的代码检查是否至少选中了一个复选框。 You can also drop your message.您也可以删除您的消息。

Reference Link参考链接

<label class="control-label col-sm-4">Check Box 2</label>
    <input type="checkbox" name="checkbox2" id="checkbox2" value=ck1 /> ck1<br />
    <input type="checkbox" name="checkbox2" id="checkbox2" value=ck2 /> ck2<br />

<script>
function checkFormData() {
    if (!$('input[name=checkbox2]:checked').length > 0) {
        document.getElementById("errMessage").innerHTML = "Check Box 2 can not be null";
        return false;
    }
    alert("Success");
    return true;
}
</script>
if(($("#checkboxid1").is(":checked")) || ($("#checkboxid2").is(":checked"))
            || ($("#checkboxid3").is(":checked"))) {
 //Your Code here
}

You can use this code to verify that checkbox is checked at least one.您可以使用此代码来验证复选框是否至少被选中。

Thanks!!谢谢!!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM