【问题标题】:How to validate two sets of radio buttons in one form using JavaScript?如何使用 JavaScript 在一个表单中验证两组单选按钮?
【发布时间】:2017-11-03 13:30:29
【问题描述】:

我在一个表单中有两组单选按钮。如果您没有检查每组一个单选按钮,则您不应该能够发送表单。如果可能的话,我想要一个 JS only(没有 jQuery)的解决方案。我在这里的一个较旧的问题中发现了一个有用的功能,并试图将其调整到我的情况,但我显然失败了。我的错在哪里?

<form>

<input type="radio" name="date_1" id="dat-1_27-10" value="2017-10-27" <?php echo $checked1 ;?> />
<input type="radio" name="date_1" id="dat-1_28-10" value="2017-10-28" <?php echo $checked2 ;?> />
<input type="radio" name="date_1" id="dat-1_03-11" value="2017-11-03" <?php echo $checked3 ;?> />
<input type="radio" name="date_1" id="dat-1_04-11" value="2017-11-04" <?php echo $checked4 ;?> />

<input type="radio" name="date_2" id="dat-2_27-10" value="2017-10-27" <?php echo $checked5 ;?> />
<input type="radio" name="date_2" id="dat-2_28-10" value="2017-10-28" <?php echo $checked6 ;?> />
<input type="radio" name="date_2" id="dat-2_03-11" value="2017-11-03" <?php echo $checked7 ;?> />
<input type="radio" name="date_2" id="dat-2_04-11" value="2017-11-04" <?php echo $checked8 ;?> />

<input type="submit" name="send" value="send" id="submit" onclick='return validateDateOne(); return validateDateTwo();'/>

</form>

<script>

function validateDateOne() {
      if (!$("input[name='date_1']:checked").val()) {
          alert('Please choose your favourite date');
          return false;
      }
      else {}
}

function validateDateTwo() {
      if (!$("input[name='date_2']:checked").val()) {
           alert('Please choose a second date');
           return false;
      }
      else {}
}

</script>

【问题讨论】:

  • 只有一个函数可以验证。在该函数中添加您的逻辑
  • 只是试图通过完全删除函数 validateDateTwo() 来验证 one 组单选按钮是行不通的。我想,函数本身一定有错误?

标签: javascript forms validation radio-button


【解决方案1】:

在函数validateDateOne()的else条件内使用retrun语句调用函数validateDateTwo(),而不是在onclick中调用它。

对于 Pure JS 解决方案,我使用 querySelector 而不是 $

function validateDateOne() {
      if (!document.body.querySelector("input[name='date_1']:checked")) {
          alert('Please choose your favourite date');
          return false;
      }
      else {
         return validateDateTwo();
      }
}

function validateDateTwo() {
      if (!document.body.querySelector("input[name='date_2']:checked")) {
           alert('Please choose a second date');
           return false;
      }
      else {}
}
<form>

<input type="radio" name="date_1" id="dat-1_27-10" value="2017-10-27"  />2017-10-27
<input type="radio" name="date_1" id="dat-1_28-10" value="2017-10-28"  />2017-10-28
<input type="radio" name="date_1" id="dat-1_03-11" value="2017-10-28"  />2017-10-28
<input type="radio" name="date_1" id="dat-1_04-11" value="2017-11-04"  />2017-11-04
<br/>
<input type="radio" name="date_2" id="dat-2_27-10" value="2017-10-27"  />2017-10-27
<input type="radio" name="date_2" id="dat-2_28-10" value="2017-10-28"  />2017-10-28
<input type="radio" name="date_2" id="dat-2_03-11" value="2017-11-03"  />2017-10-28
<input type="radio" name="date_2" id="dat-2_04-11" value="2017-11-04"  />2017-11-04

<input type="submit" name="send" value="send" id="submit" onclick='return validateDateOne();'/>

</form>

【讨论】:

    【解决方案2】:

    尝试验证checked 框长度并在表单的onsubmit 中添加validation 函数而不是button 点击。不需要两个函数只有一个函数就足够了

    function validateDate() {
      if (!$("input[name='date_1']:checked").length) //validate first one
      {
        console.log('select any one in first part');
        return false;
      }
      if (!$("input[name='date_2']:checked").length) //validate second one
      {
        console.log('select any one in second part')
        return false;
      }
    
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <form onsubmit="return validateDate()">
      <!--only do with single function-->
    
      <input type="radio" name="date_1" id="dat-1_27-10" value="2017-10-27" <?php echo $checked1 ;?> />
      <input type="radio" name="date_1" id="dat-1_28-10" value="2017-10-28" <?php echo $checked2 ;?> />
      <input type="radio" name="date_1" id="dat-1_03-11" value="2017-11-03" <?php echo $checked3 ;?> />
      <input type="radio" name="date_1" id="dat-1_04-11" value="2017-11-04" <?php echo $checked4 ;?> />
    
      <input type="radio" name="date_2" id="dat-2_27-10" value="2017-10-27" <?php echo $checked5 ;?> />
      <input type="radio" name="date_2" id="dat-2_28-10" value="2017-10-28" <?php echo $checked6 ;?> />
      <input type="radio" name="date_2" id="dat-2_03-11" value="2017-11-03" <?php echo $checked7 ;?> />
      <input type="radio" name="date_2" id="dat-2_04-11" value="2017-11-04" <?php echo $checked8 ;?> />
    
      <input type="submit" name="send" value="send" id="submit" />
    
    </form>

    【讨论】:

      【解决方案3】:

      将您的支票组合在一个函数中。另外我建议使用 jQuery 附加一个提交处理程序。

      这是一个有效的jsfiddle

      <input type="submit" name="send" value="send" id="submit" />
      
      
      $('#myform').submit(function(e){
              e.preventDefault();
            if (!$("input[name='date_1']:checked").val()) {
                alert('Please choose your favourite date');
                return;
            }
              if (!$("input[name='date_2']:checked").val()) {
                 alert('Please choose a second date');
                 return;
            }
            alert("submit")
      });
      

      请注意,Jquery 提交处理程序包装在 onDomReady 处理程序中。

      另外:客户端验证绝不是安全的。为了确保输入数据,也要在后端进行验证。

      【讨论】:

      • 感谢您指出安全问题!不过,在这种情况下,我被要求编写一个仅客户端实现作为学习 JS 的项目。
      • @lioness 这完全没问题,但请记住 ;) 不过,此解决方案适用于客户端。
      • 至于你的代码,我只是在复制后更改了ID“#myform”,但它似乎不起作用?相反,我检查所有常规文本字段是否已填写的其他功能现在也不再起作用了。
      • 您是否使用文档就绪处理程序包装了 javascript 代码? learn.jquery.com/using-jquery-core/document-ready
      • 文档就绪处理程序确实使我的其他功能再次工作,但我仍然无法使您的代码工作。对不起,我真的是一个完整的初学者,虽然我最近几天了解了一些基本的 JS,但我以前从未使用过 jQuery(我确实嵌入了 jQuery,但......正确,我希望)。有没有一个 JS 唯一的解决方案?
      猜你喜欢
      • 2017-11-18
      • 2011-06-26
      • 2013-01-08
      • 2022-11-19
      • 2018-02-19
      • 2016-05-27
      • 2013-02-01
      • 1970-01-01
      • 2013-01-24
      相关资源
      最近更新 更多