フィールドにデータがなくても送信ボタンを押したときにページが更新されないようにするにはどうすればよいですか。
検証は正常に機能し、すべてのフィールドが赤くなりますがその後すぐにページが更新されます。私の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
/////////////////
});
あなたがフォームを送信しないようにすることができます
$("#prospects_form").submit(function(e) {
e.preventDefault();
});
もちろん、この関数では空のフィールドをチェックすることができます。正しくないものがある場合は、e.preventDefault()
は送信を停止します。
ボタンの種類をbutton
に置き換えます。
<button type="button">My Cool Button</button>
この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キーが押された場合にフォームを送信するために押されたキーを検出する機能が必要になります。
そして今、IE(いずれにせよバージョン11)に問題があります。注意:この問題はChromeにもFireFoxにも存在しません!
解決策は簡単に見えますが、この問題を解決するには何時間もかかりましたので、他の人々に役立つことを願っています。このソリューションは、とりわけIE(v 11.0.9600.18426)、FF(v 40.03)およびChrome(v 53.02785.143 m 64ビット)で正常にテストされています。
ソースコードHTML&jsはスニペットにあります。その原理はそこに記述されています。警告:
Postアクションは定義されておらず、Enterキーを押すとスタックオーバーフローを妨げる可能性があるため、スニペットでテストすることはできません。
この問題に直面した場合は、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>
純粋なJavascriptでは、次のように使用します。e.preventDefault()
e.preventDefault()
はjqueryで使用されますが、javascriptで機能します。
document.querySelector(".buttonclick").addEventListener("click",
function(e){
//some code
e.preventDefault();
})
ほとんどの人は event.preventDefault()
関数を呼び出してフォームが送信されないようにします。
もう1つの方法は、ボタンのonclick属性を削除し、return false;
によってフォームが送信されないため、processForm()
内のコードを.submit(function() {
に出力することです。また、formBlaSubmit()
で使用するために、processForm();
関数が妥当性に基づいてブール値を返すようにします。
katsh
の答えは同じで、要約するのは簡単です。
(ちなみに、私はstackoverflowを初めて知っています。どうぞ私に指導をお願いします。)
個人的には送信時にフォームを検証し、エラーがある場合はfalseを返すだけです。
$('form').submit(function() {
var error;
if ( !$('input').val() ) {
error = true
}
if (error) {
alert('there are errors')
return false
}
});
フォームを使用して送信するときにページの再読み込みを防ぐ1つの優れた方法は、onsubmit属性にreturn false
を追加することです。
<form action="#" onsubmit="yourJsFunction();return false">
<input type="text"/>
<input type="submit"/>
</form>
もしあなたがPure 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>
それはあなたのために働くように願っています!
$("#buttonID").click(function (e) {
e.preventDefault();
//some logic here
}
投稿と更新を禁止したいセクションから<form></form>
を削除することで、非常に単純でありながら実用的な解決策を見つけました。
<select id="youId" name="yourName">
<select>
<option value="1</option>
<option value="2</option>
<option value="3</option>
</select>
<input id="formStockVal1" type="number"><br><br>
<form>
<button type="reset" id="stockCancel">Cancel</button>
<button type="reset" id="stockConfirm">Add</button>
</form>
ここでは、ボタンだけが正しく送信されます。
Actionを使用していない場合は、formのaction属性に "javascript:"を使用してください。
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のように動作するように(this)をバインドすることもできます。
のようにそれを使う:
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のようなことができます。
これまでのところ完璧とは言えませんが、うまくいくはずですが、エラー処理を追加するか、無効状態を削除する必要があります。