I have a case where radio button groups are generated dynamically in a form.
Requirements:
- The number of buttons per group could be one or many.
- There is a function which checks whether a radio button selection has been made and alerts an error if no selection is made.
When there is only one radio button the check fails and alerts an error, even when the button is selected. When I log (or in this case alert) the form element I get a different object type for a single group or a multiple group: HTMLInputElement
vs RadioNodeList
. Since the check function checkkRb()
iterates through a list and HTMLInputElement
returns a length of undefined, in a single button group the selection is not caught.
Why are the object types different? Why not a RadioNodeList
of length 1 for a single radio button?
How can I check a variety of radio button groups when the number of buttons is unknown?
Here is a stripped down example:
HTML
<form action="">
<!-- Single radio button -->
<label for="single">Single</label>
<input type="Radio" id="single" name="offering" value="single" checked>
<!-- Multiple radio buttons -->
<p>Multiple</p>
<label><input type="Radio" id="yes" name="choices" value="Yes"> Yes </label>
<label><input type="Radio" id="no" name="choices" value="No"> No </label>
<div> </div>
<input type="Submit" id="Submit" name="Submit" value="Continue" onclick="return checkForm(this.form)">
</form>
JS
function checkRb(rb){
var error = '';
var flag = 0;
var itschecked = 0
alert(rb);
for (var i = 0; i < rb.length; i++){
if (rb[i].checked){
itschecked = 1;
}
}
if (itschecked == 0){
error = error + "Error message \r\r";
flag = 1;
}
return {flag: flag, error: error};
}
function checkForm(form){
var error = '';
var flag = 0;
var ckSingle = checkRb(form.offering);
if (ckSingle.flag == 1){
flag = 1;
}
error += ckSingle.error;
var ckMultiple = checkRb(form.choices);
if (ckMultiple.flag == 1){
flag = 1;
}
error += ckMultiple.error;
// alert error if selection is not made
if (flag == 1){
alert(error);
return false;
}
return true;
}