与地球上的其他所有网络开发人员一样,用户双击表单上的提交按钮时遇到问题。我的理解是,处理此问题的传统方法是在第一次点击后立即禁用按钮,但是当我这样做时,它不会发布。
我确实对此做了一些研究,上帝知道有足够的信息,但其他问题如Disable button on form submission,禁用按钮似乎有效。 Disable button after submit的原始海报似乎与我有同样的问题,但没有提及如何/如果他解决它。
这里有一些关于如何重复它的代码(在IE8 Beta2中测试,但在IE7中有同样的问题)
我的aspx代码
<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script language="javascript" type="text/javascript">
function btn_onClick()
{
var chk = document.getElementById("chk");
if(chk.checked)
{
var btn = document.getElementById("btn");
btn.disabled = true;
}
}
</script>
<body>
<form id="form1" runat="server">
<asp:Literal ID="lit" Text="--:--:--" runat="server" />
<br />
<asp:Button ID="btn" Text="Submit" runat="server" />
<br />
<input type="checkbox" id="chk" />Disable button on first click
</form>
</body>
</html>
我的cs代码
using System;
public partial class _Default : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
btn.Click += new EventHandler(btn_Click);
btn.OnClientClick = "btn_onClick();";
}
void btn_Click(object sender, EventArgs e)
{
lit.Text = DateTime.Now.ToString("HH:mm:ss");
}
}
请注意,单击该按钮时会发生回发,并且时间会更新。但是当您选中复选框时,下次单击该按钮时,该按钮将被禁用(按预期方式),但永远不会进行回发。
我在这里想念的是什么?
提前致谢。
答案 0 :(得分:9)
我认为你只是错过了这个标签:
UseSubmitBehavior="false"
试试这样:
<asp:Button ID="btnUpdate" runat="server" UseSubmitBehavior="false" OnClientClick="if(Page_ClientValidate()) { this.disabled = true; } else {return false;}" Text = "Update" CssClass="button" OnClick="btnUpdate_Click" ValidationGroup="vgNew"/>
答案 1 :(得分:6)
fallen888是对的,你的方法不能跨浏览器工作。我使用this little snippet来阻止双击。
答案 2 :(得分:5)
UseSubmitBehavior="false"
将提交按钮转换为普通按钮(<input type="button">
)。如果您不希望发生这种情况,可以隐藏提交按钮并立即在其位置插入禁用按钮。因为这种情况发生得太快,所以看起来按钮会被禁用给用户。详细信息位于the blog of Josh Stodola。
代码示例(jQuery):
$("#<%= btnSubmit.ClientID %>").click(function()
{
$(this)
.hide()
.after('<input type="button" value="Please Wait..." disabled="disabled" />');
});
答案 3 :(得分:4)
“禁用”HTML控件并不总能在所有主流浏览器中产生一致的行为。所以我试图在客户端远离这样做,因为(使用ASP.NET模型)你需要在这种情况下跟踪客户端和服务器上元素的状态。
我要做的是通过将按钮的className切换到包含以下内容的CSS类,将按钮移出窗口的可见部分:
.hiddenButton
{
position: absolute;
top: -1000px;
left: -1000px;
}
现在,用什么代替按钮?
这可以通过相同的方式完成,但反之亦然。从页面加载时隐藏的元素开始,然后切换到表单提交上的可见className。
答案 4 :(得分:2)
我们使用以下JQuery脚本,在点击一键时禁用所有按钮(输入类型=提交和按钮)。
我们只是将脚本包含在全局JavaScript文件中,因此在创建新按钮时我们不必记住任何内容。
$(document).ready(function() {
$(":button,:submit").bind("click", function() {
setTimeout(function() {
$(":button,:submit").attr("disabled", "true");
}, 0);
});
});
通过检查Page_ClientValidate()。
可以轻松扩展此脚本答案 5 :(得分:1)
document.getElementById('form1').onsubmit = function() {
document.getElementById('btn').disabled = true;
};
答案 6 :(得分:1)
这是正确而简单的方法:
它适用于所有浏览器(与上面接受的解决方案不同)。
在您的应用程序中创建一个帮助器方法(例如在Utlity命名空间中):
Public Shared Sub PreventMultipleClicks(ByRef button As System.Web.UI.WebControls.Button, ByRef page As System.Web.UI.Page)
button.Attributes.Add("onclick", "this.disabled=true;" + page.ClientScript.GetPostBackEventReference(button, String.Empty).ToString)
End Sub
现在,您可以通过每个网页的代码调用:
Utility.PreventMultipleClicks(button1, page)
其中button1是您要阻止多次点击的按钮。
这样做只是将点击处理程序设置为:this.disabled = true
然后追加按钮自己的回发处理程序,所以我们得到:
的onclick = “this.disabled =真”; __ doPostBack( 'ID $ ID', '');“
这不会破坏页面的默认行为,并且可以按预期在所有浏览器中使用。
享受!
答案 7 :(得分:0)
出于调试目的,如果你对if(chk.checked)添加了一个else子句会怎么样?
答案 8 :(得分:0)
确保你的javascript函数返回true(或者一个值为boolean true的值),否则表单将不会被提交。
function btn_click()
var chk = document.getElementById("chk");
if(chk.checked)
{
var btn = document.getElementById("btn");
btn.disabled = true;
return true; //this enables the controls action to propagate
}
else return false; //this prevents it from propagating
}
答案 9 :(得分:0)
FOR JQUERY USERS
使用jQuery事件侦听器时,您将遇到各种问题,试图将javascript直接添加到ASP.NET按钮上的onClick事件。
我发现禁用按钮并使回发工作的最佳方法是执行以下操作:
$(buttonID).bind('click', function (e) {
if (ValidateForm(e)) {
//client side validation ok!
//disable the button:
$(buttonID).attr("disabled", true);
//force a postback:
try {
__doPostBack($(buttonID).attr("name"), "");
return true;
} catch (err) {
return true;
}
}
//client side validation failed!
return false;
});
ValidateForm 是您的自定义验证函数,如果您的表单验证客户端,则返回true或false。
buttonID 是您的按钮的ID,例如'#button1'