【问题标题】:jQuery Validation at least one checkbox is selectedjQuery Validation 至少有一个复选框被选中
【发布时间】:2023-03-21 11:59:01
【问题描述】:

我有以下用于表单复选框的 html 代码

<div class="drinking col-xs-12">
  <div class="col-xs-7 drinkingLeft">
    <input type="checkbox" name="allwines" id="allwines" value="0" class="require-one col-xs-1 styled myClassA"  value="0" data-label="All Wines" />
    <input id='allwinesHidden'  type='hidden' value='0' name='allwines'>
  </div>
  <div class="col-xs-5 drinkingLeft">
    <input type="checkbox" name="beer" id="beer" value="0" class="require-one col-xs-1 styled myClassB"  value="0"  data-label="Beer" />
    <input id='beerHidden'  type='hidden' value='0' name='beer'>
  </div>
  <div class="clearix"></div>
  <div class="col-xs-7 drinkingLeft">
    <input type="checkbox" name="redwines" id="redwines" value="0" class="require-one col-xs-1 styled myClassC"  value="0" data-label="Red Wines" />
    <input id='redwinesHidden'  type='hidden' value='0' name='redwines'>
  </div>
  <div class="col-xs-5 drinkingLeft">
    <input type="checkbox" name="cider" id="cider" value="0" class="require-one col-xs-1 styled myClassD"  value="0" data-label="Cider" />
    <input id='ciderHidden'  type='hidden' value='0' name='cider'>
  </div>
  <div class="clearix"></div>
  <div class="col-xs-7 drinkingLeft">
    <input type="checkbox" name="whitewines" id="whitewines" value="0" class="require-one col-xs-1 styled myClassE"  value="0" data-label="White Wines" />
    <input id='whitewinesHidden'  type='hidden' value='0' name='whitewines'>
  </div>
  <div class="col-xs-5 drinkingLeft">
    <input type="checkbox" name="spirits" id="spirits" value="0" class="require-one col-xs-1 styled myClassF"  value="0" data-label="Spirits" />
    <input id='spiritsHidden'  type='hidden' value='0' name='spirits'>
  </div>
  <div class="clearix"></div>
  <div class="col-xs-7 drinkingLeft">
    <input type="checkbox" name="sparkling" id="sparkling" value="0" class="require-one col-xs-1 styled myClassG"  value="0" data-label="Sparkling/Champagne" />
    <input id='sparklingHidden'  type='hidden' value='0' name='sparkling'>
  </div>
  <div class="col-xs-5 drinkingLeft">
    <input type="checkbox" name="fortified" id="fortified" value="0" class="require-one col-xs-1 styled myClassH"  value="0" data-label="Fortified" />
    <input id='fortifiedHidden'  type='hidden' value='0' name='fortified'>
  </div>
  <div id="error_msg3"></div>
  <div class="clearix"></div>
</div>
</div>

我想确保至少有一个复选框被选中。

我希望 NOT 作为警告框;但是该消息需要显示在 div error-msg3 中。

请注意,所有输入都有不同的类名和 ID。暂存链接位于

https://bitly.com/1i3f1MY

我正在使用 jQuery 验证来验证表单的其余部分。很高兴通过 jquery 验证获得解决方案。

提前致谢

【问题讨论】:

  • 我在 jsfiddle 中添加了代码。 jsfiddle.net/dHrvT/15
  • 更新了 jsfiddle jsfiddle.net/dHrvT/17
  • 再次重申: * 每个复选框的名称/ID 不同 * 当用户单击提交按钮时,我需要以下内容: * 如果未单击复选框,则显示错误消息就像其他错误消息*当检查其中一个复选框时,需要再次隐藏错误消息*,如果用户再次删除所有错误消息,则需要再次显示错误消息。不,我不能把名字都一样。它正在使用自定义复选框(漂亮的复选框)。

标签: jquery jquery-validate


【解决方案1】:

您必须更改复选框的名称属性,并为其添加一条规则,并将 minlength 设置为 1。

您可以在显示自定义消息后将其附加到#error_msg3

if(element.attr("name") == "check") error.appendTo("#error_msg3")

编辑

$("input[type='checkbox'][name='check']").change(function() {
    if ($("input[type='checkbox'][name='check']:checked").length){
        $(this).valid()
    }
})

编辑 2

我已经更新了 Fiddle,现在当您至少选中一个复选框时,消息会正确切换。

$("input[type='checkbox'][name='check']").change(function() {
    $('#submitDetails').valid();
});


Fiddle here

【讨论】:

  • 我试过你的 jsfiddle。当我单击提交按钮并且未选中任何复选框时,我确实收到了错误消息。但是,当现在选中复选框时,错误消息不会消失..它也应该在选中和未选中复选框的情况下打开和关闭。也就是说,当没有选中任何内容时,它应该有错误消息..和当检查错误消息时,就像其他错误字段一样
  • 要在选中复选框时删除错误消息,我已经更新了 Fiddle,请参阅编辑。
  • 谢谢。但是,如果用户取消单击它,它不会再次恢复。所以让我们说用户点击提交按钮他收到错误消息。当用户选择其中一个复选框时,错误消息会消失。 (直到现在还好)。但是,如果用户现在决定取消单击复选框,错误消息应该会重新出现。它应该在更改权时切换
  • 谢谢。但是当我尝试实现它时,我注意到了一些东西。您更改了每个相关元素的 name 属性,使它们都具有相同的名称。开始的想法是他们将有不同的名字:)。所以基本上你的解决方案最后并没有帮助我。但是感谢您的尝试和欢呼
  • 复选框应该有相同的名字,如果你想定位特定的,你需要带上id。
【解决方案2】:

这很简单……

function validate_form()
{
valid = true;

if($('input[type=checkbox]:checked').length == 0)
{
    alert ( "ERROR! Please select at least one checkbox" );
    valid = false;
}

return valid;
}

HTML

<form name="myform" method="post" action="#" onsubmit="return validate_form();">
<input type="checkbox" name="box1"  value="box1">Box1
<input type="checkbox" name="box2"  value="box2">Box2
<input name="submit" type="submit" value="Submit"/>
</form>

【讨论】:

    【解决方案3】:

    引用OP

    “我想确保至少有一个复选框被选中。”

    如果您想使用 jQuery Validate 插件,并且所有复选框都有不同的 name,只需使用 the additional-methods.js file 中的 require_from_group 方法即可。

    由于您在这些复选框上已经有一个名为 require-one 的通用类,因此更加简单。

    $('#form').validate({
        rules: {
            fieldname: {
                require_from_group: [1, '.require-one']
            },
            // declare same rule on all eight checkboxes
            ....
            ....
        }
    });
    

    但是,您可以使用 jQuery .each() 中的 .rules('add') 方法一次性声明它们,而不是在 .validate() 中声明所有这八个。

    $('.require-one').each(function () {
        $(this).rules('add', {
            require_from_group: [1, this],
            messages: {
                require_from_group: "please check one"
            }
        });
    });
    

    然后要将所有八条消息合二为一,请使用groups 选项...

    $('#form').validate({
        groups: {  // combine these error messages into one
            checkboxes: 'allwines beer redwines cider whitewines spirits sparkling fortified'
        }
    });
    

    工作演示:http://jsfiddle.net/JVWu2/1/

    将您的错误消息放入 #error_msg3 错误框与放入任何其他 jQuery Validate 消息没有什么不同。

    【讨论】:

    • 嗨@Sparky,我已经在jsfiddle jsfiddle.net/dHrvT/15 中添加了我的代码。但是,您可以添加您的解决方案并让我知道它是否有效。我尝试了真正的登台链接,但无法做到。我确实相信您的解决方案有效.. 我似乎无法将一个与另一个集成
    • @Himu,I fully answered your question as you originally posted it。您的 OP 中没有提到将其与 prettyCheckable 集成。 IMO,这是一个完全不同的问题。 jQuery Validate 插件只查看你真正的复选框元素,直到你弄清楚如何切换这些元素,这永远不会起作用。
    • @Himu,我还注意到您的 jQuery 代码不必要地重复。几乎所有的.on('change') 处理程序都可以合并为一个,您只需调用一次.prettyCheckable()。只需使用适当的 jQuery 选择器一次选择所有目标元素即可。
    【解决方案4】:

    试试这个

    $("#YourbuttonId").click(function(){
        if($('input[type=checkbox]:checked').length == 0)
        {
            alert('Please select atleast one checkbox');
        }
    });
    

    通过插件

    HTML

    <label class="checkbox inline">
    <input type="checkbox" id="typecb1" name="spamm[]" value="Loading Point"> Loading Point
    </label>
    <label class="checkbox inline">
    <input type="checkbox" id="typecb2" name="spamm[]" value="Unloading Point"> Unloading Point
    </label>
    <label class="checkbox">
    <input type="checkbox" id="typecb3" name="spamm[]" value="Retailer Unloading"> Retailer Unloading
    </label>
    

    脚本

    rules:{
         "spamm[]": { 
          required: true, 
          minlength: 1 
          }
       }
    

    【讨论】:

    • 请不要警告框。正如我所说,没有警报框。如果可能的话,作为与上述 jQuery 验证插件集成的解决方案
    【解决方案5】:

    试试

    添加此代码即可

    var chck = $('input[type=checkbox]');
    chck.addClass('check-one');
    $.validator.addMethod('check-one', function (value) {
        return (chck.filter(':checked').length > 0);
    }, 'Check at least one checkbox');
    


    fiddle Demo

    组只会在前面的第一个复选框中显示错误

    var chck = $('input[type=checkbox]');
    chck.addClass('check-one');
    $.validator.addMethod('check-one', function (value) {
        return (chck.filter(':checked').length > 0);
    }, 'Check at least one checkbox');
    var chk_names = $.map(chck, function (el, i) {
        return $(el).prop("name");
    }).join(" ");
    $("#submitDetails").validate({
        groups: {
            checks: chk_names
        },
        submitHandler: function (form) {
            alert('Form Submited');
            return false;
        }
    });
    


    如果您希望在所有复选框前显示错误,请删除组

    fiddle Demo

    $("#submitDetails").validate({
        submitHandler: function (form) {
            alert('Form Submited');
            return false;
        }
    });
    

    【讨论】:

    • 谢谢图沙尔。你的答案是如此接近。你可以在这里看到它bitly.com/1i3f1MY 它在 jsfillde 中工作。我究竟做错了什么?这是我使用的js文件 bit.ly/1aNWWMl 你可以看到我添加的代码。单击提交按钮时,它会显示在所有标签之后……不像 jsFiddle 中的方式。它需要有点像 jsFiddle...单击提交按钮时,它应该显示在
      中,并且当单击任何复选框时,错误消息应该消失。
    • 您好。试图修复它。不能。如果你能帮我解决这个问题,请告诉我。谢谢
    • @Himu 使用完整的form 代码查看此Demo
    • 请看 jsfiddle。我已经在那里添加了我的代码无法让它与您的代码一起使用...所以您可以试一试...请
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多