I have been trying to convert my code using the ES6 syntax and wondering why are my form’s radio and checked buttons not registering as true when check. I still get the error message even if a user selects one of the choices? Could you please help me with what I’m doing wrong so I can better understand.
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Validate me</title> <script type="text/javascript"> validateAll =()=> { var formdata = document.forms[0].elements; var numelems = formdata.length; var checkboxelem = false; var radioelem = false; var msg = ''; var radmsg = ''; var checkmsg = ''; var textmsg = ''; var checker = true; for (let i = 0;i<numelems;i++){ if (formdata[i].type == 'text' && formdata[i].value === ''){ msg += "<br>please enter your " + formdata[i].name; checker = false; } if (formdata[i].type == 'radio'){ radname = formdata[i].name; const numelems = document.getElementsByName(radname).length; for (let rad=0;rad<numelems; rad++) { if (radname[rad].checked === true){ radioelem = true; } } if (radioelem === false){ radmsg = "<br>please select a " + radname; checker = false; } } if (formdata[i].type == 'checkbox'){ grpname = formdata[i].name; const numelems = document.getElementsByName(grpname).length; for (let chk=0;chk<numelems; chk++) { if (grpname[chk].checked === true){ checkboxelem = true; } } if (checkboxelem === false){ checkmsg = "<br>please check a " + grpname; checker = false; } } if (formdata[i].type == 'select-one' && formdata[i].value === ''){ msg += "<br>please select your " + formdata[i].name; checker = false; } if (formdata[i].type == 'textarea' && formdata[i].value === ''){ textmsg += "<br>please enter your " + formdata[i].name; checker = false; } } document.getElementById('err').innerHTML = msg + radmsg + checkmsg + textmsg; return checker; } </script> </head> <body> At lease one piece of data has to come in from every input type.<br><br> <span id = "err"></span> <form action = "dynamic.html" method = "post" onsubmit="return validateAll();" ><br/> Name:<input type = "text" name = "fullname" placeholder="Enter Full Name"/><br/> Gender:<br/> Male<input type = "radio" name = "gender" value="male"/>Female<input type = "radio" name = "gender" value="female"/><br/> Hobbies <br/> Baseball <input type = "checkbox" name = "hobbies[]" value = "baseball" /> Football <input type = "checkbox" name = "hobbies[]" value = "football" /> Hockey <input type = "checkbox" name = "hobbies[]" value = "hockey" /><br/> Favorite Show <select name = "show"> <option value = "">Choose Below</option> <option value = "ATHF">Aqua Teen Hunger Force</option> <option value = "Family Guy">Family Guy</option> <option value = "Simpsons">Simpsons</option> </select><br/> Comments<br/> <textarea cols = "50" rows = "6" name = "comments"></textarea><br/> <input type = "submit" name = "submit" value = "enter me" /> </form> </body> </html>
Advertisement
Answer
Cycle is going though the string property, not that consist the DOM elements:
const numelems = document.getElementsByName(radname).length; for (let rad=0;rad<numelems; rad++) { if (radname[rad].checked === true){ radioelem = true; } }
At least it should be:
const radioInputs = document.getElementsByName(radname); const numelems = radioInputs.length for (let rad=0;rad<numelems; rad++) { if (radioInputs[rad].checked === true){ radioelem = true; } }