在提交时停止表单刷新页面

M_W*_*ett 119 html javascript forms jquery

如果在没有字段中的任何数据的情况下按下发送按钮,我将如何防止页面刷新?

验证设置正常,所有字段都变为红色,然后页面立即刷新.我对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>
Run Code Online (Sandbox Code Playgroud)

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
    /////////////////
});
Run Code Online (Sandbox Code Playgroud)

Ove*_*ode 142

您可以阻止表单提交

$("#prospects_form").submit(function(e) {
    e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

当然,在函数中,您可以检查空字段,如果看起来不正确,e.preventDefault()将停止提交.

  • 这个方法可以在没有jQuery的情况下完成,例如:`var form = document.getElementById("myForm"); function handleForm(event){event.preventDefault(); } form.addEventListener('submit',handleForm);`我似乎不知道如何正确地格式化评论. (20认同)
  • 这个方法需要jQuery.我认为使用按钮类型属性来防止它总是更好的做法. (4认同)
  • 基本上,在表单提交处理代码中包含`event.preventDefault();`。我在其他评论中的单行变体(与 jQuery 版本基本相同)是:`document.getElementById("prospects_form").addEventListener('submit', function(event){event.preventDefault( );});` 可能有一种方法可以缩短它(通过不使用 `addEventListener()`,但似乎这些处理方式通常不受欢迎。 (2认同)

Vic*_*ves 70

将按钮类型替换为button:

<button type="button">My Cool Button</button>
Run Code Online (Sandbox Code Playgroud)

  • 这很有用,但在用户按[Enter]时不会阻止提交/重新加载. (9认同)
  • 不适合表单验证:/您需要表单元素中的提交按钮 (7认同)
  • 这是建议的唯一方法,即使存在可能对测试和开发有用的Javascript错误,该方法也可以防止刷新页面。 (2认同)

use*_*723 64

添加这个onsubmit ="return false"代码:

<form name="formname" onsubmit="return false">
Run Code Online (Sandbox Code Playgroud)

这为我解决了这个问题.它仍将运行您指定的onClick函数

  • 但它永远不会让表单提交。 (15认同)
  • 这是没有JQuery的最干净的解决方案。另外,您还可以将其用作;onsubmit =“ return SubmitFoo()”,如果需要在Submit上调用函数,则在submitFoo()中返回false。 (4认同)
  • 它仍将运行HTML5浏览器的表单验证. (3认同)

小智 28

使用表单提交时防止重新加载页面的一种好方法是添加return falseonsubmit 属性。

<form action="#" onsubmit="yourJsFunction();return false">
    <input type="text"/>
    <input type="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

  • 超级旧的线程,但对于现在遇到此问题的任何人,请不要尝试 `action="#"` 因为它不起作用,也不是合适的解决方案。关键实际上是 `onsubmit="yourJsFunction();return false"` (7认同)
  • 这对我来说完全有效。这应该被接受的答案。`行动='#'` (3认同)
  • 但你不认为返回 false 不太优雅吗? (3认同)

小智 14

您可以使用此代码进行表单提交,而无需刷新页面.我在我的项目中完成了这个.

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

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


小智 8

当您为用户提供2种提交表单的可能性时,此问题会变得更加复杂:

  1. 通过单击ad hoc按钮
  2. 按Enter键

在这种情况下,如果按下Enter键,您将需要一个功能来检测您将在其中提交表单的按键.

IE现在出现问题(无论如何都是版本11)备注:Chrome和FireFox都不存在此问题!

  • 单击"提交"按钮时,表单将提交一次; 精细.
  • 当您按Enter键时,表单将被提交两次...并且您的servlet将被执行两次.如果您没有PRG(post redirect get)体系结构服务器,则结果可能是意外的.

虽然解决方案看起来微不足道,但我花了很多时间来解决这个问题,所以我希望它对其他人来说可能是有用的.此解决方案已成功通过IE(v 11.0.9600.18426),FF(v 40.03)和Chrome(v 53.02785.143 m 64 bit)进行测试

源代码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;
  }
}
Run Code Online (Sandbox Code Playgroud)
<!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>
Run Code Online (Sandbox Code Playgroud)


小智 5

大多数人会通过调用event.preventDefault()函数来阻止表单提交。

另一种方法是删除按钮的 onclick 属性,并将代码processForm()放入.submit(function() {asreturn false;导致表单不提交。此外,使formBlaSubmit()函数根据有效性返回布尔值,以用于processForm();

katsh的答案是一样的,只是更容易消化。

(顺便说一下,我是 stackoverflow 的新手,请给我指导。)

  • 尽管知道 `return false;` 也能阻止事件冒泡 DOM 是件好事——它是 `event.preventDefault(); 的简写;event.stopPropagation();` (2认同)

Dek*_*eke 5

在纯Javascript中,使用: e.preventDefault()

e.preventDefault() 用于jquery,但可用于javascript。

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

  //some code

  e.preventDefault();
})
Run Code Online (Sandbox Code Playgroud)


xyz*_*xyz 5

最好的解决方案是 onsubmit 调用任何你想要的函数并在它之后返回 false。

onsubmit="xxx_xxx(); return false;"
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 JS 实现此目的的最佳方法是使用 PreventDefault() 函数。考虑以下代码以供参考:

function loadForm(){
    var loginForm = document.querySelector('form'); //Selecting the form
    loginForm.addEventListener('submit', login);    //looking for submit
}

function login(e){
    e.preventDefault(); //to stop form action i.e. submit
}
Run Code Online (Sandbox Code Playgroud)