• 0

[Javascript] Form Validation


Question

Trying to add some validation stuff to a web form using javascript:

http://jsfiddle.net/rGxP6/


function verifyForm(){
var emailStatus = false;
var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
	 if (document.getElementById('email').value.search(emailRegEx) == -1) {
emailStatus = false
		  alert("False");
	 }
	 else {
		  emailStatus = true;
		  alert("True");
	 }
	 return emailStatus;
}

Keeping it simple to start with I thought I'd start by validating one thing, that being the email address. I found the regex for email address's online. I am on a bit of a learning curve at the moment and appreciate the help you guys have been giving me.

I loaded the chrome console up and noticed that it said verifyForm was not defined. I've tried to load the js above using onlick for the time being to verify the code works.

Here's the HTML:


<input id="email" type="text">
<input type="submit" onclick="verifyForm();" value="verify">

I imagine as usual it's something simple I've overlooked!

Many thanks,

Alex

Edit: Off out for a bit shall return in an hour or so.

Link to comment
https://www.neowin.net/forum/topic/1133556-javascript-form-validation/
Share on other sites

12 answers to this question

Recommended Posts

  • 0

I don't know... you could try putting the regex in quotes. I tried it both ways and it worked for me in Chrome. What does your whole page look like? I threw the JS into the <head><script> section... but yeah, it verified the email address and correctly popped up "true" or "false"...

  • 0

Your fiddle set up is incorrect. You have your framework setting set to "onload". If you right-click your "result" pane and select "view frame source" you can see that your verify function is defined inside the window.onload function. Which means it's not accessible outside of that context.

Try setting your fiddle to "head (no wrap)" which will put whatever is in your javascript frame directly into the head of your document.

  • 0

That's awesome - simple mistake on my part.

Been playing with validating the form today and so far I have this:


function verifyForm(){
var message = "";
message += verifyEmail1();
message += verifyExpiry();
    if (message == "") {
        alert("No errors found :)");
    } else {
    alert("The following errors have been found:\n\n"+message);
    }
}

function verifyEmail1(){
var intmessage = "";
var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
     if (document.getElementById('email').value.search(emailRegEx) == -1) {
 var intmessage = "You must enter a valid e-mail address\n";
     }
    return intmessage;
}

function verifyExpiry() {
var intmessage = "";
today = new Date();
var currentYear = parseInt(today.getFullYear().toString(10).substring(2, 4));
var currentMonth = today.getMonth() +1;
var expiryYear = document.getElementById('year').value;
var expiryMonth = document.getElementById('month').value;
    if (expiryYear &lt; currentYear) {
        var intmessage = "Credit Card has expired\n";
    }
    else
    {
        if (expiryMonth &lt; currentMonth) {
            var intmessage = "Credit Card has expired\n";
        }
    }
   return intmessage;
}

http://jsfiddle.net/rGxP6/20/

Done lot's of playing and so far so good!

  • 0

That's awesome - simple mistake on my part.

Been playing with validating the form today and so far I have this:


function verifyForm(){
var message = "";
message += verifyEmail1();
message += verifyExpiry();
	if (message == "") {
		alert("No errors found :)");
	} else {
	alert("The following errors have been found:\n\n"+message);
	}
}

function verifyEmail1(){
var intmessage = "";
var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
	 if (document.getElementById('email').value.search(emailRegEx) == -1) {
var intmessage = "You must enter a valid e-mail address\n";
	 }
	return intmessage;
}

function verifyExpiry() {
var intmessage = "";
today = new Date();
var currentYear = parseInt(today.getFullYear().toString(10).substring(2, 4));
var currentMonth = today.getMonth() +1;
var expiryYear = document.getElementById('year').value;
var expiryMonth = document.getElementById('month').value;
	if (expiryYear &lt; currentYear) {
		var intmessage = "Credit Card has expired\n";
	}
	else
	{
		if (expiryMonth &lt; currentMonth) {
			var intmessage = "Credit Card has expired\n";
		}
	}
   return intmessage;
}

http://jsfiddle.net/rGxP6/20/

Done lot's of playing and so far so good!

It's looking really good so far! One thing I'd like to point out that I'm not 100% sure on is in your emailRegEx variable... don't you have to escape all the '.' as '\.' or am I incorrect about that? I see you did it in part of it, but not all of it:


var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
[/CODE]

I believe it should be written as:

[CODE]
var emailRegEx = /^[A-Z0-9\._%+-]+@[A-Z0-9\.-]+\.[A-Z]{2,4}$/i;
[/CODE]

Please correct me if I'm wrong though.

  • 0

I'm not entirely sure, I found the regex string on stackoverflow and I've attempted to enter a few address's to test and it all seems to be ok?

Truth be told I'm not entirely sure how the regex expression works so I am certainly in no position to correct you! :p

  • 0

If I'm reading your regular expression correctly you're just doing a simple contains @ and . validation?


<input type="email" name="email" required placeholder="Enter a valid email address">
[/CODE]

By specifying the type as "email" and including "required", that'll do it's own validation on an HTML5 document. True it's not quite as robust as a regex but it's a lot less code. If you wanted to match something very specific like only accept emails from "hotmail" then it wouldn't be useful.

  • 0

Quick question and I may as well write it here.

Seeing as the script is going to be relatively long, I may wish to stick it into an external .js file and link it in the document. I already have one which limits input on specific fields to numeric only and that appears to only work if it's in the head of the document. I'll paste it here actually:


	   function isNumberKey(evt)
	   {
		  var charCode = (evt.which) ? evt.which : event.keyCode;
		  if (charCode &gt; 31
			&amp;&amp; (charCode &lt; 48 || charCode &gt; 57))
			 return false;

		  return true;
	   }	  

This seems to be fine sitting in an external file in the head of the document.

onkeypress="return isNumberKey(event)"

is then added to any of the input fields to prevent non-numerical data being entered.

I have another bit of javascript designed to combine the data from two fields into one. However this doesn't work if I stick it in my external .js file linked in the head. For some reason it seems to need to sit in the body to work.


function join_expiry()
{
var mm = document.getElementById('month').value;
var yy = document.getElementById('year').value;
document.getElementById('expiry').value = mm+yy;
}

Below is the code added to the relevant fields.

oninput="join_expiry();"

If anyone could explain these occurances to me it'd very much help my learning!

Many thanks!

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I do not use the AdGuard extension. I have uninstalled both the uBlock and Stylus extensions, as well as the Tampermonkey extension, since I began using AdGuard for Windows 7 months ago. It does not use any extension APIs, it modifies traffic system wide using a local proxy. AdGuard performs all the functions of uBlock, as well as additional features such as HTTPS filtering, cosmetic (user scripts and user styles), as well as DNS. It works with any browser and application. I don't understand why you consider the desktop program to be useless...
    • Should Google be forced to stop promoting Chrome over other browsers? Google pushes Chrome to anyone visiting its website using browsers other than Chrome.
    • Save 31% on Samsung T7 Portable SSD by Taras Buria During the ongoing memory crisis, where RAM and storage get extremely expensive, it is hard to find a good deal on an internal or portable SSD. While we are far away from 2024 prices, Samsung is currently offering a big discount on its 1TB T7 Portable SSD, saving you 31% or $85. The discount applies to the 1TB variant, which, although not record-breaking, is still plenty for all sorts of data. The drive uses a USB-C port for universal compatibility and high-speed data transfer of up to 1,050 megabytes per second. Samsung claims this drive is nearly ten times faster than a conventional hard drive, plus you get all the benefits of solid-state memory, such as better drop and shock resistance. There is also the ability to password-protect the drive, and you get extra peace of mind with a limited three-year warranty. The Samsung T7 Portable SSD works with all modern computers and tablets, including iPhones, iPads, Android smartphones, and more. And thanks to the two bundled USB cables (Type-C and Type-A), you can use the T7 even with devices that lack USB Type-C ports. The T7 Portable is available in three colors and four storage configurations, but unfortunately, only the 1TB Titan Gray is discounted: 1TB Samsung T7 Portable SSD - $189.98 | 31% off on Amazon This Amazon deal is US-specific and not available in other regions unless specified. This is a first-party seller link (at the time of article publishing); ensure that you also purchase from a first-party seller link only. If you don't like it or want to look at more options, check out the previous deals that we have covered, OR you can also visit Amazon US deals page. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. As an Amazon Associate, we earn from qualifying purchases.
    • Plenty of nations have risen from the ashes of war and today they have high standards of living. Maybe the problem is that your government is run by corrupt and power hungry terrorist organizations that keep the country in the **** because all they care about is filling up their pockets and maintaining their power instead of actually managing the country for the benefit of everyone. Just ask Russians, North Koreans, Iranians, Cubans, Venezuelans and Nicaraguans, etc.
    • My macbook pro is an intel from 2019... I am good with MacOS 26 for at least three years and then will swap the OS for Linux or Windows on it.
  • Recent Achievements

    • Week One Done
      rubentuben8 earned a badge
      Week One Done
    • Week One Done
      ARaclen earned a badge
      Week One Done
    • One Year In
      jojodbn earned a badge
      One Year In
    • One Month Later
      jojodbn earned a badge
      One Month Later
    • Week One Done
      jojodbn earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      525
    2. 2
      PsYcHoKiLLa
      232
    3. 3
      +Edouard
      132
    4. 4
      ATLien_0
      88
    5. 5
      Steven P.
      83
  • Tell a friend

    Love Neowin? Tell a friend!