【问题标题】:Prevent redirect after form is submitted提交表单后防止重定向
【发布时间】:2011-05-01 14:45:00
【问题描述】:

我有一个使用 PHP 提交电子邮件的 HTML 表单,当它提交时,它会重定向到那个 PHP 页面。有没有办法防止这种重定向发生?我用 jQuery 构建了一个动画,我希望它发生而不是重定向。我试过 return false;,但它不起作用。这是我的功能:

$(function() {
    $('.submit').click(function() {
        $('#registerform').submit();
        return false;
    }); 
});

这是开始的表单标签:

<form id="registerform" action="submit.php" method="post">

还有提交按钮:

<input type="submit" value="SUBMIT" class="submit" />

【问题讨论】:

  • 感谢您的提示。我对 Stack Overflow 有点陌生;仍然习惯于工作的方式。但我很少得到我可以说是我“接受”的答案。不过,我会通过它们回去。关于这个特定问题的任何指导?
  • 我会选择 Bruce Armstrong 或 Derek Adair 的答案。

标签: jquery html forms redirect


【解决方案1】:

我在原始帖子之后 10 年(!)找到了这个页面,并且需要作为 vanilla js 而不是 AJAX 的答案。我在@gargAman 的回答的帮助下想通了。

使用适当的选择器将按钮分配给变量,例如

document.getElementById('myButton')

然后

myButton.addEventListener('click', function(e) {
    e.preventDefault();
    // do cool stuff
});

我应该注意我的 html 看起来像这样(具体来说,我没有在我的按钮中使用 type="Submit" 并在我的表单中使用 action=""

  <form method="POST" action="" id="myForm">
    <!-- form fields -->
    <button id="myButton" class="btn-submit">Submit</button>
  </form>

【讨论】:

    【解决方案2】:

    由于绕过了CORSCSP,所以要保留在工具箱中。这是一个变体。

    这将在localhost:8080 发布一个base64 编码的对象,并在使用后清理DOM。

    const theOBJECT = {message: 'Hello world!', target: 'local'}
    
    document.body.innerHTML += '<iframe id="postframe" name="hiddenFrame" width="0" height="0" border="0" style="display: none;"></iframe><form id="dynForm" target="hiddenFrame" action="http://localhost:8080/" method="post"><input type="hidden" name="somedata" value="'+btoa(JSON.stringify(theOBJECT))+'"></form>';
    document.getElementById("dynForm").submit();
    dynForm.outerHTML = ""
    postframe.outerHTML = ""

    在网络调试器选项卡中,我们可以观察到从 tls/https 页面成功 POST 到 http:// 未加密服务器。

    【讨论】:

      【解决方案3】:

      您可以简单地将您的操作结果设置为控制器上的 NoContentResult

      public NoContentResult UploadFile([FromForm] VwModel model)
          {
             return new NoContentResult();
          } 
      

      【讨论】:

        【解决方案4】:

        使用 Ajax

        使用jQuery Ajax 请求方法,您可以将电子邮件数据发布到脚本(submit.php)。在脚本执行后使用success 回调选项为元素设置动画。

        注意 - 我建议使用 ajax 响应对象来确保脚本成功执行。

        $(function() {
            $('.submit').click(function() {
                $.ajax({
                    type: 'POST',
                    url: 'submit.php',
                    data: 'password=p4ssw0rt',
                    error: function()
                    {
                       alert("Request Failed");
                    },
                    success: function(response)
                    {  
                       //EXECUTE ANIMATION HERE
                    } // this was missing
                });
                return false;
            }); 
        })
        

        【讨论】:

        • 我在第 7 行遇到一个 JavaScript 错误:“属性列表后缺少 }”,我似乎不知道如何修复它
        • 对不起,做了一个复制粘贴工作,我的一些代码偷偷溜进去了。 -固定
        • 糟糕,也漏掉了一个逗号。
        • @DerekAdair :不会通过同源策略。我不控制目标域。这就是我使用表单而不是 Ajax 的原因。
        • ajax 的问题是,如果我将button type='submit' 更改为type='button',我将失去对input 元素的所有本机浏览器限制...你知道使用 AJAX 的方法吗?保持浏览器对 input 元素的限制?
        【解决方案5】:

        您必须将 return 放在 submit() 调用中。

          $('.submit').click(function() {
             $('#registerform').submit(function () {
             sendContactForm();
             return false;
            });
            //Here you can do anything after submit
        }
        

        【讨论】:

          【解决方案6】:
          $('#registerform').submit(function(e) {
             e.preventDefault();
             $.ajax({
                  type: 'POST',
                  url: 'submit.php',
                  data: $(this).serialize(),
                  beforeSend: //do something
                  complete: //do something
                  success: //do something for example if the request response is success play your animation...
             });
          
          })
          

          【讨论】:

            【解决方案7】:

            就像 Bruce Armstrong 在 his answer 中建议的那样。但是我会使用FormData:

            $(function() {
                $('form').submit(function() {
                    var formData = new FormData($(this)[0]);
                    $.ajax({
                        type: 'POST',
                        url: 'submit.php',
                        data: formData,
                        processData: false,
                        contentType: false,
                    });
                    return false;
                }); 
            })
            

            【讨论】:

            • 那么你的答案和布鲁斯的有什么不同?
            • 这不会阻止重定向
            • 它帮助了我
            【解决方案8】:

            你可以如下使用

            e.preventDefault() 
            

            如果调用此方法,则不会触发事件的默认动作。

            如果我可以建议阅读以下内容:.prop() vs .attr()

            希望对你有帮助

            代码示例:

            $('a').click(function(event){
                event.preventDefault();
                //do what you want
              } 
            

            【讨论】:

              【解决方案9】:

              您可以尝试 event.preventDefault(); 而不是 return false像这样:

              $(function() {
              $('#registerform').submit(function(event) {
                  event.preventDefault();
                  $(this).submit();
                  }); 
              });
              

              【讨论】:

              • 我试过了,虽然页面没有重定向,但是邮件发送失败。
              • 也许用 event.stopPropagation 代替?
              • preventDefault() 只会阻止浏览器提交表单。提问者确实想调用 PHP 页面中的表单处理代码(以便发送电子邮件)。
              • 当 processdata 为真时,它无论如何都会重定向!
              • 这对我造成了无限循环。它阻止提交,然后再次调用提交...?
              【解决方案10】:

              你应该用ajax发布它,这将阻止它改变页面,你仍然会得到信息。

              $(function() {
                  $('form').submit(function() {
                      $.ajax({
                          type: 'POST',
                          url: 'submit.php',
                          data: { username: $(this).name.value, 
                                  password: $(this).password.value }
                      });
                      return false;
                  }); 
              })
              

              Post documentation for JQuery

              【讨论】:

              • 我从未编写过 AJAX。是否可以发布与我的代码直接相关的示例?
              • 更新了示例以适应您的情况。我假设您使用的是 JQuery。
              • 是的,我正在使用 jQuery。我试过你的代码,它似乎没有工作。脚本的位置重要吗?我是否在提交按钮上保留 type="submit" ?
              • 更改变量后,您是否在 firebug/live http headers/charlie/etc 中看到了预期的帖子?哪个部分不起作用?
              • @Robert Pessagno - 您需要覆盖表单的提交方法,例如,使用 $('form').submit() 代替 $('.submit').click()。 JQuery 的提交事件文档在这里:api.jquery.com/submit
              【解决方案11】:

              简单的答案是通过 AJAX 请求将您的调用发送到外部脚本。然后按照你喜欢的方式处理响应。

              【讨论】:

              • 我找到了一个使用 AJAX 通过 PHP 脚本提交表单的 jQuery 插件。完美满足我的需要:jquery.malsup.com/form
              • @Parris Varney :不会通过同源策略。我不控制目标域。这就是我使用表单而不是 Ajax 的原因。
              【解决方案12】:

              如果不知道你在这里想要完成什么很难说,但如果你花时间用 javascript 解决这个问题,AJAX 请求将是你最好的选择。但是,如果您想完全在 PHP 中完成,请将其放在脚本的末尾,您应该进行设置。

              if(isset($_SERVER['HTTP_REFERER'])){
                  header("Location: " . $_SERVER['HTTP_REFERER']);    
              } else {
                  echo "An Error";
              }
              

              这仍然会导致页面更改两次,但用户将在发起请求的页面上结束。这甚至不是正确的方法,我强烈建议使用 AJAX 请求,但它可以完成工作。

              【讨论】:

              • 这正如你所说的那样工作,但它刷新了页面而不是完成动画。
              【解决方案13】:

              如果您可以运行 javascript(看起来可以),请创建一个新的 iframe,然后发布到该 iframe。你可以做&lt;form target="iframe-id" ...&gt; 这样所有的重定向都发生在 iframe 中,你仍然可以控制页面。

              另一种解决方案是也通过 ajax 发布帖子。但是如果页面需要错误检查或其他东西,那就有点棘手了。

              这是一个例子:

              $("<iframe id='test' />").appendTo(document.body);
              $("form").attr("target", "test");
              

              【讨论】:

              • 我喜欢 iframe 解决方案;我以前看过它,而且效果很好。但我不知道要写什么 JavaScript 才能让它工作。
              • 我认为你可以做类似 $("").appendTo(document.body);然后做 $("form").attr('target', 'test');您必须确保两个 id 匹配
              • 我没有问题将 iframe 放入我的页面。我不需要 JS 来做到这一点。但是表单提交的时候还是要重定向到PHP页面。
              • 当然可以,但是您可以将 PHP 页面加载到 iframe 中。你甚至不需要任何 JavaScript,真的。只需在提交按钮旁边放置一个 iframe,高度相同,然后在表单上使用 TARGET= 将结果页面加载到其中。 (最初,iframe 的 src 应该加载一个空白页面。)结果页面应该只是一个简单的单行消息,例如“成功提交”。
              • 这就是我现在的问题。我需要弄清楚如何允许本机浏览器限制 input 元素,但改用 AJAX
              【解决方案14】:

              HTTP 的设计意味着使用数据进行 POST 将返回一个页面。最初的设计者可能打算将其作为您 POST 的“结果”页面。

              PHP 应用程序 POST 回到同一页面是正常的,因为它不仅可以处理 POST 请求,而且可以根据原始 GET 生成更新的页面,但使用来自 POST 的新信息。但是,没有什么可以阻止您的服务器代码提供完全不同的输出。或者,您可以发布到完全不同的页面。

              如果您不想要输出,我在 AJAX 起飞之前看到的一种方法是让服务器返回(我认为)250 的 HTTP 响应代码。这称为“无内容”,这应该让浏览器忽略数据。

              当然,第三种方法是使用您提交的数据进行 AJAX 调用。

              【讨论】:

              • 我以前使用过无内容响应。主要问题是无法向用户提供任何反馈。如果您想要任何表明请求成功的迹象,那么 AJAX 就是您要走的路。这不是对您的回答的批评,只是我对其中的选项 3 的投票:)
              • 当然。我只是覆盖了所有的基地。我也发现 No Content 响应存在同样的限制。
              【解决方案15】:

              如果您希望 PHP 页面处理表单中的信息,那么您必须调用该 PHP 页面。为避免在此过程中重定向或刷新,请通过 AJAX 提交表单信息。也许使用 jQuery 对话框来显示结果,或者您的自定义动画。

              【讨论】:

                【解决方案16】:

                您可能只需要对页面执行 Ajax 请求。并且做return false 并没有做你认为它正在做的事情。

                【讨论】:

                  猜你喜欢
                  • 2011-08-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-05-05
                  • 2010-11-18
                  • 2015-12-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多