繁体   English   中英

OnclientClick和OnClick不能同时工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM