如何在“提交”按钮onclick事件中取消表单提交?


99

我正在使用ASP.net Web应用程序。

我有一个带有提交按钮的表格。提交按钮的代码如下所示<input type='submit' value='submit request' onclick='btnClick();'>

我想写如下内容:

function btnClick() {
    if (!validData())
        cancelFormSubmission();
}

我该怎么做呢?


哎呀,这使我的头部受伤。我有几个不同的submit输入。我想我会在此页面上尝试使用服务器端控件。
维维安河2010年

Answers:


183

你最好做...

<form onsubmit="return isValidForm()" />

如果isValidForm()返回false,则您的表单不会提交。

您可能还应该将事件处理程序从内联移动。

document.getElementById('my-form').onsubmit = function() {
    return isValidForm();
};

很好,但是似乎onsubmit每当我使用ASP.net时我都无法工作,因为asp.net会将所有内容都以自己的形式包装起来……
Vivian River

5
您可以使用他的第二个建议。内联JavaScript仍然是魔鬼。
斯蒂芬

3
如果您使用的是ASP.NET Web表单(提示:不要),请不要尝试包含其他表单。它们根本不兼容。我听说ASP.NET MVC允许您使用惯用标记构建Web应用程序。
昆汀2010年

@David,如果使用其他表单与ASP.net Web表单不兼容,那么我应该只使用服务器端控件吗?
维维安河

2
其他人已经完全像您一样回答了stackoverflow.com/a/23604664/1639385。我认为这太巧合了。
Ulysses Alves

43

将您的输入更改为此:

<input type='submit' value='submit request' onclick='return btnClick();'>

并在函数中返回false

function btnClick() {
    if (!validData())
        return false;
}

13

你需要改变

onclick='btnClick();'

onclick='return btnClick();'

cancelFormSubmission();

return false;

就是说,我会尽量避免使用内在事件属性,而使用具有良好事件处理API的库(例如YUI或jQuery)来支持不引人注意的JS,并将其绑定到真正重要的事件(即表单的Submit事件)中按钮的点击事件)。


2
使用onclick将允许用户点击Enter并绕过检查。
Cfreak

7

有时onsubmit无法与asp.net一起使用。

我用很简单的方法解决了。

如果我们有这样的表格

<form method="post" name="setting-form" >
   <input type="text" id="UserName" name="UserName" value="" 
      placeholder="user name" >
   <input type="password" id="Password" name="password" value="" placeholder="password" >
   <div id="remember" class="checkbox">
    <label>remember me</label>
    <asp:CheckBox ID="RememberMe" runat="server" />
   </div>
   <input type="submit" value="login" id="login-btn"/>
</form>

现在,您可以在表单回发之前捕获该事件,并从回发中停止该事件,并使用此jquery执行所有想要的ajax。

$(document).ready(function () {
            $("#login-btn").click(function (event) {
                event.preventDefault();
                alert("do what ever you want");
            });
 });

5

您应该将类​​型从更改submitbutton

<input type='button' value='submit request'>

代替

<input type='submit' value='submit request'>

然后,您会在javascript中获取按钮的名称,并将所需的任何操作关联到该按钮

var btn = document.forms["frm_name"].elements["btn_name"];
btn.onclick = function(){...};

为我工作,希望能有所帮助。


4

您需要return false;

<input type='submit' value='submit request' onclick='return btnClick();' />

function btnClick() {
    return validData();
}

1

为什么不将“提交”按钮更改为常规按钮,并在单击事件上通过了验证测试就提交您的表单?

例如

<input type='button' value='submit request' onclick='btnClick();'>

function btnClick() { 
    if (validData()) 
        document.myform.submit();
} 

1
按下Enter键将绕过支票。使用onSubmit
Cfreak 2010年

如果JavaScript不可用,那么它将根本无法工作。<a href=" icant.co.uk/articles/pragmatic-progressive-enhancement/...的事情上work</a> 。
昆汀

1

你需要onSubmit。不是onClick,否则有人可以只按回车键,它会绕过您的验证。至于取消。您需要返回false。这是代码:

<form onSubmit="return btnClick()">
<input type='submit' value='submit request'>

function btnClick() {
    if (!validData()) return false;
}

编辑 onSubmit属于form标记。


这行不通。如果数据有效,则不返回true。归还为真;在btnClick()函数结束时
NickSoft

1

很简单,只需返回false即可;

下面的代码在使用jquery的提交按钮的onclick中。

if(conditionsNotmet)
{
return false;
}

0

onclick='return btnClick();'

function btnClick() {
    return validData();
}

2
按Enter键将绕过检查。使用onSubmit
Cfreak 2010年

0
function btnClick() {
    return validData();
}

1
为了使它起作用,有必要做更多的事情。我尝试过使functino返回true或false,这似乎没有任何区别。
维维安河

1
他的回答是正确的。已投票。你必须在输入标签返回它,以及
Cfreak

1
另外,如果其他控件在同一元素上观察到同一事件,我宁愿使用ev.preventDefault()ev.returnValue = false取消默认行为,但也不要阻止事件冒泡。使用return false只有当你想从冒泡停止活动,并取消默认动作。看到这篇文章
KlemenSlavič'10

必须在事件处理程序本身中返回它是答案中缺少的非常重要的信息。没有这些,答案是不完整的,不足以值得投票。
昆汀2010年

0
<input type='button' onclick='buttonClick()' />

<script>
function buttonClick(){
    //Validate Here
    document.getElementsByTagName('form')[0].submit();
}
</script>

2
为了获得有用的答案,需要扩展此反应。解释为什么这是问题的答案。
Jeroen Heier '18

0

使用JQuery更加简单:可在Asp.Net MVC和Asp.Core中使用

<script>
    $('#btnSubmit').on('click', function () {

        if (ValidData) {
            return true;   //submit the form
        }
        else {
            return false;  //cancel the submit
        }
    });
</script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.