[英]OnclientClick and OnClick is not working at the same time?
我有一个类似以下的按钮,
<asp:Button ID="pagerLeftButton" runat="server" OnClientClick="disable(this)" onclick="pager_Left_Click" Text="<" />
当我这样使用按钮时,onclick不会触发。 当我删除OnClientClick时,就会触发onclick。
我需要做的是,在回发期间禁用该按钮,并在回发结束后启用它。
编辑:附加信息:
我在我的触发函数中添加了断点,这是c#部分,我正在调试,但不能确定它们是否触发。 这些功能就像
protected void pager_Left_Click(object sender, EventArgs e)
{
//Do smthing.
}
protected void pager_Right_Click(object sender, EventArgs e)
{
//Do smthing.
}
当我单击我的按钮时,它会被禁用1-2秒并自动启用,但是我不确定为什么启用了它。 我没有添加任何部分以使其再次启用。
来自web.archive.org上的这篇文章 :
诀窍是使用按钮控件的OnClientClick和UseSubmitBehavior属性。 还有其他方法,包括在服务器端添加属性的代码,但是我认为以这种方式进行的简单性更具吸引力:
<asp:Button runat="server" ID="BtnSubmit" OnClientClick="this.disabled = true; this.value = 'Submitting...';" UseSubmitBehavior="false" OnClick="BtnSubmit_Click" Text="Submit Me!" />
OnClientClick允许您添加客户端OnClick脚本。 在这种情况下,JavaScript将禁用button元素并将其文本值更改为进度消息。 回发完成后,新呈现的页面将把按钮还原回其初始状态,而无需进行任何其他工作。
禁用客户端上的提交按钮的一个陷阱是它将取消浏览器的提交,并因此取消回发。 将UseSubmitBehavior属性设置为false可以指示.NET注入必要的客户端脚本以无论如何触发回发,而不是依赖于浏览器的表单提交行为。 在这种情况下,它注入的代码将是:
__doPostBack('BtnSubmit','')
这被添加到我们的OnClientClick代码的末尾,为我们提供了呈现的HTML:
<input type="button" name="BtnSubmit" onclick="this.disabled = true; this.value ='Submitting...';__doPostBack('BtnSubmit','')" value="Submit Me!" id="BtnSubmit" />
在回发完成时,这将提供不错的按钮禁用效果并处理文本。
与OnClick一起使用时,OnClientClick似乎非常挑剔。
我尝试使用以下用例失败:
OnClientClick="return ValidateSearch();"
OnClientClick="if(ValidateSearch()) return true;"
OnClientClick="ValidateSearch();"
但是他们没有用。 以下工作:
<asp:Button ID="keywordSearch" runat="server" Text="Search" TabIndex="1"
OnClick="keywordSearch_Click"
OnClientClick="if (!ValidateSearch()) { return false;};" />
这里有两个问题:
为了解决这个问题,请在JavaScript onclick
事件之后禁用该按钮。 一种简单的方法是按照此答案的建议使用setTimeout
。
此外,即使ASP.NET验证失败, OnClientClick
代码也会运行,因此添加对Page_IsValid
的检查可能是一个好主意。 这样可以确保如果验证失败,则不会禁用该按钮。
OnClientClick="(function(button) { setTimeout(function () { if (Page_IsValid) button.disabled = true; }, 0); })(this);"
如问题所示,将所有这些JavaScript代码放入自己的函数中比较整洁:
OnClientClick="disable(this);"
function disable(button) {
setTimeout(function () {
if (Page_IsValid)
button.disabled = true;
}, 0);
}
要解决此问题,请禁用服务器端的按钮。 例如,在OnClick
事件处理程序中:
OnClick="Button1_Click"
protected void Button1_Click(object sender, EventArgs e)
{
((Button)sender).Enabled = false;
}
最后,请记住,防止重复按下按钮并不能防止两个不同的用户同时提交相同的数据。 确保在服务器端解决此问题。
Vinay(上文)给出了有效的解决方法。 实际上,导致按钮的OnClick事件在OnClientClick事件函数之后不起作用的原因是,MS已在按钮已禁用的位置(在OnClientClick事件调用的函数中)定义了它的位置,该按钮通过不尝试完成来“荣誉”它通过调用OnClick事件的定义方法来激活按钮的活动。
我费了好几个小时才能弄清楚。 一旦删除了禁用提交按钮的语句(位于OnClientClick函数内部),就可以调用OnClick方法,而不会出现其他问题。
Microsoft,如果您正在收听,则单击该按钮后,即使在此活动的一部分过程中被禁用,也应完成为其分配的活动。 只要单击它时未禁用它,它就应该完成所有分配的方法。
如果您不立即将按钮设置为禁用,而是通过setTimeout将其延迟怎么办? 您的“禁用”功能将返回,并且提交将继续。
您的JavaScript很好,除非您在此页面上运行其他脚本可能会破坏所有内容。 您可以使用Firebug进行检查。
我现在已经测试了一下,似乎ASP.net确实忽略了禁用的控件。 基本上发布了回发,但是框架可能会忽略此类事件,因为它“假定”禁用的按钮无法引发任何回发,因此它会忽略可能附加的处理程序。 现在,这只是我个人的推理,可以使用Reflector进行更深入的检查。
作为解决方案,您实际上可以尝试在以后执行禁用操作,基本上可以使用JavaTimer或其他功能延迟control.disabled = "disabled"
调用。 以这种方式,在JavaScript函数禁用控件之前,先发布到服务器的回发。 没测试过但是可以用
函数UpdateClick(btn){
for (i = 0; i < Page_Validators.length; i++) {
ValidatorValidate(Page_Validators[i]);
if (Page_Validators[i].isvalid == false)
return false;
}
btn.disabled = 'false';
btn.value = 'Please Wait...';
return true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.