Reputation: 45
I have been looking for a reason why my form validation is not working for the past 3 hours and can't seem to find the answer.
I have the external script file in the HTML, form id, onclick event. What am I missing? Can anyone help please?
HTML
<script src="registration.js"></script>
<form id="registration">
<fieldset>
<legend>Individual/Company Details</legend>
<br />
<label class="error">Fields with an asterisk (*) are required</label>
<br />
<br />
<label>First Name *: </label>
<br />
<input id="firstname" name="firstname" type="text" />
<br />
<label>Last Name *: </label>
<br />
<input id="lastname" name="lastname" type="text" />
<br />
<label>Username *: (alpha-numeric characters only) </label>
<br />
<input id="username" name="username" type="text" />
<br />
<label>Password *: (8 characters with 2 characters being numbers) </label>
<br />
<input id="password" name="password" type="password" />
<br />
<label>Date of Birth: (dd/mm/yyyy) </label>
<br />
<input id="dob" name="dob" type="text" />
<br />
<label>Gender: </label>
<br />
<br />
<input id="gender" class="radio" name="gender" type="radio" value="Male" />Male
<input class="radio" name="gender" type="radio" value="Female" />Female
<input class="radio" name="gender" type="radio" value="Other" />Other
<br />
<br />
<label>E-mail *: </label>
<br />
<input id="email" name="email" type="text" />
<br />
<label>Address *: (alpha-numeric characters only)</label>
<br />
<textarea id="address" name="address" cols="20" rows="10"></textarea>
<br />
</fieldset>
<fieldset>
<legend>Membership</legend>
<br />
<label>Membership Type *: </label>
<select id="membership" name="membership">
<option value= "" selected= "selected">(select membership type)</option>
<option value= "gold">Gold</option>
<option value= "silver">Silver</option>
<option value= "mithril">Mithril</option>
</select>
<br />
<br />
</fieldset>
<p class="buttons">
<label>
<input class= "button" type= "reset" value= "Clear" />
<input class= "button" type= "submit" value= "Submit" onclick= "validateForm();" />
</label>
</p>
</form>
registration.js
// JavaScript Document
// Conditions are checked upon submission of form and error messages are displayed
function validateForm() {
var error_message = "";
// Different functions for validation of different input
error_message += validateFirstName();
error_message += validateLastName();
error_message += validateUserName();
error_message += validatePassword();
error_message += validateDoB();
error_message += validateGender();
error_message += validateEmail();
error_message += validateAddress();
error_message += validateMembership();
error_message += validateDuration();
if (error_message != "") {
alert("Some fields have invalid entry:\n" + error_message);
return false;
}
return true;
}
// Validation of First Name
function validateFirstName() {
var error = "";
var nonletters = /[^a-zA-Z]+/;
if (document.forms["registration"]["firstname"].value.length == 0) // condition is checked if field is left blank
{
registration.firstname.focus();
error = "First name is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["firstname"].value.match(nonletters)) // condition is checked if field is alphabetical characters only
{
registration.firstname.focus();
registration.firstname.select();
error = "Alphabetical characters only for first name \n"; // error message is displayed if field is not alphabetical characters only
}
return error;
}
// Validation of Last Name
function validateLastName() {
var error = "";
var nonletters = /[^a-zA-Z]+/;
if (document.forms["registration"]["lastname"].value.length == 0) // condition is checked if field is left blank
{
registration.lastname.focus();
error = "Last name is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["lastname"].value.match(nonletters)) // condition is checked if field is alphabetical characters only
{
registration.lastname.focus();
registration.lastname.select();
error = "Alphabetical characters only for last name \n"; // error message is displayed if field is not alphabetical characters only
}
return error;
}
// Validation of User Name
function validateUserName() {
var error = "";
var nonalphanum = /[^0-9a-zA-Z]+/;
if (document.forms["registration"]["username"].value.length == 0) // condition is checked if field is left blank
{
registration.username.focus();
error = "User name is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["username"].value.match(nonalphanum)) // condition is checked if field is alpha-numeric characters only
{
registration.username.focus();
registration.username.select();
error = "Alpha-numeric characters only for user name \n"; // error message is displayed if field is not alpha-numeric characters only
}
return error;
}
// Validation of Password
function validatePassword() {
var error = "";
var nonalphanum = /[^0-9a-zA-Z]+/;
var numbers = /(?=(.*\d){2})/;
if (document.forms["registration"]["password"].value.length == 0) // condition is checked if field is left blank
{
registration.password.focus();
error = "Password is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["password"].value.length != 8) // condition is checked if password is not eight characters
{
registration.password.focus();
registration.password.select();
error = "Password of 8 characters is required \n"; // error message is displayed if password is not eight characters
} else if (document.forms["registration"]["password"].value.match(nonalphanum)) // condition is checked if field is alpha-numeric characters only
{
registration.password.focus();
registration.password.select();
error = "Alpha-numeric characters only for password \n"; // error message is displayed if field is not alpha-numeric characters only
} else if (!(document.forms["registration"]["password"].value.match(numbers))) // condition is checked if field has at least two numbers
{
registration.password.focus();
registration.password.select();
error = "Password must contain at least 2 numbers \n"; // error message is displayed if field does not have at least two numbers
}
return error;
}
// Validation of Date of Birth
function validateDoB() {
var error = "";
var dob = document.forms["registration"]["dob"].value;
var validdob = /\d{2}\/\d{2}\/\d{4}/;
if (dob.length == 0) // condition is checked if field is left blank
{
error = ""; // no error message is displayed if field is blank
} else if (!(dob.match(validdob))) // condition is checked if field is in correct format
{
registration.dob.focus();
registration.dob.select();
error = "Please enter date of birth in valid format \n"; // error message is displayed if field is in incorrect format
}
return error;
}
// Validation of Gender
function validateGender() {
var error = "";
if (document.forms["registration"]["gender"].value.unchecked) // condition is checked if field is left blank
{
error = ""; // no error message is displayed if field is blank
}
return error;
}
// Validation of Email Address and format validity
function validateEmail() {
var error = "";
var email = document.forms["registration"]["email"].value;
var emailformat = /\w+([\.-]?\w{1})*@\w{1}([\.-]?\w+)*(\.\w{1})+/
if (email.length == 0) // condition is checked if field is left blank
{
registration.email.focus();
error = "Email address is required \n"; // error message is displayed if field is blank
} else if (!(email.match(emailformat))) // condition is checked if field is in correct format
{
registration.email.focus();
registration.email.select();
error = "Please enter a valid email address \n"; // error message is displayed if invalid email address entered
}
return error;
}
// Validation of Address
function validateAddress() {
var error = "";
var nonalphanum = /[^0-9a-zA-Z]+/;
if (document.forms["registration"]["address"].value.length == 0) // condition is checked if field is left blank
{
registration.address.focus();
error = "An address is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["address"].value.match(nonalphanum)) // condition is checked if field is alpha-numeric characters only
{
registration.address.focus();
registration.address.select();
error = "Alpha-numeric characters only for address \n"; // error message is displayed if field is not alpha-numeric characters only
}
return error;
}
// Validation of Membership Type
function validateMembership() {
var error = "";
if (document.forms["registration"]["membership"].value == "default") // condition is checked if field is left as default
{
registration.membership.focus();
error = "Membership type must be selected \n"; // error message is displayed if field is not selected
}
return error;
}
// Validation of Membership Duration
function validateDuration() {
var error = "";
if (document.forms["registration"]["duration"].value == "default") // condition is checked if field is left as default
{
registration.duration.focus();
error = "Membership duration must be selected \n"; // error message is displayed if field is not selected
}
return error;
}
Upvotes: 1
Views: 352
Reputation: 3820
While it's ever so much easier to create a form and validate with HTML5 (see this article), the code now works; console.log() is a nice debugging tool. I commented out invoking "validateDuration()" since there is no corresponding HTML form field for membership duration.
What helps to ensure submitting a valid form is coding in the form element onsubmit="return validateForm()"
so that if the form fails to validate the function's return value is false which then gets returned in turn, thereby preventing the form from being submitted.
When it comes to form validation, you can either stop the action and focus on the invalid field and display an error message or you can display a laundry list of all the errors. I think it's more user-friendly to do the former, so I changed the code accordingly.
// registration.js contents:
var d = document;
d.f = d.forms;
d.g = d.getElementById;
var error_message = "";
function doErrorMsg(obj,em){
obj.innerHTML="<span>Invalid, as follows:</span><br>\n" + em;
obj.style.visibility="visible";
}
function validateForm(){
if (error_message = validateFirstName()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validateLastName()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validateUserName()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validatePassword()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validateDoB()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validateGender()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validateEmail()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validateAddress()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
else
if (error_message = validateMembership()) {
doErrorMsg( d.g("errormsg"),error_message);
return false;
}
//error_message += validateDuration();
if (error_message == ""){
return true;
}
}// end validateForm
// Validate First Name
function validateFirstName() {
var nonletters = /[^a-zA-Z]+/;
var fname = d.f["registration"]["firstname"];
if ( fname.value.length == 0 ) {
fname.focus();
fname.select();
return("First name is required<BR>\n");
}
else
if (fname.value.match(nonletters)) {
fname.focus();
fname.select();
return("Alphabetical characters only for first name \n");
}
return(""); // no error
}// end validateFirstName
// Validate Last Name
function validateLastName(){
var nonletters = /[^a-zA-Z]+/;
var lname = d.f["registration"]["lastname"];
if (lname.value.length == 0) {
lname.focus();
lname.select();
return("Last name is required<BR>\n");
}
else
if (lname.value.match(nonletters)) {
lname.focus();
lname.select();
return("Alphabetical characters only for last name<BR>\n");
}
return(""); // no error
}// end validate last name
// Validation of User Name
function validateUserName(){
var nonalphanum = /[^0-9a-zA-Z]+/;
var uname = d.f["registration"]["username"];
if (uname.value.length == 0) {
uname.focus();
uname.select();
return("User name is required<BR>\n");
}
else
if (uname.value.match(nonalphanum)) {
uname.focus();
uname.select();
return("Alpha-numeric characters only for user name<BR>\n");
}
return(""); // no error
}// end validate user name
// Validate Password
function validatePassword(){
var nonalphanum = /[^0-9a-zA-Z]+/;
var numbers = /(?=(.*\d){2})/;
var pword = d.f["registration"]["password"];
if (pword.value.length == 0) {
pword.focus();
pword.select();
return("Password is required<BR>\n");
}
else
if (pword.value.length != 8) {
pword.focus();
pword.select();
return("Password of 8 characters is required <BR>\n");
}
else
if ( pword.value.match(nonalphanum) ) {
pword.focus();
pword.select();
return("Alpha-numeric characters only for password<BR>\n");
}
else
if ( !pword.value.match( numbers ) ) {
pword.focus();
pword.select();
return("Password must contain at least 2 numbers<BR>\n");
}
return(""); // no error
}// end validate password
// Validate DoB
function validateDoB(){
var dob = d.f["registration"]["dob"];
var validdob = /\d{2}\/\d{2}\/\d{4}/;
if (dob.value.length == 0) {
return(""); // no error if blank field
}
else
if ( !( dob.value.match( validdob ) ) ) {
dob.focus();
dob.select();
return("Please enter date of birth in valid format<BR>\n");
}
return(""); // no error
}// end validate DoB
// Validate Gender
function validateGender(){
var gender = d.f["registration"]["gender"];
if (gender.value.unchecked) {
// no error if blank field
}
return(""); // no error
}
// Validate Email
function validateEmail() {
var email = d.f["registration"]["email"];
var emailformat = /\w+([\.-]?\w{1})*@\w{1}([\.-]?\w+)*(\.\w{1})+/
if (email.value.length == 0) {
email.focus();
email.select();
return("Email address is required<BR>\n");
}
else
if ( !( email.value.match( emailformat ) ) ){
email.focus();
email.select();
return("Please enter a valid email address<BR>\n"); }
return(""); // no error
}// end validate email
// Validate Address
function validateAddress(){
var alphanum = /[0-9a-zA-Z ,.\n\r]+/;
var addr = d.f["registration"]["address"];
if (addr.value.length == 0) {
addr.focus();
addr.select();
return("An address is required<BR>\n");
}
else
if (addr.value.match( alphanum ) ) {
return(""); // no error
}
else
{
addr.focus();
addr.select();
return("Alpha-numeric characters only for address <BR>\n");
}
}// end validate address
// Validatr Membership Type
function validateMembership(){
var membership = d.f["registration"]["membership"];
if ( membership.value == "default"){
membership.focus();
return("Membership type must be selected<BR>\n");
}
return(""); // no error
}// end validate membership type
// Validate (Membership) Duration
function validateDuration(){
var mDuration = d.f["registration"]["duration"];
if (mDuration.value == "default") {
mDuration.focus();
return("Membership duration must be selected <BR>\n");
}
return(""); // no error
}
submit.onclick = function() {
error_message = "";
d.g("errormsg").innerHTML="";
d.g("errormsg").style.visibility="hidden";
};
#errormsg {
color: #f00;
position:absolute;
top: 10vh;
left: 42vw;
width: 20vw;
padding: 10px;
border: 2px solid #000;
box-shadow: 2px 2px 6px #777;
visibility:hidden;
}
span {
color:black;
}
.button {
background:#000;
color:#0f0;
}
<div id="errormsg"></div>
<form id= "registration" onsubmit="return validateForm();">
<fieldset>
<legend>Individual/Company Details</legend>
<br />
<label class= "error">Fields with an asterisk (*) are required</label>
<br />
<br />
<label>First Name *: </label>
<br />
<input id= "firstname" name= "firstname" type= "text" />
<br />
<label>Last Name *: </label>
<br />
<input id= "lastname" name= "lastname" type= "text" />
<br />
<label>Username *: (alpha-numeric characters only) </label>
<br />
<input id= "username" name= "username" type= "text" />
<br />
<label>Password *: (8 characters with 2 characters being numbers) </label>
<br />
<input id= "password" name= "password" type= "password" />
<br />
<label>Date of Birth: (dd/mm/yyyy) </label>
<br />
<input id= "dob" name= "dob" type= "text" />
<br />
<label>Gender: </label>
<br />
<br />
<input id= "gender" class= "radio" name= "gender" type= "radio" value= "Male" />Male
<input class= "radio" name= "gender" type= "radio" value= "Female" />Female
<!--input class= "radio" name= "gender" type= "radio" value= "Other" />Other
<br /-->
<br />
<label>E-mail *: </label>
<br />
<input id= "email" name= "email" type= "text" />
<br />
<label>Address *: (alpha-numeric characters only)</label>
<br />
<textarea id= "address" name= "address" cols= "20" rows= "10"></textarea>
<br />
</fieldset>
<fieldset>
<legend>Membership</legend>
<br />
<label>Membership Type *: </label>
<select id= "membership" name= "membership">
<option value= "default" selected= "selected">(select membership type)</option>
<option value= "gold">Gold</option>
<option value= "silver">Silver</option>
<option value= "mithril">Mithril</option>
</select>
<br />
<br />
</fieldset>
<p class= "buttons">
<label>
<input class= "button" type= "reset" value= "Clear" />
<input id="submit" name="submit" class= "button" type= "submit" value= "Submit" />
</label>
</p>
</form>
Note, I changed the validation for the address field so that a user wouldn't get penalized for entering a comma, space or period as users are accustomed to do.
Comments should be used sparingly, otherwise they can obscure noticing the important items.
I used some short-hand to reduce the verbosity of the code. Also, I eliminated the variable error in the various validation functions and instead return the appropriate message which gets appended to the error_message.
Also, the alert() is gone, replaced with feedback on the webpage which is more convenient for the user. Note, in this case the submit button's onclick attribute is useful for removing old error messages.
Parenthetically-speaking, if the OP wishes to accommodate users who don't identify as traditionally male or female, one may wish to take a cue from Facebook rather than have an "Other" category (see here).
Upvotes: 0
Reputation: 834
Delete
<input class= "button" type= "submit" value= "Submit" onclick= "validateForm();" />
Use
document.getElementById("registration").addEventListener("submit", validateForm);
In your js file, try this:
function validateForm(event) {
var error_message = "";
// Different functions for validation of different input
error_message += validateFirstName();
error_message += validateLastName();
error_message += validateUserName();
error_message += validatePassword();
error_message += validateDoB();
error_message += validateGender();
error_message += validateEmail();
error_message += validateAddress();
error_message += validateMembership();
error_message += validateDuration();
if (error_message != "") {
alert("Some fields have invalid entry:\n" + error_message);
event.preventDefault();
}
}
// Validation of First Name
function validateFirstName() {
var error = "";
var nonletters = /[^a-zA-Z]+/;
if (document.forms["registration"]["firstname"].value.length == 0) // condition is checked if field is left blank
{
registration.firstname.focus();
error = "First name is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["firstname"].value.match(nonletters)) // condition is checked if field is alphabetical characters only
{
registration.firstname.focus();
registration.firstname.select();
error = "Alphabetical characters only for first name \n"; // error message is displayed if field is not alphabetical characters only
}
return error;
}
// Validation of Last Name
function validateLastName() {
var error = "";
var nonletters = /[^a-zA-Z]+/;
if (document.forms["registration"]["lastname"].value.length == 0) // condition is checked if field is left blank
{
registration.lastname.focus();
error = "Last name is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["lastname"].value.match(nonletters)) // condition is checked if field is alphabetical characters only
{
registration.lastname.focus();
registration.lastname.select();
error = "Alphabetical characters only for last name \n"; // error message is displayed if field is not alphabetical characters only
}
return error;
}
// Validation of User Name
function validateUserName() {
var error = "";
var nonalphanum = /[^0-9a-zA-Z]+/;
if (document.forms["registration"]["username"].value.length == 0) // condition is checked if field is left blank
{
registration.username.focus();
error = "User name is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["username"].value.match(nonalphanum)) // condition is checked if field is alpha-numeric characters only
{
registration.username.focus();
registration.username.select();
error = "Alpha-numeric characters only for user name \n"; // error message is displayed if field is not alpha-numeric characters only
}
return error;
}
// Validation of Password
function validatePassword() {
var error = "";
var nonalphanum = /[^0-9a-zA-Z]+/;
var numbers = /(?=(.*\d){2})/;
if (document.forms["registration"]["password"].value.length == 0) // condition is checked if field is left blank
{
registration.password.focus();
error = "Password is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["password"].value.length != 8) // condition is checked if password is not eight characters
{
registration.password.focus();
registration.password.select();
error = "Password of 8 characters is required \n"; // error message is displayed if password is not eight characters
} else if (document.forms["registration"]["password"].value.match(nonalphanum)) // condition is checked if field is alpha-numeric characters only
{
registration.password.focus();
registration.password.select();
error = "Alpha-numeric characters only for password \n"; // error message is displayed if field is not alpha-numeric characters only
} else if (!(document.forms["registration"]["password"].value.match(numbers))) // condition is checked if field has at least two numbers
{
registration.password.focus();
registration.password.select();
error = "Password must contain at least 2 numbers \n"; // error message is displayed if field does not have at least two numbers
}
return error;
}
// Validation of Date of Birth
function validateDoB() {
var error = "";
var dob = document.forms["registration"]["dob"].value;
var validdob = /\d{2}\/\d{2}\/\d{4}/;
if (dob.length == 0) // condition is checked if field is left blank
{
error = ""; // no error message is displayed if field is blank
} else if (!(dob.match(validdob))) // condition is checked if field is in correct format
{
registration.dob.focus();
registration.dob.select();
error = "Please enter date of birth in valid format \n"; // error message is displayed if field is in incorrect format
}
return error;
}
// Validation of Gender
function validateGender() {
var error = "";
if (document.forms["registration"]["gender"].value.unchecked) // condition is checked if field is left blank
{
error = ""; // no error message is displayed if field is blank
}
return error;
}
// Validation of Email Address and format validity
function validateEmail() {
var error = "";
var email = document.forms["registration"]["email"].value;
var emailformat = /\w+([\.-]?\w{1})*@\w{1}([\.-]?\w+)*(\.\w{1})+/
if (email.length == 0) // condition is checked if field is left blank
{
registration.email.focus();
error = "Email address is required \n"; // error message is displayed if field is blank
} else if (!(email.match(emailformat))) // condition is checked if field is in correct format
{
registration.email.focus();
registration.email.select();
error = "Please enter a valid email address \n"; // error message is displayed if invalid email address entered
}
return error;
}
// Validation of Address
function validateAddress() {
var error = "";
var nonalphanum = /[^0-9a-zA-Z]+/;
if (document.forms["registration"]["address"].value.length == 0) // condition is checked if field is left blank
{
registration.address.focus();
error = "An address is required \n"; // error message is displayed if field is blank
} else if (document.forms["registration"]["address"].value.match(nonalphanum)) // condition is checked if field is alpha-numeric characters only
{
registration.address.focus();
registration.address.select();
error = "Alpha-numeric characters only for address \n"; // error message is displayed if field is not alpha-numeric characters only
}
return error;
}
// Validation of Membership Type
function validateMembership() {
var error = "";
if (document.forms["registration"]["membership"].value == "default") // condition is checked if field is left as default
{
registration.membership.focus();
error = "Membership type must be selected \n"; // error message is displayed if field is not selected
}
return error;
}
// Validation of Membership Duration
function validateDuration() {
var error = "";
if (document.forms["registration"]["duration"].value == "default") // condition is checked if field is left as default
{
registration.duration.focus();
error = "Membership duration must be selected \n"; // error message is displayed if field is not selected
}
return error;
}
Upvotes: 2