Остановить обновление страницы формы при отправке
как я могу предотвратить обновление страницы при нажатии кнопки "Отправить" без каких-либо данных в полях?
проверка настройки работает нормально, все поля становятся красными, но затем страница немедленно обновляется. Мои знания о JS относительно просты.
в частности, я думаю processForm()
функция в нижней части "плохо".
HTML
<form id="prospects_form" method="post">
<input id="form_name" tabindex="1" class="boxsize" type="text" name="name" placeholder="Full name*" maxlength="80" value="" />
<input id="form_email" tabindex="2" class="boxsize" type="text" name="email" placeholder="Email*" maxlength="100" value="" />
<input id="form_subject" class="boxsize" type="text" name="subject" placeholder="Subject*" maxlength="50" value="FORM: Row for OUBC" />
<textarea id="form_message" class="boxsize" name="message" placeholder="Message*" tabindex="3" rows="6" cols="5" maxlength="500"></textarea>
<button id="form_send" tabindex="5" class="btn" type="submit" onclick="return processForm()">Send</button>
<div id="form_validation">
<span class="form_captcha_code"></span>
<input id="form_captcha" class="boxsize" type="text" name="form_captcha" placeholder="Enter code" tabindex="4" value="" />
</div>
<div class="clearfix"></div>
</form>
JS
$(document).ready(function() {
// Add active class to inputs
$("#prospects_form .boxsize").focus(function() { $(this).addClass("hasText"); });
$("#form_validation .boxsize").focus(function() { $(this).parent().addClass("hasText"); });
// Remove active class from inputs (if empty)
$("#prospects_form .boxsize").blur(function() { if ( this.value === "") { $(this).removeClass("hasText"); } });
$("#form_validation .boxsize").blur(function() { if ( this.value === "") { $(this).parent().removeClass("hasText"); } });
///////////////////
// START VALIDATION
$("#prospects_form").ready(function() {
// DEFINE GLOBAL VARIABLES
var valName = $('#form_name'),
valEmail = $("#form_email"),
valEmailFormat = /^(([^<>()[].,;:s@"]+(.[^<>()[].,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/,
valMsg = $('#form_message'),
valCaptcha = $('#form_captcha'),
valCaptchaCode = $('.form_captcha_code');
// Generate captcha
function randomgen() {
var rannumber = "";
// Iterate through 1 to 9, 4 times
for(ranNum=1; ranNum<=4; ranNum++){ rannumber+=Math.floor(Math.random()*10).toString(); }
// Apply captcha to element
valCaptchaCode.html(rannumber);
}
randomgen();
// CAPTCHA VALIDATION
valCaptcha.blur(function() {
function formCaptcha() {
if ( valCaptcha.val() == valCaptchaCode.html() ) {
// Incorrect
valCaptcha.parent().addClass("invalid");
return false;
} else {
// Correct
valCaptcha.parent().removeClass("invalid");
return true;
}
}
formCaptcha();
});
// Remove invalid class from captcha if typing
valCaptcha.keypress(function() {
valCaptcha.parent().removeClass("invalid");
});
// EMAIL VALIDATION (BLUR)
valEmail.blur(function() {
function formEmail() {
if (!valEmailFormat.test(valEmail.val()) && valEmail.val() !== "" ) {
// Incorrect
valEmail.addClass("invalid");
} else {
// Correct
valEmail.removeClass("invalid");
}
}
formEmail();
});
// Remove invalid class from email if typing
valEmail.keypress(function() {
valEmail.removeClass("invalid");
});
// VALIDATION ON SUBMIT
$('#prospects_form').submit(function() {
console.log('user hit send button');
// EMAIL VALIDATION (SUBMIT)
function formEmailSubmit() {
if (!valEmailFormat.test(valEmail.val())) {
// Incorrect
valEmail.addClass("invalid");
} else {
// Correct
valEmail.removeClass("invalid");
}
}
formEmailSubmit();
// Validate captcha
function formCaptchaSubmit() {
if( valCaptcha.val() === valCaptchaCode.html() ) {
// Captcha is correct
} else {
// Captcha is incorrect
valCaptcha.parent().addClass("invalid");
randomgen();
}
}
formCaptchaSubmit();
// If NAME field is empty
function formNameSubmit() {
if ( valName.val() === "" ) {
// Name is empty
valName.addClass("invalid");
} else {
valName.removeClass("invalid");
}
}
formNameSubmit();
// If MESSAGE field is empty
function formMessageSubmit() {
if ( valMsg.val() === "" ) {
// Name is empty
valMsg.addClass("invalid");
} else {
valMsg.removeClass("invalid");
}
}
formMessageSubmit();
// Submit form (if all good)
function processForm() {
if ( formEmailSubmit() && formCaptchaSubmit() && formNameSubmit() && formMessageSubmit() ) {
$("#prospects_form").attr("action", "/clients/oubc/row-for-oubc-send.php");
$("#form_send").attr("type", "submit");
return true;
} else if( !formEmailSubmit() ) {
valEmail.addClass("invalid");
return false;
} else if ( !formCaptchaSubmit() ) {
valCaptcha.parent().addClass("invalid");
return false;
} else if ( !formNameSubmit() ) {
valName.addClass("invalid");
return false;
} else if ( !formMessageSubmit() ) {
valMsg.addClass("invalid");
return false;
} else {
return false;
}
}
});
});
// END VALIDATION
/////////////////
});
13 ответов:
вы можете запретить отправку формы с помощью
$("#prospects_form").submit(function(e) { e.preventDefault(); });
конечно, в функции вы можете проверить наличие пустых полей, и если что-то не выглядит правильно,
e.preventDefault()
остановит представить.
добавить этот onsubmit=" return false " код:
<form name="formname" onsubmit="return false">
что установил его для меня. Он все равно будет запускать функцию onClick, которую вы укажете
вы можете использовать этот код для отправки формы без обновления страницы. Я сделал это в своем проекте.
$(function () { $('#myFormName').on('submit',function (e) { $.ajax({ type: 'post', url: 'myPageName.php', data: $('#myFormName').serialize(), success: function () { alert("Email has been sent!"); } }); e.preventDefault(); }); });
эта проблема становится более сложной, когда вы даете пользователю 2 возможности представить форме:
- нажав на специальную кнопку
- нажав клавишу Enter
в таком случае вам понадобится функция, которая определяет нажатую клавишу, в которой вы будете отправлять форму, если клавиша Enter была нажата.
и теперь возникает проблема с IE (в любом случае версия 11) Замечание: Эта проблема не существует ни с Chrome, ни с FireFox !
- при нажатии кнопки Отправить форма отправляется один раз; отлично.
- при нажатии Enter форма отправляется дважды ... и ваш сервлет будет выполнен дважды. Если у вас нет сервера архитектуры PRG (post redirect get), результат может быть неожиданным.
несмотря на то, что решение выглядит тривиальным, мне требуется много часов, чтобы решить эту проблему, поэтому я надеюсь, что это может быть полезно для других людей. Это решение было успешно тестирование, в частности, на т. е. (в 11.0.9600.18426), ФФ (в 40.03) и Chrome (в 53.02785.143 м 64-разрядная версия)
исходный код HTML и js находятся в сниппете. Там описан принцип. Внимание:
вы не можете проверить его в фрагменте, потому что действие post не является определено и нажатие клавиши Enter может помешать stackoverflow.
Если вы столкнулись с этой проблемой, то просто скопируйте / вставьте JS-код в свою среду и адаптируйте его к своему контекст.
/* * inForm points to the form */ var inForm = document.getElementById('idGetUserFrm'); /* * IE submits the form twice * To avoid this the boolean isSumbitted is: * 1) initialized to false when the form is displayed 4 the first time * Remark: it is not the same event as "body load" */ var isSumbitted = false; function checkEnter(e) { if (e && e.keyCode == 13) { inForm.submit(); /* * 2) set to true after the form submission was invoked */ isSumbitted = true; } } function onSubmit () { if (isSumbitted) { /* * 3) reset to false after the form submission executed */ isSumbitted = false; return false; } }
<!DOCTYPE html> <html> <body> <form id="idGetUserFrm" method="post" action="servletOrSomePhp" onsubmit="return onSubmit()"> First name:<br> <input type="text" name="firstname" value="Mickey"> <input type="submit" value="Submit"> </form> </body> </html>
большинство людей будет препятствовать отправке формы, вызвав
event.preventDefault()
лично мне нравится проверять форму на отправку, и если есть ошибки, просто верните false.
$('form').submit(function() { var error; if ( !$('input').val() ) { error = true } if (error) { alert('there are errors') return false } });
в чистом Javascript, используйте:
e.preventDefault()
e.preventDefault()
используется в jquery, но работает в javascript.document.querySelector(".buttonclick").addEventListener("click", function(e){ //some code e.preventDefault(); })
Если вы хотите использовать чистый Javascript, то следующий фрагмент будет лучше, чем что-либо еще.
предположим:
HTML:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Form Without Submiting With Pure JS</title> <script type="text/javascript"> window.onload = function(){ /** * Just Make sure to return false so that your request will not go the server script */ document.getElementById('simple_form').onsubmit = function(){ // After doing your logic that you want to do return false } } </script> </head> <body> </body> </html> <form id="simple_form" method="post"> <!-- Your Inputs will go here --> <input type="submit" value="Submit Me!!" /> </form>
надеюсь, что это работает для вас!!
function ajax_form(selector, obj) { var form = document.querySelectorAll(selector); if(obj) { var before = obj.before ? obj.before : function(){return true;}; var $success = obj.success ? obj.success: function(){return true;}; for (var i = 0; i < form.length; i++) { var url = form[i].hasAttribute('action') ? form[i].getAttribute('action') : window.location; var $form = form[i]; form[i].submit = function() { var xhttp = new XMLHttpRequest(); xhttp.open("POST", url, true); var FD = new FormData($form); /** prevent submiting twice */ if($form.disable === true) return this; $form.disable = true; if(before() === false) return; xhttp.addEventListener('load', function() { $form.disable = false; return $success(JSON.parse(this.response)); }); xhttp.send(FD); } } } return form; }
не проверял, как это работает. Вы также можете связать (это), так что он будет работать как jQuery ajaxForm
использовать его как:
ajax_form('form', { before: function() { alert('submiting form'); // if return false form shouldn't be submitted }, success:function(data) { console.log(data) } } )[0].submit();
он возвращает узлы, так что вы можете сделать что-то вроде submit i выше примера
так далеко от совершенства, но он должен работать, вы должны добавить обработку ошибок или удалить отключить условие
для чистого JavaScript используйте метод click вместо
<div id="loginForm"> <ul class="sign-in-form"> <li><input type="text" name="username"/></li> <li><input type="password" name="password"/></li> <li> <input type="submit" onclick="loginForm()" value="click" /> </li> </ul> </div> <script> function loginForm() { document.getElementById("loginForm").click(); } </script>
просто поставьте return вот так:
function validate() { var username=document.getElementById('username').value; if(username=="") { return false; } if(username.length<5&&username.length<15) { alert("Length should between 5 to 15 characters"); return false; } return true; }
body{ padding: 0px; margin:0px; } input{ display: block; margin-bottom:10px; height:25px; width:200px; } input[type="submit"]{ margin:auto; } label{ display:block; margin-bottom:10px; } form{ width:500px; height:500px; border:1px solid green; padding:10px; margin:auto; top:0; bottom:0; left:0; right:0; position:absolute; } .labels{ width: 35%; box-sizing:border-box; display: inline-block; } .inputs{ width: 63%; box-sizing:border-box; padding:10px; display: inline-block; }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>FORM VALIDATION</title> <link rel="stylesheet" type="text/css" href="style.css"> <script type="text/javascript" src="script.js"></script> </head> <body> <form action="#"> <div class="labels"> <label>Name</label> <label>Email</label> </div> <div class="inputs"> <input type="text" name="username" id="username" required> <input type="text" name="email" id="email" required> </div> <input type="submit" value="submit" onclick="return validate();"> </form> </body> </html>
возвращает true и false из validate (); функция согласно требованию