Dav*_*her 23 javascript c# asp.net onclick double-click
我的ASP.net页面有点问题.如果用户双击"提交"按钮,它将两次写入数据库(即在图像按钮上执行两次'onclick'方法)
如何使用,如果用户点击图像按钮,只是图像按钮被禁用?
我试过了:
<asp:ImageButton
runat="server"
ID="VerifyStepContinue"
ImageUrl=image src
ToolTip="Go"
TabIndex="98"
CausesValidation="true"
OnClick="methodName"
OnClientClick="this.disabled = true;" />
Run Code Online (Sandbox Code Playgroud)
但是这个OnClientClick属性完全阻止了页面的提交!有帮助吗?
对不起,是的,我确实有验证控件...因此这个问题很棘手.
到目前为止,目前正在努力解决这个问题:
ASP代码:
<asp:TextBox ID="hidToken" runat="server" Visible="False" Enabled="False"></asp:TextBox>
...
<asp:ImageButton runat="server" ID="InputStepContinue" Name="InputStepContinue" ImageUrl="imagesrc" ToolTip="Go" TabIndex="98" CausesValidation="true" OnClick="SubmitMethod" OnClientClick="document.getElementById('InputStepContinue').style.visibility='hidden';" />
Run Code Online (Sandbox Code Playgroud)
C#代码:
private Random
random = new Random();
protected void Page_Load(object sender, EventArgs e)
{
//Use a Token to make sure it has only been clicked once.
if (Page.IsPostBack)
{
if (double.Parse(hidToken.Text) == ((double)Session["NextToken"]))
{
InputMethod();
}
else
{
// double click
}
}
double next = random.Next();
hidToken.Text = next + "";
Session["NextToken"] = next;
Run Code Online (Sandbox Code Playgroud)
实际上......这几乎可行.双击问题几乎是固定的(耶!)虽然图像仍然没有被隐藏.
Noo*_*ilk 21
一般方法是双重的.
Serverside:
System.Random),将其保存在会话中,并将其写入隐藏的表单字段客户:
与您所拥有的类似,但可能只是隐藏按钮,并将其替换为"提交"等文本.
客户方面需要注意的重要一点是,用户可以通过点击"转义"来取消帖子,所以你应该考虑在这里做什么(取决于它们不会被使用的距离,所以你'我需要将按钮从禁用/隐藏状态恢复.
完整示例如下:
C#(包括在行动中查看它的代码):
<html>
<head runat="server">
<title>double-click test</title>
<script language="c#" runat="server">
private Random
random = new Random();
private static int
TEST = 0;
public void Page_Load (object sender, EventArgs ea)
{
SetToken();
}
private void btnTest_Click (object sender, EventArgs ea)
{
if( IsTokenValid() ){
DoWork();
} else {
// double click
ltlResult.Text = "double click!";
}
}
private bool IsTokenValid ()
{
bool result = double.Parse(hidToken.Value) == ((double) Session["NextToken"]);
SetToken();
return result;
}
private void SetToken ()
{
double next = random.Next();
hidToken.Value = next + "";
Session["NextToken"] = next;
}
private void DoWork ()
{
TEST++;
ltlResult.Text = "DoWork(): " + TEST + ".";
}
</script>
</head>
<body>
<script language="javascript">
var last = null;
function f (obj)
{
obj.src = "http://www.gravatar.com/avatar/4659883ec420f39723c3df6ed99971b9?s=32&d=identicon&r=PG";
// Note: Disabling it here produced strange results. More investigation required.
last = obj;
setTimeout("reset()", 1 * 1000);
return true;
}
function reset ()
{
last.src = "http://www.gravatar.com/avatar/495ce8981a5127a9fd24bd72e7e3664a?s=32&d=identicon&r=PG";
last.disabled = "false";
}
</script>
<form id="form1" runat="server">
<asp:HiddenField runat="server" ID="hidToken" />
<asp:ImageButton runat="server" ID="btnTest"
OnClientClick="return f(this);"
ImageUrl="http://www.gravatar.com/avatar/495ce8981a5127a9fd24bd72e7e3664a?s=32&d=identicon&r=PG" OnClick="btnTest_Click" />
<pre>Result: <asp:Literal runat="server" ID="ltlResult" /></pre>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果您在页面上进行了验证,则禁用按钮客户端会变得有点棘手.如果验证失败,您不想禁用该按钮.这是一个添加客户端事件处理程序的代码段:
private void BuildClickOnceButton(WebControl ctl)
{
System.Text.StringBuilder sbValid = new System.Text.StringBuilder();
sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");
sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");
sbValid.Append(ctl.ClientID + ".value = 'Please wait...';");
sbValid.Append(ctl.ClientID + ".disabled = true;");
// GetPostBackEventReference obtains a reference to a client-side script
// function that causes the server to post back to the page.
sbValid.Append(ClientScript.GetPostBackEventReference(ctl, ""));
sbValid.Append(";");
ctl.Attributes.Add("onclick", sbValid.ToString());
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此asp.net线程.
更新:上面的代码将用于在代码后面添加OnClientClick处理程序.您也可以在aspx标记中编写javascript,如下所示:
<script type="text/javascript">
function disableButton(button)
{
// if there are client validators on the page
if (typeof(Page_ClientValidate) == 'function')
{
// if validation failed return false
// this will cancel the click event
if (Page_ClientValidate() == false)
{
return false;
}
}
// change the button text (does not apply to an ImageButton)
//button.value = "Please wait ...";
// disable the button
button.disabled = true;
// fire postback
__doPostBack(button.id, '');
}
</script>
<asp:ImageButton runat="server" ID="VerifyStepContinue" ImageUrl="button.png"
ToolTip="Go" TabIndex="98" CausesValidation="true" OnClick="methodName"
OnClientClick="return disableButton(this);" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22742 次 |
| 最近记录: |