在提交时阻止表单重定向或刷新?

Ian*_*lor 92 html javascript forms jquery

我搜索了一堆页面,但找不到我的问题,所以我不得不发帖子.

我有一个具有提交按钮的表单,并在提交时我希望它不刷新或重定向.我只是想让jQuery执行一个功能.

这是表格:

<form id="contactForm">
    <fieldset>
        <label for="Name">Name</label>
        <input id="contactName" type="text" />
    </fieldset>

    <fieldset>
        <label for="Email">Email</label>
        <input id="contactEmail" type="text" />
    </fieldset>

    <fieldset class="noHeight">
        <textarea id="contactMessage" cols="20"></textarea>
        <input id="contactSend" class="submit" type="submit" onclick="sendContactForm()" />
    </fieldset>
</form>        
<small id="messageSent">Your message has been sent.</small>
Run Code Online (Sandbox Code Playgroud)

这是jQuery:

function sendContactForm(){
    $("#messageSent").slideDown("slow");
    setTimeout('$("#messageSent").slideUp();$("#contactForm").slideUp("slow")', 2000);
}
Run Code Online (Sandbox Code Playgroud)

我已尝试在表单上使用和不使用操作元素,但不知道我做错了什么.令我恼火的是,我有一个完美的例子: 示例页面

如果你想现场查看我的问题,请转到stormink.net(我的网站)并查看侧栏,上面写着"发送给我和发送电子邮件"和"RSS订阅".这两种形式都是我试图让它继续工作的形式.

CMS*_*CMS 174

只需处理提交事件的表单提交,并返回false:

$('#contactForm').submit(function () {
 sendContactForm();
 return false;
});
Run Code Online (Sandbox Code Playgroud)

您不再需要提交按钮上的onclick事件:

<input class="submit" type="submit" value="Send" />
Run Code Online (Sandbox Code Playgroud)

  • 像魅力一样工作!什么都快!我喜欢这个网站!非常感谢. (11认同)
  • 你应该真的使用e.preventDefault()而不是只返回false .. (7认同)
  • 我记得我学到的那一刻可以从提交到不提交返回错误,也是我开始真正喜欢Javascript/DOM系统的那一刻. (3认同)
  • @RogerFilmyer错了.如果你使用"return false;" 你也在停止传播,这将导致UX问题.例如,如果您期望"点击"冒泡或类似的东西. (3认同)

kar*_*m79 18

这里:

function submitClick(e)
{
     e.preventDefault();
     $("#messageSent").slideDown("slow");
     setTimeout('$("#messageSent").slideUp();
     $("#contactForm").slideUp("slow")', 2000);
}

$(document).ready(function() {
    $('#contactSend').click(submitClick);
});
Run Code Online (Sandbox Code Playgroud)

您将使用jQuery将"Click"事件处理程序绑定到提交按钮(或任何按钮),而不是使用onClick事件,这将使submitClick作为回调.我们将事件传递给回调以调用preventDefault,这将阻止点击提交表单.

  • 应该是`$('#contactSend').click(function(e){submitClick(e)});`或`$('#contactSend').click(submitClick);` (3认同)
  • 普通的 JS 解决方案怎么样? (2认同)

Bri*_*ane 14

在表单的开始标记中,设置一个动作属性,如下所示:

<form id="contactForm" action="#">
Run Code Online (Sandbox Code Playgroud)

  • 这个答案需要被否决,因为它没有解决原来的问题,并且在页面重新加载后实际更改 url 会使情况变得更糟。您需要在 onsubmit 函数中使用 `e.preventDefault()` 或 `return false` 。/sf/ask/1361801731/ (10认同)
  • +1表示简单解决方案.但不幸的是,页面仍会在用户第一次进入时刷新.一个糟糕的工作是尽快调用`myForm.submit();`,然后你加载页面两次. (2认同)

Jes*_*his 10

看起来你错过了一个return false.


CPH*_*hon 6

如果您想查看显示的默认浏览器错误,例如,由 HTML 属性触发的错误(在任何客户端代码 JS 处理之前显示):

<input name="o" required="required" aria-required="true" type="text">
Run Code Online (Sandbox Code Playgroud)

您应该使用submit事件而不是click事件。在这种情况下,将自动显示一个弹出窗口,要求“请填写此字段”。即使有preventDefault

$('form').on('submit', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will show up a "Please fill out this field" pop-up before my_form_treatment
Run Code Online (Sandbox Code Playgroud)

正如之前有人提到的return false将停止传播(即如果有更多的处理程序附加到表单提交,它们将不会被执行),但是,在这种情况下,浏览器触发的操作将始终首先执行。即使return false在最后。

因此,如果您想摆脱这些默认弹出窗口,请使用click提交按钮上的事件:

$('form input[type=submit]').on('click', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will NOT show any popups related to HTML attributes
Run Code Online (Sandbox Code Playgroud)