提交时停止表单刷新页面

Stop form refreshing page on submit

本文关键字:刷新 表单 提交      更新时间:2023-09-26

当按下发送按钮时,我将如何防止页面刷新,而字段中没有任何数据?

验证设置正常,所有字段都变为红色,但随后页面立即刷新。我对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()将停止提交。

没有jQuery:

var form = document.getElementById("myForm");
function handleForm(event) { event.preventDefault(); } 
form.addEventListener('submit', handleForm);

添加此onsubmit="return false"代码:

<form onsubmit="return false">

这为我解决了它。 它仍将运行您指定的 onClick 函数。

将按钮类型替换为button

<button type="button">My Cool Button</button>

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

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

您可以使用此代码提交表单,而无需刷新页面。我已经在我的项目中做到了这一点。

$(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 种提交表单的可能性时,此问题变得更加复杂:

  1. 通过单击临时按钮
  2. 通过按 输入 键

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

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

  • 当您单击提交按钮时,表单将提交一次;很好。
  • 当您点击输入时,表单将提交两次...并且您的 servlet 将被执行两次。如果您没有 PRG(重定向后获取)架构服务器端,结果可能是意外的。

尽管解决方案看起来微不足道,但我花了很多时间来解决这个问题,所以我希望它对其他人有用。该解决方案已在IE(v 11.0.9600.18426),FF(v 40.03)和Chrome(v 53.02785.143 m 64位)上成功进行了测试。

源代码 HTML 和 js 在代码片段中。原理在那里描述。警告:

您无法在代码段中对其进行测试,因为发布操作不是 定义并按回车键可能会干扰堆栈溢出。

如果您遇到此问题,则只需将 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>

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

onsubmit="xxx_xxx(); return false;"

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

另一种方法是删除按钮的 onclick 属性,并在return false;导致表单无法提交时将代码processForm() .submit(function() {。此外,使 formBlaSubmit() 函数基于有效性返回布尔值,以便在processForm();

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

(顺便说一下,我是堆栈溢出的新手,请给我指导。

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

e.preventDefault()用于jquery,但适用于JavaScript。

document.querySelector(".buttonclick").addEventListener("click", 
function(e){
  //some code
  e.preventDefault();
})
使用

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
}

就个人而言,我喜欢在提交时验证表单,如果有错误,只需返回 false。

$('form').submit(function() {
    var error;
   if ( !$('input').val() ) {
        error = true
    }
    if (error) {
         alert('there are errors')
         return false
    }
});

http://jsfiddle.net/dfyXY/

 $("#buttonID").click(function (e) {
          e.preventDefault();
         //some logic here
 }

如果你想使用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>

希望它对你有用!!

如果你不使用动作,只需在表单的动作属性中使用"javascript:"。

在我看来,大多数答案都是试图解决您的问题,但我认为这不是适合您的方案的最佳方法。

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

.preventDefault()确实不会刷新页面。但我认为,对要填充数据的字段进行简单的require就可以解决您的问题。

<form id="prospects_form" method="post">
    <input id="form_name" tabindex="1" class="boxsize" type="text" name="name" placeholder="Full name*" maxlength="80" value="" required/>
    <input id="form_email" tabindex="2" class="boxsize" type="text" name="email" placeholder="Email*" maxlength="100" value="" required/>
    <input id="form_subject" class="boxsize" type="text" name="subject" placeholder="Subject*" maxlength="50" value="FORM: Row for OUBC" required/>
    <textarea id="form_message" class="boxsize" name="message" placeholder="Message*" tabindex="3" rows="6" cols="5" maxlength="500"></textarea>
</form>

请注意在每个input末尾添加的require标记。结果将是相同的:不刷新字段中没有任何数据的页面。

<form onsubmit="myFunction(event)">
    Name : <input type="text"/>
    <input class="submit" type="submit">
  </form>
  <script>
  function myFunction(event){
    event.preventDefault();
    //code here
  }
  </script>
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;
}

没有检查它是如何工作的。你也可以绑定(this),这样它就可以像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();

它返回节点,因此您可以执行类似提交 i 的示例

到目前为止还不完美,但它应该工作,您应该添加错误处理或删除禁用条件

有时 e.preventDefault(); 工作然后开发人员很高兴,但有时不工作,然后开发人员很难过,然后我找到了为什么有时不起作用的解决方案

第一个代码有时有效

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

第二种选择为什么不工作?这是行不通的,因为jquery或其他javascript库没有正确加载,你可以在控制台中检查所有jquery和javascript文件是否正确加载。

这解决了我的问题。我希望这对您有所帮助。

我希望这将是最后一个答案



$('#the_form').submit(function(e){
  e.preventDefault()
  alert($(this).serialize())
  // var values = $(this).serialize()
  // logic....
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="the_form">
   Label-A <input type="text" name='a'required><br>
   Label-B <input type="text" name="b" required><br>
   Label-C <input type="password" name="c" required><br>
   Label-D <input type="number" name="d" required><br>
   <input type="submit" value="Save without refresh">
</form>

您可以通过清除状态来执行此操作,如下所示。 将其添加到 document.ready 函数的最开头。

if ( window.history.replaceState ) {
    window.history.replaceState( null, null, window.location.href );
}

添加到表单:

<input type="hidden" name="prevent_resubmitting" value="<?php echo time() ?>">

成功提交表单后,添加此代码:

$_SESSION["prevent_resubmitting"]=$_POST["prevent_resubmitting"];

刷新后,执行检查:

if(
    !empty($_SESSION["prevent_resubmitting"]) and
    $_SESSION["prevent_resubmitting"]==$_POST["prevent_resubmitting"]
) echo 'You cannot resubmit the form!';