【问题标题】:Stop form refreshing page on submit提交时停止表单刷新页面
【发布时间】:2013-10-27 13:43:09
【问题描述】:

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

验证设置正常,所有字段变为红色,但页面立即刷新。我对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
    /////////////////
});

【问题讨论】:

    标签: javascript jquery html forms


    【解决方案1】:

    您可以阻止表单提交

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

    当然,在函数中,你可以检查空字段,如果有什么不正确的地方,e.preventDefault() 会停止提交。

    没有 jQuery:

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

    【讨论】:

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

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

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

    这为我解决了问题。它仍然会运行你指定的 onClick 函数

    【讨论】:

    • 它仍然会运行 HTML5 浏览器的表单验证。
    • 不需要库,jquery 很棒,原生在这种情况下更好。
    • 这是没有 JQuery 的最干净的解决方案。此外,您还可以将其用作; onsubmit="return submitFoo()" 如果您需要在提交时调用函数,则在 submitFoo() 中返回 false。
    • 但它永远不会让表单提交。
    【解决方案3】:

    将按钮类型替换为button:

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

    【讨论】:

    • 这是建议的唯一方法,即使存在对测试和开发有用的 Javascript 错误,也可以防止页面刷新。
    • 这很有用,但不会阻止用户按 [Enter] 时提交/重新加载。
    • 不适合表单验证:/您需要在表单元素中添加提交按钮
    • 如果您确定客户端将始终使用 JavaScript,我认为这将起作用,否则不应排除提交类型的按钮
    • @briancollins081 这不是一个全球性的解决方案。这个答案仅指OP的当前情况,如果没有javascript,即使button type="submit"他已经使用jQuery提交了按钮操作表单,OP也将永远无法在任何地方提交表单。
    【解决方案4】:

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

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

    【讨论】:

    • 这完全适合我。这应该被接受的答案。 action='#'
    • 超级老线程,但是对于现在遇到此问题的任何人,请不要尝试action="#",因为它不起作用并且不是合适的解决方案。关键其实是onsubmit="yourJsFunction();return false"
    • 但是你不觉得返回 false 不优雅吗?
    【解决方案5】:

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

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

    【讨论】:

    • 这个答案是唯一能保持表单正常运行的答案。就我而言,这是唯一的解决方案,因为我是从第三方获取表单并且不能玩太多。
    【解决方案6】:

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

    1. 点击特殊按钮
    2. 按 Enter 键

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

    现在 IE 出现了问题(无论如何是 11 版) 评论: Chrome 和 FireFox 都不存在这个问题!

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

    尽管解决方案看起来微不足道,但我花了好几个小时才解决这个问题,所以我希望它对其他人有用。 此解决方案已在 IE (v 11.0.9600.18426)、FF (v 40.03) 和 Chrome (v 53.02785.143 m 64 位) 等平台上成功测试

    源代码 HTML & js 在 sn-p.那里描述了原理。 警告:

    你不能在 sn-p 中测试它,因为 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>

    【讨论】:

      【解决方案7】:

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

      另一种方法是去掉按钮的onclick属性,将processForm()中的代码取出到.submit(function() {中,因为return false;导致表单无法提交。另外,使formBlaSubmit() 函数根据有效性返回布尔值,以便在processForm(); 中使用

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

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

      【讨论】:

      • 虽然很高兴知道return false; 也可以阻止事件冒泡 DOM — 它是 event.preventDefault(); event.stopPropagation(); 的简写
      【解决方案8】:

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

      e.preventDefault() 在 jquery 中使用,但在 javascript 中有效。

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

      【讨论】:

        【解决方案9】:

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

        onsubmit="xxx_xxx(); return false;"
        

        【讨论】:

          【解决方案10】:

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

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

          http://jsfiddle.net/dfyXY/

          【讨论】:

            【解决方案11】:
             $("#buttonID").click(function (e) {
                      e.preventDefault();
                     //some logic here
             }
            

            【讨论】:

              【解决方案12】:

              如果你想使用 Pure Javascript 那么下面的 sn-p 会比其他任何东西都好。

              假设

              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>
              

              希望它对你有用!!

              【讨论】:

                【解决方案13】:

                如果您不使用操作,只需在表单的操作属性中使用“javascript:”即可。

                【讨论】:

                • 包含一些示例,以更清楚地说明您的解决方案。
                【解决方案14】:

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

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

                .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 标签。结果将是相同的:在字段中没有任何数据的情况下不刷新页面。

                【讨论】:

                  【解决方案15】:
                  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;
                  }
                  

                  没有检查它是如何工作的。你也可以 bind(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 上面的例子

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

                  【讨论】:

                    【解决方案16】:

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

                    第一个代码有时会起作用

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

                    第二个选项为什么不起作用? 这不起作用,因为 jquery 或其他 javascript 库未正确加载,您可以在控制台中检查所有 jquery 和 javascript 文件是否正确加载。

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

                    【讨论】:

                      【解决方案17】:

                      我希望这是最后一个答案

                      
                      
                      $('#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>

                      【讨论】:

                        【解决方案18】:

                        使用 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
                        }
                        

                        【讨论】:

                          【解决方案19】:
                          <form onsubmit="myFunction(event)">
                              Name : <input type="text"/>
                              <input class="submit" type="submit">
                            </form>
                            <script>
                            function myFunction(event){
                              event.preventDefault();
                              //code here
                            }
                            </script>
                          

                          【讨论】:

                          • 仅使用 javascript
                          【解决方案20】:

                          对于纯 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>
                          

                          【讨论】:

                            【解决方案21】:

                            刚刚找到了一个非常简单但有效的解决方案,方法是从我想阻止发布和刷新的部分中删除 &lt;form&gt;&lt;/form&gt;

                            <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>
                            
                            

                            这里只有按钮按应有的方式提交。

                            【讨论】:

                            【解决方案22】:

                            只需像这样返回:

                            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>

                            从 validate() 中返回真假;按需求发挥作用

                            【讨论】:

                            • 你应该给出提示或提供代码sn-p而不是这么大的代码
                            【解决方案23】:
                            <FORM NAME=frm1 ...>
                            Name: <input type=textbox name=txtName id=txtName>
                            <BR>
                            <input type=button value="Submit" onclick=Validate()>
                            
                            
                            
                            <Script>
                                function Validate() { 
                                    Msg = ""
                            
                            // Check fields
                                    if(frm1.txtName.value fails this) {
                                        Msg += "\n    The Name Field is improper"
                                    }
                            // Do the same for the rest of the form
                            
                                    if(Msg == "") {
                                        frm1.submit()
                                    } else {
                                        alert("Your form has errors\n" + Msg)
                                    }
                                }
                            </SCRIPT>
                            

                            【讨论】:

                              猜你喜欢
                              • 2015-08-30
                              • 2014-04-20
                              • 1970-01-01
                              相关资源
                              最近更新 更多