Submit A Form Without Page Refresh using jQuery

Submit A Form Without Page Refresh using jQuery

Tutorial Details
  • Difficulty: Intermediate
  • Estimated Completion Time: 2 Hours

Previously on Nettuts+, Philo showed how you can use jQuery to add form validation to wordpress comments that works without any page reload. Another great way of utlizing jQuery to enhance user experience is to not just validate, but to submit your form entirely without a page refresh.

In this tutorial I’ll show you how easy it is to do just that — submit a contact form that sends an email, without page refresh using jQuery! (The actual email is sent with a php script that processes in the background). Let’s get started.


What We’re Building

In this example, we have a simple contact form with name, email, and phone number. The form submits all the fields to a php script without page refresh, using native jQuery functions (native meaning, you don’t need to download any extra plugins to make it work.

If you have found this article without any prior familiarity with jQuery, a great place to get started would be Jeffrey Way’s article on 15 Resources to get you Started with jQuery From Scratch.


Step 1 - Build the HTML Form

Let’s take a look at our html markup. We begin with our basic html form:

  <div id="contact_form">
  <form name="contact" action="">
    <fieldset>
      <label for="name" id="name_label">Name</label>
      <input type="text" name="name" id="name" size="30" value="" class="text-input" />
      <label class="error" for="name" id="name_error">This field is required.</label>
      
      <label for="email" id="email_label">Return Email</label>
      <input type="text" name="email" id="email" size="30" value="" class="text-input" />
      <label class="error" for="email" id="email_error">This field is required.</label>
      
      <label for="phone" id="phone_label">Return Phone</label>
      <input type="text" name="phone" id="phone" size="30" value="" class="text-input" />
      <label class="error" for="phone" id="phone_error">This field is required.</label>
      
    	<br />
      <input type="submit" name="submit" class="button" id="submit_btn" value="Send" />
    </fieldset>
  </form>
  </div>
  

You might notice that I have included a div with id contact_form that wraps around the entire form.
Be sure to not miss that div in your own form as we will be needing this wrapper div later on. You
might also notice that I have left both the action and the method parts of the form tag blank. We
actually don’t need either of these here, because jQuery takes care of it all later on.

Another important thing to be sure to include is the id values for each input field. The id values
are what your jQuery script will be looking for to process the form with.

I’ve added some css styles and a background image in Photoshop to produce the following form:


Step 2 - Begin Adding jQuery

The next step in the process is to add some jQuery code. I’m going to assume that you have downloaded jQuery, uploaded to your server, and are referencing it in your webpage.

Next, open up another new javascript file, reference it in your html as you would any normal javascript file,
and add the following:

  $(function() {
    $(".button").click(function() {
      // validate and process form here
    });
  });
  

What the first function() does is, it loads the events inside, as soon as the html document is ready. If you have done any work in jQuery previously, the function is the same as jQuery’s document.ready function. So we start with that, and inside we have our click function that executes on clicking the submit button with class name of “button”. Ultimately what we have accomplished with these lines of code is the same as if we were to add an onclick event to the submit button in the html. The reason we do it with jQuery is for clean separation of our presentation from our scripts.


Step 3 - Write Some Form Validation

  $(function() {
    $('.error').hide();
    $(".button").click(function() {
      // validate and process form here
      
      $('.error').hide();
  	  var name = $("input#name").val();
  		if (name == "") {
        $("label#name_error").show();
        $("input#name").focus();
        return false;
      }
  		var email = $("input#email").val();
  		if (email == "") {
        $("label#email_error").show();
        $("input#email").focus();
        return false;
      }
  		var phone = $("input#phone").val();
  		if (phone == "") {
        $("label#phone_error").show();
        $("input#phone").focus();
        return false;
      }
      
    });
  });
  

Inside our function that loads when the page is ready, we add some form validation. But the first thing you see that got added is $(‘.error’).hide();. What this does is hides our 3 labels with class name “error”. We want these labels to be hidden not just when
the page first loads, but also when you click submit, in case one of the messages was shown to the user previously. Each error message should only appear if validation doesn’t work out.

We validate by first checking if the name field was left blank by the user, and if it is, we then show the label with id of name_error. We then place the focus on the name input field, in case the user
is at all confused about what to do next! (I have learned to never assume too much when it comes to form users).

To explain in more detail how we are making this happen, we set a variable ‘name’ to the value of the input field with id “name” — all with one line of jQuery:

  var name = $("input#name").val();
  

We then check if that value is blank, and if it is, we use jQuery’s show() method to show the label with
id “name_error”:

  if (name == "") {
    $("label#name_error").show();
  }
  

Next, we place the form focus back on the input field with id of “name”, and finally return false:

  if (name == "") {
    $("label#name_error").show();
    $("input#name").focus();
    return false;
  }
  

Be sure to have return false in your code, otherwise the whole form gets submitted (which defeats
the purpose of this tutorial)! What return false does is it prevents the user from proceeding any further
without filling out the required field(s).


Step 4 - Process our Form Submission with jQuery’s AJAX Function

Now we get to the heart of the tutorial — submitting our form without page refresh, which sends the form values to a php a script in the background. Let’s take a look at all the code first, then I will break down into more detail next. Add the following code just below the validation snippet we added previously (and before the button click function is closed out):

  var dataString = 'name='+ name + '&email=' + email + '&phone=' + phone;
  //alert (dataString);return false;
  $.ajax({
    type: "POST",
    url: "bin/process.php",
    data: dataString,
    success: function() {
      $('#contact_form').html("<div id='message'></div>");
      $('#message').html("<h2>Contact Form Submitted!</h2>")
      .append("<p>We will be in touch soon.</p>")
      .hide()
      .fadeIn(1500, function() {
        $('#message').append("<img id='checkmark' src='images/check.png' />");
      });
    }
  });
  return false;
  

We have a lot going on here! Let’s break it all down – it’s so simple and so easy to use once you understand the process. We first create a string of values, which are all the form values that we want to pass along to the script that sends the email.

Recall previously, we had set a variable ‘name’ with the value of the input field with id “name”, like so:

  var name = $("input#name").val();
  

We can use that ‘name’ value again, as well as the ‘email’ and the ‘phone’ values, to create our dataString:

  var dataString = 'name='+ name + '&email=' + email + '&phone=' + phone;
  

I’ve commented out an alert that I sometimes use to be sure I am grabbing the right values, which you may find helpful in the process. If you uncomment that alert and test your form, assuming everything has gone right so far, you should get a message similar to the following:

Now we get to our main ajax function, the star of today’s show. This is where all the action happens, so pay
close attention!

  $.ajax({
    type: "POST",
    url: "bin/process.php",
    data: dataString,
    success: function() {
      //display message back to user here
    }
  });
  return false;
  

Basically what’s going on in the code is this: The .ajax() function processes the values from our string called dataString (data:dataString) with a php script called process.php (url:”bin/process.php”), using the ‘POST’ method (type:”POST”). If our script processed successfuly, we can then display a message back to the user, and finally return false so the page does not reload. That’s it! The entire process is handled right there in these few lines!

There are more advanced things you can do here, other than sending an email and giving a success message. For example you could send your values to a database, process them, then display the results back to the user. So if you posted a poll to users, you could process their vote, then return the voting results, all without any page refresh required.

Let’s summarize what happened in our example, to be sure we have covered everything. We grabbed our form values with jQuery, and then placed those into a string like this:

  var name = $("input#name").val();
  var email = $("input#email").val();
  var phone = $("input#phone").val();
  var dataString = 'name='+ name + '&email=' + email + '&phone=' + phone;
  

Then we used jQuery’s ajax function to process the values in the dataString. After that
process finishes successfully, we display a message back to the user and add return false so that our page does not refresh:

    $.ajax({
      type: "POST",
      url: "bin/process.php",
      data: dataString,
      success: function() {
        $('#contact_form').html("<div id='message'></div>");
        $('#message').html("<h2>Contact Form Submitted!</h2>")
        .append("<p>We will be in touch soon.</p>")
        .hide()
        .fadeIn(1500, function() {
          $('#message').append("<img id='checkmark' src='images/check.png' />");
        });
      }
    });
    return false;
  

The success part of the script has been filled in with some specific content that can be displayed back to the user. But as far as our ajax functionality goes, that’s all there is to it. For more options and settings be sure to check out jQuery’s documentation on the ajax function. The example here is one of the simpler implementations, but even so, it is very powerful as you can see.


Step 5 - Display a Message Back to the User

Let’s briefly look at the part of the code that displays our message back to the user, to finish out the tutorial.

First, we change the entire contents of the contact_form div (remember I said we would be needing that div) with the following line:

  $('#contact_form').html("<div id='message'></div>");
  

What that has done is replaced all the content inside the contact_form div, using jQuery’s html() function. So instead of a form, we now just have a new div inside, with id of ‘message’. Next, we fill that div with an actual message — an h2 saying “Contact Form Submitted”:

  $('#message').html("<h2>Contact Form Submitted!</h2>")
  

We next add even more content to the message div with jQuery’s append() function, and to top everything off we add a cool effect by hiding the message div with the jQuery hide() function, then fade it all in with the fadeIn() function:

  .append("<p>We will be in touch soon.</p>")
  .hide()
  .fadeIn(1500, function() {
    $('#message').append("<img id='checkmark' src='images/check.png' />");
  });
  

So the user ends up seeing the following after they submit the form:

By now, I think you will have to agree that it is incredibly easy to submit forms without page refresh using jQuery’s powerful ajax function. Just get the values in your javascript file, process them with the ajax function and return false, and you are good to go. You can process the values in your php script just like you would any other php file, the only difference being that the user does not have to wait for a page refresh – it all happens silently in the background.

So if you have a contact form on your website, a login form, or even more advanced forms that process values through a database and retrieve results back, you can do it all easily and efficiently, and perhaps most importantly, you enhance the end user experience with your website by providing interactivity without their having to wait for the page to reload.

Conclusion

I would like to add some final words about the demo example provided. In the demo, you may notice that there is in fact one plugin being used – the runonload.js file. I did state at the beginning of the tutorial that we would not be using any plugins, and then you find in the demo there is an extra runonload script, so some explanation may be necessary! For anyone interested in seeing a live working demo, you can view my website’s SEO consulting form.

The only use I made with runonload actually has nothing to do with processing the form. So you can accomplish the ajax functions completely without any extra plugins. I only used runonload to focus the name input field on page load. It has been my experience that calling runonload can sometimes be a better replacement for jQuery’s native document ready function, and I found that to be the case while putting together this tutorial. For some reason the focus() function would not work on page load using jQuery’s native document ready function — but it did work with runonload, and that is why you find it as part of the example. So if you know of a way to accomplish that without using runonload I would be happy to hear from you about that.

Note: Want to add some source code? Type <pre><code> before it and </code></pre> after it. Find out more
  • Alex

    Thanks for this tutorial. I finally got everything working, but I wish the success part of the .ajax function was a bit more explained.

    I had to copy your code precisely, and I’m not sure how to change it to make it work for myself. I’m a newb, though :)

    Thank you again!

  • Pingback: 40 Jquery Form Tutorials & Plugins | WEBGRAPHIC

  • crystal

    I’ve had some problems too.
    Mainly with the process.php

    The form appears to work and the message is displaying on the page after clicking submit.

    BUT no email is sent or received. I’ve changed the $to, etc as indicated in the readme.txt

    *note the PHPMailer link didn’t help me much either.

    $to = ‘my email addy is here’;
    $email = ‘my email addy is here’;
    $fromaddress = “my email addy is here”;
    $fromname = “CCI Online Contact”;

    require(“phpmailer.php”);

    $mail = new PHPMailer();

    $mail->From = “mail@yourdomain.com”;
    $mail->FromName = “Contact Form”;
    $mail->AddAddress(“email_address@example.com”,”Name 1″);
    $mail->AddAddress(“another_address@example.com”,”Name 2″);

    CK

    • http://francomusso.com Franco Musso

      I second that… any advice on how to correctly configure the process file in order to get the email to send would be much appreciated.
      Thanks for a great tutorial though, the transition and feedback without refreshing the page looks great :)

  • td

    Anyone get this to work? I’ve filled out the necessary fields in process.php according to the instructions and additionally I’ve read through this entire thread trying multiple options….nothing seems to work.

  • http://eshoesspot.info Amara Sons

    Really enjoyed this article.Really looking forward to read more. Wonderful.

  • Pingback: » Tutorials and plugins for dealing with web forms DESIGNLANDER

  • Jared Schwalbe

    I’m having a bit of trouble. The jquery function on success of the submission is working locally but not when I copy the files to the server… can anyone help me out?

  • Pingback: 10 Simple and Effective jQuery Contact | InspireMonkey - Neverending Web Curiosity!

  • Pingback: 55 jQuery Form Plugins To Download And Use | Ning Ma blog

  • Pingback: 35 Very Good jQuery Validation Techniques and Tutorials | 1step web design: Best for developer and designer

  • Pingback: 10 Useful jQuery Form Plugins To Enhance Forms | Techno Tab

  • Pingback: 17 Best Ajax Contact Form With PHP | Best Smashing

  • Pingback: polux7 – Submit A Form Without Page Refresh using jQuery | Nettuts+

  • Pingback: 17 Best Ajax Contact Form With PHP | Oktilyon Teknoliyon

  • Pingback: 20 jQuery plug-ins enhance form functionality - Open News

  • Pingback: 30 Best jQuery Form Plugins

  • Pingback: 20 个增强表单功能的 jQuery 插件 - 某只叮当的博客

  • http://www.nodejs.com Limpan

    This was the first cool script I used when I started with jQuery.
    Much has happened since.

    Thank you!

  • Pingback: 14 fabulous chrome extensions for developers and designers >> Web Developer Geeks

  • Pingback: 30 Best jQuery Form Plugins | Web Help 101

  • http://www.tachytelic.net Paulie

    This is one of the most helpful blog posts that I’ve read. Just put together quite a complicated form using your information.

    Thank you.

  • Pingback: 10 Simple and Effective jQuery Contact Form Styles | Design Web Development Joomla Magento Wordpress Prestashop blog posts

  • Pingback: 10 Simple and Effective jQuery Contact Form Styles | Design Web Development Joomla Magento Wordpress Prestashop blog posts

  • Pingback: Submitting Forms using JQuery and AJAX | NewSourceMedia Blog

  • http://gusiev.com/ Bogdan Gusiev

    Too many things to do for each form.
    I tried to unify a process of ajax forms in https://github.com/bogdan/ajaxsubmit.
    Check it out.

  • Pingback: HTML5 form with jQuerry doesn’t work on Chrome and Opera

  • Pingback: Fetching mysql data and display them [multiple row] on website using PHP, jQuery ajax

  • http://www.kqlambert.com keegan lambert

    Love the tutorial Everything works great for me, instead of php I am using classic asp.
    However one thing is bugging me, when using this, it is not adding the spaces put in the text fields

    for example in the name field if I put bill gates it returns billgates

    any Ideas

  • http://www.ufonepackages.com Ufone Packages

    It works! Great and decent form, that’s what i was searching for . Thankyou :)

  • Mike

    I got everything working, but I ran in to an issue with a select box. Its doesn’t validate them and says the form is submitted. Could you please show how this can be added to your existing code.

    Great tutorial. Very easy and simple to implement

  • http://jae.hk James

    Waste of time, does not work.

  • http://www.nextgendesign.ca Kyle Salonga

    Great tutorial thanks!!

  • suri

    THANX

  • Siim

    Hi!

    How to I can send email via localhost?
    What changes I need to do?

    I changed in php.ini file SMTP = smtp.neti.ee and port is 25 but what else???

    • richgar1982

      It’s not that simple. The smtp php.ini parameter only works if the server is running a smtp server like sendmail a postmaster, otherwhise server won’t send the mail. The easiest way for sending email in a php script, its using a php library like http://swiftmailer.org/ wich using a smtp session will send the mail, but first you will need an email server listening on stmp. This library works exactly like an email client program does.

  • Aditya

    Thanks bro. It helped me alot

  • http://www.helpfulbox.com/ handa ran

    but its not submmiting spsecial value such mathmithcal signs

  • tom

    Hi Guys. all the J-QUARY works fine. but the PHP. does not. in the read.txt file it says

    “”you need to change the $to, $email, $fromaddress, and $mail->From to get it to work.”"

    i have changed them to my e-mail address but it still don’t work.

    HOPE SOMEONE CAN HELP : (

  • Pingback: Tecnologías y Créditos

  • Pingback: JQuery Contact Form • PHP HelpPHP Help

  • Charlie

    Hi siim. To test mailing, I used “test mail server tool” and it worked flawlessly. I was then able to open the emails with thunderbird for quick viewing. I was running wamp.

    I think this tutorial is correct. I remember doing something like this last summer and I don’t know how I didn’t manage to stumble upon this page. Would have saved me three days of headaches.

  • http://www.creative4all.com Mohamad Ghneim

    This is great…Thank you.

  • Tony

    Folks,

    Those having issues with the process.php doc, I’ll try and break it down since it’s not entirely clear anywhere how you modify it to suit you:

    $body = ob_get_contents();

    $to = ‘IN HERE YOU PUT YOUR OWN EMAIL ADDRESS’;
    $email = ???? ***ANYTHING YOU PUT IN HERE WILL OVERRIDE THE $email VARIABLE FROM THE FORM SO I’M NOT SURE WHY IT’S BEEN ADDED HERE. DELETE THIS LINE COMPLETELY SINCE IT WILL TAKE THE VARIABLE FROM THE FORM ITSELF***
    $fromaddress = “you@example.com”; ***TOTALLY IRRELEVANT AS THIS VARIABLE IS NOT CALLED ANYWHERE – I’VE DELETED THIS LINE COMPLETELY***
    $fromname = “Online Contact”; **TOTALLY IRRELEVANT AS THIS VARIABLE IS NOT CALLED ANYWHERE – I’VE DELETED THIS LINE COMPLETELY***

    require(“phpmailer.php”);

    $mail = new PHPMailer();

    $mail->From = $email; ***THIS DRIVES THE SENDER ADDRESS SO SET IT TO $email***
    $mail->FromName = “Contactee”; ***THIS WILL DISPLAY AS THE SENDERS NAME, INSTEAD ON THEIR EMAIL ADDRESS (ie: $email). USE WHATEVER YOU WANT***
    $mail->AddAddress(“anyotheraddress@example.com”,”Admin”); ***ONLY USE THIS LINE IF YOU WANT TO SEND TO MORE THAN ONE ADDRESS. IT BASICALLY ADDS A SECOND ‘$to’ ADDRESS. YOU CAN COPY THIS LINE AS MANY TIMES AS YOU LIKE TO ADD MORE ADDRESSES. IF YOU ONLY HAVE ONE ADDRESS TO SEND TO, DELETE THIS LINE COMPLETELY***

    $mail->WordWrap = 50;
    $mail->IsHTML(true);

    $mail->Subject = “Contact form submitted from website”;
    $mail->Body = $body;
    $mail->AltBody = “This is the text-only body”;

    if(!$mail->Send()) {
    $recipient = ‘YOUR EMAIL ADDRESS IN HERE’;
    $subject = ‘Contact form failed’;
    $content = $body;
    mail($recipient, $subject, $content, “From: $name\r\nReply-To: $email\r\nX-Mailer: DT_formmail”);
    exit;
    }
    ?>

    NOTE HOW I’VE FORMATTED THIS LINE AS IT’S NOT THE SAME AS THE TUTORIAL:
    mail($recipient, $subject, $content, “From: $name\r\nReply-To: $email\r\nX-Mailer: DT_formmail”);

    So basically your file should look like this:

    $body = ob_get_contents();

    $to = ‘YOUR EMAIL’;

    require(“phpmailer.php”);

    $mail = new PHPMailer();

    $mail->From = $email;
    $mail->FromName = “Contactee”;
    $mail->AddAddress(“ANOTHER EMAIL ADDRESS OR DELETE LINE”,”Admin”);

    $mail->WordWrap = 50;
    $mail->IsHTML(true);

    $mail->Subject = “Contact form submitted from website”;
    $mail->Body = $body;
    $mail->AltBody = “This is the text-only body”;

    if(!$mail->Send()) {
    $recipient = ‘YOUR EMAIL’;
    $subject = ‘Contact form failed’;
    $content = $body;
    mail($recipient, $subject, $content, “From: $name\r\nReply-To: $email\r\nX-Mailer: DT_formmail”);
    exit;

    Hope that helps someone.

  • Eugene

    How to display Process.php results inside the div instead of preset HTML… I’ have a complex form with DB check inside process.php…
    I’m trying to create 2-3 step form… (Enter this data) >NEXT> (if everything ok, Enter this data)

  • Pingback: Collection de 55 Plugins de Formulaires Jquery a utiliser dans vos sites | Jopt | Just another WordPress site

  • Pingback: 30 Fresh AJAX Tutorials with jquery examples | codingquery.com

  • von

    The php part of this tutorial is not clear…please make it clearer to help newbies!thanks

  • http://gregpettit.ca Greg

    If you’re already using jQuery, could just serialize the form. If there are elements you don’t need, just discard them on the server side.

  • Pingback: 25+ AJAX Tutorials And Techniques with download for Web developer | Blog for designers web developers bloggers freelancers SEO

  • Pingback: only send specific objects to form with jquery | Easy jQuery | Free Popular Tips Tricks Plugins API Javascript and Themes

  • Pingback: only send specific objects to form with jquery | PHP Developer Resource