验证 - 至少选中一个复选框

Posted

技术标签:

【中文标题】验证 - 至少选中一个复选框【英文标题】:Validating - at least one checkbox is checked 【发布时间】:2017-07-27 23:26:17 【问题描述】:

我在验证是否至少选中了一个复选框时遇到了问题。

相同的代码被用于不同的表单并且它工作完美,但我不知道为什么它不在这个表单上。

脚本:

if(jQuery('#MOTForm input[type=checkbox]:checked').length == 0)  
       alert("1");
       valid = valid && false;
       $("#MOTFORMERROR").css('color', 'red');
       $("#MOTFORMERROR").html("*Choose at least one");
else
       $("#MOTFORMERROR").html("");

HTML:

<td style="width: 10%;" rowspan="3">
    <div style="padding-left:5px;">
       <form id="MOTForm">
           <input name="" type="checkbox"  class="form-check-input"/> HEMS<br />
           <input name="" type="checkbox"  class="form-check-input"/> EMS<br /> 
           <input name="" type="checkbox"  class="form-check-input"/> Walk-in<br />
       </form>

       <p id="MOTFORMERROR"></p>
    </div>
</td>

if 语句块中的代码一直在运行,而不是 else 语句块中的代码,即使一个或全部复选框已选中!

【问题讨论】:

您在此处显示的代码中没有任何内容必然会导致问题。您可以尝试在选择器中引用属性;例如,'#MOTForm input[type="checkbox"]:checked' 但我怀疑这是问题所在。也许您有两个具有相同 ID 的元素? valid 最初在哪里声明/初始化?该javascript代码何时运行?它会在页面加载、表单提交、另一个事件发生(例如按钮点击)等时运行吗? 我仔细检查,没有两个元素具有相同的id valid 在.click 开头声明 当您说“相同的代码”时,您的意思是在同一页面中 100% 相同?如果是这样,那么这是您的问题,因为您有重复的 id,例如&lt;form id="MOTForm"&gt; 【参考方案1】:

您的代码没有显示 javascript 执行时,可能是您的复选框在您查找它们时尚未呈现。

事实上,如果您按照您在此处发布的确切顺序运行代码,那么您的条件始终为真是完全正常的。

如果你把你的代码放在一个函数中,在所有 HTML 渲染完成后调用,一切都会完美:

<td style="width: 10%;" rowspan="3">
    <div style="padding-left:5px;">
        <form id="MOTForm">
            <input name="" type="checkbox"  class="form-check-input"/> HEMS<br />
            <input name="" type="checkbox"  class="form-check-input"/> EMS<br />
            <input name="" type="checkbox"  class="form-check-input"/> Walk-in<br />
        </form>
        <p id="MOTFORMERROR"></p>
    </div>
</td>



<!-- ... -->



<button id="check_btn">Click me</button>



<!-- ... -->



<script>
var valid;

$('#check_btn').click(function() 
    if ($('#MOTForm input[type=checkbox]:checked').length == 0) 
        valid = false;
        $("#MOTFORMERROR").css('color', 'red');
        $("#MOTFORMERROR").html("*Choose at least one");
     else 
        $("#MOTFORMERROR").html("");
    
);
</script>

【讨论】:

【参考方案2】:

由于未定义变量 valid,因此您的初始代码中存在错误(见下文)。此错误在browser console 中可见。

未捕获的引用错误:未定义有效

由于该错误,valid = valid &amp;&amp; false; 之后的行没有被执行。

要解决此问题,请在运行此代码之前声明该变量:

var valid = false;
//...other code to check if form is valid

然后将原始 JavaScript 代码移动到可以在提交时运行的函数中(例如 function check() ...)。请参阅下面的演示。它使用 jQuery 函数 .click() 将事件处理程序绑定到提交按钮。您还会注意到它使用.ready() 等待DOM 准备就绪,然后再将事件处理程序绑定到提交按钮。

//wait until DOM is ready to bind check function to button click
$(document).ready(function(readyEvent) 
  $('#submit').click(check);
)
var valid = false;
function check() 
  if (jQuery('#MOTForm input[type=checkbox]:checked').length == 0) 
    alert("1");
    valid = valid && false;
    $("#MOTFORMERROR").css('color', 'red');
    $("#MOTFORMERROR").html("*Choose at least one");
   else 
    console.log('no error- clearing error html');
    $("#MOTFORMERROR").html("");
  
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div style="padding-left:5px;">
  <form id="MOTForm">
    <input name="" type="checkbox" class="form-check-input" /> HEMS
    <br />
    <input name="" type="checkbox" class="form-check-input" /> EMS
    <br />
    <input name="" type="checkbox" class="form-check-input" /> Walk-in
    <br />

<button id="submit">
  Submit
</button>
  </form>
  <p id="MOTFORMERROR"></p>
</div>

更新:

您在帖子中输入了评论(回复其他 cmets 中的问题):

valid 在.click 开头声明

现在这些信息被揭露了,这让我觉得我上面所说的大部分内容都是无用的。将 valid 的声明移动到点击处理程序中似乎是一个微不足道的变化,除此之外并没有太大的不同......请参见下面的示例:

//wait until DOM is ready to bind check function to button click
$(document).ready(function(readyEvent) 
  $('#submit').click(check);
)
function check() 
  var valid = false;
  if (jQuery('#MOTForm input[type=checkbox]:checked').length == 0) 
    alert("1");
    valid = valid && false;
    $("#MOTFORMERROR").css('color', 'red');
    $("#MOTFORMERROR").html("*Choose at least one");
   else 
    console.log('no error- clearing error html');
    $("#MOTFORMERROR").html("");
  
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div style="padding-left:5px;">
  <form id="MOTForm">
    <input name="" type="checkbox" class="form-check-input" /> HEMS
    <br />
    <input name="" type="checkbox" class="form-check-input" /> EMS
    <br />
    <input name="" type="checkbox" class="form-check-input" /> Walk-in
    <br />

<button id="submit">
  Submit
</button>
  </form>
  <p id="MOTFORMERROR"></p>
</div>

【讨论】:

【参考方案3】:

请看下面的sn-p。它可以满足您的需求。我删除了 valid 变量,因为使用此参数的位置不明显。显然,您可以添加它并按照您的想法使用它。

$(function()
   
    function checkCheckBoxes()   
        if($('#MOTForm input[type=checkbox]:checked').length == 0)  
           alert("1");
           $("#MOTFORMERROR").css('color', 'red');
           $("#MOTFORMERROR").html("*Choose at least one");
          else 
           $("#MOTFORMERROR").html("");
        
    
    
    $(".js-check").on("change", checkCheckBoxes);
    
    checkCheckBoxes();
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<td style="width: 10%;" rowspan="3">
    <div style="padding-left:5px;">
        <form id="MOTForm">
            <input name="" type="checkbox"  class="form-check-input js-check"/> HEMS<br />
            <input name="" type="checkbox"  class="form-check-input js-check"/> EMS<br /> 
            <input name="" type="checkbox"  class="form-check-input js-check"/> Walk-in<br />
        </form>
        <p id="MOTFORMERROR"></p>
    </div>
</td>

【讨论】:

以上是关于验证 - 至少选中一个复选框的主要内容,如果未能解决你的问题,请参考以下文章

至少一个复选框必须在其中一个取消选择操作时保持选中状态

angularjs复选框验证至少两个

为啥比较选中的属性不适用于检查至少一个复选框被选中?

确保为多组复选框选中至少一个复选框?

在 reactJS 中验证复选框的简单函数

检查表单提交时至少选中一个复选框