Prevent form redirect OR refresh on submit?

JavascriptJqueryHtmlForms

Javascript Problem Overview


I've searched through a bunch of pages, but can't find my problem, so I had to make a post.

I have a form that has a submit button, and when submitted I want it to NOT refresh OR redirect. I just want jQuery to perform a function.

Here's the form:

<form id="contactForm">
	<fieldset>
		<label for="Name">Name</label>
		<input id="contactName" type="text" />
	</fieldset>
		
	<fieldset>
		<label for="Email">Email</label>
		<input id="contactEmail" type="text" />
	</fieldset>
		
	<fieldset class="noHeight">
		<textarea id="contactMessage" cols="20"></textarea>
		<input id="contactSend" class="submit" type="submit" onclick="sendContactForm()" />
	</fieldset>
</form>        
<small id="messageSent">Your message has been sent.</small>

And here is the jQuery:

function sendContactForm(){
    $("#messageSent").slideDown("slow");
    setTimeout('$("#messageSent").slideUp();$("#contactForm").slideUp("slow")', 2000);
}

I've tried with and without an action element on the form, but don't know what I'm doing wrong. What has annoyed me more is that I have an example that does it perfectly: [Example Page][1]

If you want to see my problem live, goto [stormink.net][2] (my site) and check out the sidebar where it says "Send me and email" and "RSS Subscription". Both are forms that I'm trying to get this to work on.

[1]: http://designshack.co.uk/articles/javascript/creating-a-slide-in-jquery-contact-form/comment-page-2#comment-1213 "Example page" [2]: http://stormink.net

Javascript Solutions


Solution 1 - Javascript

Just handle the form submission on the submit event, and return false:

$('#contactForm').submit(function () {
 sendContactForm();
 return false;
});

You don't need any more the onclick event on the submit button:

<input class="submit" type="submit" value="Send" />

Solution 2 - Javascript

Here:

function submitClick(e)
{
     e.preventDefault();
     $("#messageSent").slideDown("slow");
     setTimeout('$("#messageSent").slideUp();
     $("#contactForm").slideUp("slow")', 2000);
}

$(document).ready(function() {
    $('#contactSend').click(submitClick);
});

Instead of using the onClick event, you'll use bind an 'click' event handler using jQuery to the submit button (or whatever button), which will take submitClick as a callback. We pass the event to the callback to call preventDefault, which is what will prevent the click from submitting the form.

Solution 3 - Javascript

In the opening tag of your form, set an action attribute like so:

<form id="contactForm" action="#">

Solution 4 - Javascript

It looks like you're missing a return false.

Solution 5 - Javascript

If you want to see the default browser errors being displayed, for example, those triggered by HTML attributes (showing up before any client-code JS treatment):

<input name="o" required="required" aria-required="true" type="text">

You should use the submit event instead of the click event. In this case a popup will be automatically displayed requesting "Please fill out this field". Even with preventDefault:

$('form').on('submit', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will show up a "Please fill out this field" pop-up before my_form_treatment

As someone mentioned previously, return false would stop propagation (i.e. if there are more handlers attached to the form submission, they would not be executed), but, in this case, the action triggered by the browser will always execute first. Even with a return false at the end.

So if you want to get rid of these default pop-ups, use the click event on the submit button:

$('form input[type=submit]').on('click', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will NOT show any popups related to HTML attributes

Solution 6 - Javascript

An alternative solution would be to not use form tag and handle click event on submit button through jquery. This way there wont be any page refresh but at the same time there is a downside that "enter" button for submission wont work and also on mobiles you wont get a go button( a style in some mobiles). So stick to use of form tag and use the accepted answer.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIan Storm TaylorView Question on Stackoverflow
Solution 1 - JavascriptChristian C. SalvadóView Answer on Stackoverflow
Solution 2 - Javascriptkarim79View Answer on Stackoverflow
Solution 3 - JavascriptBrian LoughnaneView Answer on Stackoverflow
Solution 4 - JavascriptJesse KochisView Answer on Stackoverflow
Solution 5 - JavascriptCPHPythonView Answer on Stackoverflow
Solution 6 - JavascriptShishir AroraView Answer on Stackoverflow