web-dev-qa-db-ja.com

送信時にフォームの更新ページを停止する

フィールドにデータがなくても送信ボタンを押したときにページが更新されないようにするにはどうすればよいですか。

検証は正常に機能し、すべてのフィールドが赤くなりますがその後すぐにページが更新されます。私の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
    /////////////////
});
99
M_Willett

あなたがフォームを送信しないようにすることができます

$("#prospects_form").submit(function(e) {
    e.preventDefault();
});

もちろん、この関数では空のフィールドをチェックすることができます。正しくないものがある場合は、e.preventDefault()は送信を停止します。

128
Overcode

ボタンの種類をbuttonに置き換えます。

<button type="button">My Cool Button</button>
63
Vicky Gonsalves

このonsubmit = "return false"コードを追加してください。

<form name="formname" onsubmit="return false">

それは私のためにそれを修正しました。指定したonClick関数は実行されます。

55
user3413723

このコードをページの更新なしでフォームの送信に使用できます。私は自分のプロジェクトでこれを行いました。

$(function () {
    $('#myFormName').on('submit',function (e) {

              $.ajax({
                type: 'post',
                url: 'myPageName.php',
                data: $('#myFormName').serialize(),
                success: function () {
                 alert("Email has been sent!");
                }
              });
          e.preventDefault();
        });
});
12
safeer008

フォームを送信する2つの可能性をユーザーに与えると、この問題はより複雑になります。

  1. アドホックボタンをクリックして
  2. enterキーを押すことで

そのような場合は、Enterキーが押された場合にフォームを送信するために押されたキーを検出する機能が必要になります。

そして今、IE(いずれにせよバージョン11)に問題があります。注意:この問題はChromeにもFireFoxにも存在しません!

  • 送信ボタンをクリックすると、フォームが1回送信されます。大丈夫です。
  • Enterキーを押すとフォームが2回送信されます。サーブレットは2回実行されます。 PRG(post redirect get)アーキテクチャーサーバーを使用していない場合、結果は予期しないものになる可能性があります。

解決策は簡単に見えますが、この問題を解決するには何時間もかかりましたので、他の人々に役立つことを願っています。このソリューションは、とりわけ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>
7
Mathias Zaja

純粋なJavascriptでは、次のように使用します。e.preventDefault()

e.preventDefault()はjqueryで使用されますが、javascriptで機能します。

document.querySelector(".buttonclick").addEventListener("click", 
function(e){

  //some code

  e.preventDefault();
})
4
Deke

ほとんどの人は event.preventDefault() 関数を呼び出してフォームが送信されないようにします。

もう1つの方法は、ボタンのonclick属性を削除し、return false;によってフォームが送信されないため、processForm()内のコードを.submit(function() {に出力することです。また、formBlaSubmit()で使用するために、processForm();関数が妥当性に基づいてブール値を返すようにします。

katshの答えは同じで、要約するのは簡単です。

(ちなみに、私はstackoverflowを初めて知っています。どうぞ私に指導をお願いします。)

4
ambrosechua

個人的には送信時にフォームを検証し、エラーがある場合はfalseを返すだけです。

$('form').submit(function() {

    var error;

   if ( !$('input').val() ) {
        error = true
    }

    if (error) {
         alert('there are errors')
         return false
    }

});

http://jsfiddle.net/dfyXY/

3
sqram

フォームを使用して送信するときにページの再読み込みを防ぐ1つの優れた方法は、onsubmit属性にreturn falseを追加することです。

<form action="#" onsubmit="yourJsFunction();return false">
    <input type="text"/>
    <input type="submit"/>
</form>
2
user3828543

もしあなたが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>

それはあなたのために働くように願っています!

1
Mr. Suryaa Jha
 $("#buttonID").click(function (e) {
          e.preventDefault();
         //some logic here
 }
1
Alex

投稿と更新を禁止したいセクションから<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>

ここでは、ボタンだけが正しく送信されます。

0
John_FistaH

Actionを使用していない場合は、formのaction属性に "javascript:"を使用してください。

0
Kailash Kaswan
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のようなことができます。

これまでのところ完璧とは言えませんが、うまくいくはずですが、エラー処理を追加するか、無効状態を削除する必要があります。

0
Łukasz Szpak