I have an html contact form which is built into index.html, and then I have a mail.php file that sends a mail and also uses some Javascript. When I fill in form and submit, I have coded it to send the mail and then it pops up with a success message box and then redirects back to index.html.
What I would like is for the form to be replaced with the success message, to avoid a page refresh and also to avoid the popup message box.
form from index.html:
<form action="mail.php" method="POST">
<div class="row uniform">
<div class="6u 12u$(xsmall)">
<input type="text" name="name" id="name" value="" placeholder="Name" />
</div>
<div class="6u$ 12u$(xsmall)">
<input type="email" name="email" id="email" value="" placeholder="Email" />
</div>
<div class="12u$">
<!--<div class="select-wrapper">
</div>-->
</div>
<div class="12u$">
<textarea name="message" id="message" placeholder="Enter your message" rows="6"></textarea>
</div>
<center><div class="g-recaptcha" data-sitekey=""></div></center>
<div class="12u$">
<ul class="actions">
<li><input type="submit" value="Send Message" class="special" /></li>
<li><input type="reset" value="Reset" /></li>
</ul>
</div>
</div>
</form>
php file, email address and recaptcha token removed for obvious reasons:
<?php $name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$formcontent = "From: $name \n email: $email \n Message: $message";
$recipient = 'email address here';
$subject = 'Message from Website';
$mailheader = "From: $email \r\n";
$captcha;
{
if(isset($_POST['g-recaptcha-response']))
{
$captcha=$_POST['g-recaptcha-response'];
}
if(!$captcha)
{
echo '<script language="javascript">';
echo 'alert("Please check the Captcha")';
echo '</script>';
exit;
}
$response=file_get_contents("=&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
if($response.success==false)
{
echo '<h2>Please do not try and spam here.</h2>';
}else
{
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
echo '<script language="javascript">';
echo 'alert("Your Message successfully sent, we will get back to you ASAP.");';
echo 'window.location.href="index.html";';
echo '</script>';
}
} ?>
This is a topic that I have actually looked at:
Clear form after submit and success message
I have an html contact form which is built into index.html, and then I have a mail.php file that sends a mail and also uses some Javascript. When I fill in form and submit, I have coded it to send the mail and then it pops up with a success message box and then redirects back to index.html.
What I would like is for the form to be replaced with the success message, to avoid a page refresh and also to avoid the popup message box.
form from index.html:
<form action="mail.php" method="POST">
<div class="row uniform">
<div class="6u 12u$(xsmall)">
<input type="text" name="name" id="name" value="" placeholder="Name" />
</div>
<div class="6u$ 12u$(xsmall)">
<input type="email" name="email" id="email" value="" placeholder="Email" />
</div>
<div class="12u$">
<!--<div class="select-wrapper">
</div>-->
</div>
<div class="12u$">
<textarea name="message" id="message" placeholder="Enter your message" rows="6"></textarea>
</div>
<center><div class="g-recaptcha" data-sitekey=""></div></center>
<div class="12u$">
<ul class="actions">
<li><input type="submit" value="Send Message" class="special" /></li>
<li><input type="reset" value="Reset" /></li>
</ul>
</div>
</div>
</form>
php file, email address and recaptcha token removed for obvious reasons:
<?php $name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$formcontent = "From: $name \n email: $email \n Message: $message";
$recipient = 'email address here';
$subject = 'Message from Website';
$mailheader = "From: $email \r\n";
$captcha;
{
if(isset($_POST['g-recaptcha-response']))
{
$captcha=$_POST['g-recaptcha-response'];
}
if(!$captcha)
{
echo '<script language="javascript">';
echo 'alert("Please check the Captcha")';
echo '</script>';
exit;
}
$response=file_get_contents("https://www.google./recaptcha/api/siteverify?secret=&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
if($response.success==false)
{
echo '<h2>Please do not try and spam here.</h2>';
}else
{
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
echo '<script language="javascript">';
echo 'alert("Your Message successfully sent, we will get back to you ASAP.");';
echo 'window.location.href="index.html";';
echo '</script>';
}
} ?>
This is a topic that I have actually looked at:
Clear form after submit and success message
Share Improve this question edited May 23, 2017 at 12:06 CommunityBot 11 silver badge asked Oct 13, 2015 at 7:56 TroyTroy 831 gold badge2 silver badges8 bronze badges3 Answers
Reset to default 4Best way to do all your stuff is to use ajax. Include jquery in your html.
Put your form inside a wrapper div
<div class="something">
<!-- your form here -->
</div>
Submit your form through ajax, instead of using basic form submission
//"idform" is the id of the form
$("#idForm").submit(function() {
var url = "path/to/your/script.php"; // the script where you handle the form input.
$.ajax({
type: "POST",
url: url,
// serialize your form's elements.
data: $("#idForm").serialize(),
success: function(data)
{
// "something" is the class of your form wrapper
$('.something').html(data);
}
});
// avoid to execute the actual submit of the form.
return false;
});
And last thing you need to change is in your php code
keep only one echo for success
echo "Your Message successfully sent, we will get back to you ASAP.";
First of all you should use AJAX call to submit the form. If you insist on using pure JS the script would look like this (written in 5 seconds - probably needs some adjusting):
<script>
document.forms['yourForm'].onsubmit = function(form) { // you have to add 'name' attribute to the form and replace 'yourForm' with it
var data = ... //here you have to get all the values from form elements and store them in data object. to make less changes to the script use the elements' names as object names
if (window.XMLHttpRequest)
{
var xhReq = new XMLHttpRequest();
}
else
{
var xhReq = new ActiveXObject("Microsoft.XMLHTTP");
}
var method= 'POST')
var async = false; //you can actually set true here, it doesn't matter much in this case
var url = 'mail.php';
xhReq.open(method, url, async);
xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhReq.send(data);
document.getElementById("form's parent's ID goes here").innerHTML = "new content"
return false;
}
</script>
Than you have to remove all echos from php file as it wouldn't be shown anyway. You can also add some more sophistication to this script e.g. check if the mail function worked correctly (by returning something in php file and checking the AJAX response in JS) or to catch the captcha errors. It would also be extremely easier to achieve in jQuery if you're willing to go down that road.
You can acplish this using jQuery and Ajax form submit.
First, include jquery in your head element
<head>
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.3/jquery.min.js"></script>
</head>
Next, give your form an id
<form id='mail_form' action="mail.php" method="POST">
Add a span somewhere with the id='error'
<span id='error' style='color:red; font-weight:bold;'></span>
Adjust the mail.php to the following:
<?php
$success = true;
$errors = array();
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$formcontent = "From: $name \n email: $email \n Message: $message";
$recipient = 'email address here';
$subject = 'Message from Website';
$mailheader = "From: $email \r\n";
$captcha = false;
if(isset($_POST['g-recaptcha-response']))
{
$captcha=$_POST['g-recaptcha-response'];
}
if(!$captcha)
{
$success = false;
array_push($errors, "Please check the captcha");
}
$response=file_get_contents("https://www.google./recaptcha/api/siteverify?secret=&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
if($response.success==false)
{
$success = false;
array_push($errors, "Please do not try and spam here.");
}
if ($success)
{
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
}
$output_array = array("success" => $success, "errors" => $errors);
echo json_encode($output_array);
?>
Then, at the bottom of your page add
<script>
$('#mail_form').on('submit', function(){
var dataIn = $(this).serialize(); //serialize turns the form data into a string that can be passed to mail.php. Try doing alert(dataIn); to see what it holds.
$.post( "./mail.php", dataIn )
.done(function( dataOut )
{
//dataOut holds the response from mail.php. The response would be any html mail.php outputs. I typically echo out json encoded arrays as responses that you can parse here in the jQuery.
var myArray = JSON.parse(dataOut );
if (myArray['success'] == true) //Check if it was successfull.
{
$("#mail_form").html("Congrats! We just e-mailed you!");
}
else //there were errors
{
$('#error').html(""); //Clear error span
$.each(myArray['errors'], function(i){
$('#error').append(myArray['errors'][i] + "<br>");
}
});
return false; //Make sure you do this or it will submit the form and redirect
});
</script>