Javascript表单验证复选框和单选不起作用

Javascript form validation checkbox and radio not working

本文关键字:单选 不起作用 复选框 表单 验证 Javascript      更新时间:2023-09-26

我有一个表单,我需要用javascript验证,以确保至少一个复选框和一个单选被选中。我知道使用jQuery可能会更容易,但我正试图用纯javascript来完成这一点。下面是代码:

<form name="bulbform" action="compute.php"  onsubmit=" return validateForm()" method="post">
<p>Enter your name: <input type="text" name="name" size="20"></p>
<p><strong>Light Bulbs</strong></p>
<label><input type="checkbox" name="bulbs[]" value="2.39">Four 25-watt light bulbs for  $2.39</label><br>
<label><input type="checkbox" name="bulbs[]" value="4.29">Eight 25-watt light bulbs for  $4.29</label><br>
<label><input type="checkbox" name="bulbs[]" value="3.95">Four 25-watt long-life light bulbs $3.95</label><br>
<label><input type="checkbox" name="bulbs[]" value="7.49">Eight 25-watt long-life light bulbs $7.45</label><br>
<p><strong>Payment Method</strong></p>
<label><input type="radio" name="cc" value="Visa">Visa</label><br>
<label><input type="radio" name="cc" value="Master Card">Master Card</label><br>
<label><input type="radio" name="cc" value="Discover">Discover</label><br>
<p><input type="submit" value="Order" /> <input type="reset" value="Clear form"/></p></form>

这是我的javascript

  var radios = document.getElementsByTagName('input');
  var value;
  for (var i = 0; i < radios.length; i++) {
    if (radios[i].type === 'radio' && radios[i].checked) {
      // get value, set checked flag or do whatever you need to
      value = radios[i].value;
      alert(value);
      return true;
    }
    else{
      alert("You must select a payment method.")
      return false;
    }

删除else后,我能够显示所选择的信用卡,但是当我添加else时,它总是说您必须选择付款方式,并且永远不会正确…提前感谢你给的任何建议。

查看此柱塞:https://plnkr.co/edit/5NiIA1w9axvmOJEjXVlP

function validateForm() {
  var radios = document.getElementsByTagName('input');
  var value;
  var paymentMethodSelected = false;
  for (var i = 0; i < radios.length; i++) {
    if (radios[i].type === 'radio' && radios[i].checked) {
      // get value, set checked flag or do whatever you need to
      value = radios[i].value;
      alert(value);
      paymentMethodSelected = true;
    }
  }
  if (!paymentMethodSelected) {
    alert("You must select a payment method.");
    return false;
  }
  return true;
}
  • 你没有结束的form标签(不重要,但良好的做法)
  • 在检查所有单选按钮之前,您正在从验证函数返回
  • 对无效表单状态的检查应该在for循环之外处理

变量radios包含复选框、文本框和单选按钮。单选按钮和文本框不是复选框。
因此,条件radios[i].type=='radio' && radios.type='checked'求值为false,其他部分求值。

下面的代码使用变量checkedCBcheckedRadio来存储是否选中了任何复选框或单选按钮。

试试这样写:

function validateForm() {
  var inputs = document.getElementsByTagName('input');
  var valued;
  var checkedCB=false,checkedRadio=false;
  for (var i = 0; i < inputs.length; i++) {
    if (inputs[i].type == 'checkbox' && inputs[i].checked) {
            checkedCB=true;
    }
    else if(inputs[i].type == 'radio' && inputs[i].checked) {
        checkedRadio=true;
    }
    if(checkedRadio && checkedCB) return true;
  }
  alert("You must select atleast one light bulb and a payment method.");
  return false;
}

您可以将属性checked放在任何一个单选按钮中。例如

<label><input type="radio" name="cc" value="Visa" checked>Visa</label><br>

如果你想确保在表单提交之前至少有一个复选框和一个单选按钮被选中,那么你可以在脚本中引入计数器变量,它将计算在循环中选中了多少个复选框和单选按钮。

在返回之前,至少选中一个复选框和一个单选,如下所示:

if(checkbox_checked_count>=1&&radio_checked_count==1){
alert("Yahoo! You have successfully validated your form.")
return true;
}else{
  alert("You must select a payment method.")
  return false;
}

你的validateForm()函数的完整脚本可以像下面这样:

function validateForm(){
var inputs = document.getElementsByTagName('input');
var radio_checked_count=0;
var checkbox_checked_count=0;
var i;
for (i = 0; i < inputs.length; i++) {
if (inputs[i].type == "checkbox"&&inputs[i].checked) {
    checkbox_checked_count++;
}
if (inputs[i].type == "radio"&&inputs[i].checked) {
    radio_checked_count++;
}   
}  
if(checkbox_checked_count>=1&&radio_checked_count==1){
alert("Yahoo! You have successfully validated your form.")
return true;
}else{
  alert("You must select a payment method.")
  return false;
}
} 

这是你的javascript正在做的。

它检查第一个单选按钮,发现它没有被选中,所以它执行else语句并提醒你必须选择一张卡片或其他东西。然后它遇到返回false语句并退出循环(不管它返回什么,返回语句都会退出循环)。就是这样。

如果您使用已检查的属性选中了第一个复选框,它将发现第一个单选按钮被选中,然后警告它并在不检查其余按钮的情况下返回循环。如果要编辑for循环,则问题中的for循环未关闭。

您应该只在for循环之后提示用户付款选择,尝试以下代码片段:

function validateForm() {
  var payments = document.getElementsByName("cc");
  var count = payments.length;
  var selected = false;
  while (count--)
    if (selected = payments[count].checked)
      break;
  if (!selected) {
    alert('Choose payment method');
    return false;
  }
  return true;
}
<form name="bulbform" action="compute.php" onsubmit=" return validateForm()" method="post">
  <p><strong>Payment Method</strong>
  </p>
  <label>
    <input type="radio" name="cc" value="Visa">Visa</label>
  <br>
  <label>
    <input type="radio" name="cc" value="Master Card">Master Card</label>
  <br>
  <label>
    <input type="radio" name="cc" value="Discover">Discover</label>
  <br>
  <p>
    <input type="submit" value="Order" />
    <input type="reset" value="Clear form" />
  </p>

感谢Mahesh Bansod的帮助,我使用了他们的例子并根据我的需要进行了调整。下面是我的工作验证代码的文本框,复选框和单选。

function validateForm(){
  //check to make sure the name is not blank
  var cusName = document.forms["bulbform"]["name"].value;
  if (cusName == null || cusName == ""){
    alert("Your name must be filled out.");
    return false;
  }
  //check to see that atleast one radio and checkbox are checked
  var inputs = document.getElementsByTagName('input');
  var checkCheckBox=false, checkRadio=false; //set both rado and checkbox to false
  for (var i = 0; i < inputs.length; i++) {
    if (inputs[i].type == 'checkbox' && inputs[i].checked) {
      checkCheckBox=true; //set checkbox true if one is checked
    }
    else if(inputs[i].type == 'radio' && inputs[i].checked) {
      checkRadio=true; //set radio true if one is checked
    }
    if(checkRadio && checkCheckBox) return true; //if both are true return true
  }
  //if checkbox is false alert user and return false
  if(!checkCheckBox){
    alert("You must select atleast one item.");
    return false; //
  }
  //if radio is false alert user and return false
  if(!checkRadio){
    alert("You must select a payment method.");
    return false;
  }
}