【问题标题】:OnclientClick and OnClick is not working at the same time?OnclientClick 和 OnClick 不能同时工作?
【发布时间】:2010-01-28 14:12:06
【问题描述】:

我有一个类似下面的按钮,

<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 秒并自动启用,但我不确定它为什么会启用。我没有添加任何部分来再次启用它。

【问题讨论】:

  • 你能告诉我们你的disable函数吗?
  • 你能发布你的 disable() Javascript 方法吗?
  • 禁用js功能是什么样的?当你调用 disable(this)...我假设它是正常的,但想确保
  • 功能禁用(控制){ control.disabled="disabled";警报(100); }

标签: c# asp.net postback onclick onclientclick


【解决方案1】:

来自article on 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 将禁用按钮元素并将其文本值更改为进度消息。回发完成后,新呈现的页面会将按钮恢复到其初始状态,无需任何额外工作。

在客户端禁用提交按钮的一个缺陷是它会取消浏览器的提交,从而取消回发。将 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" />

这提供了一个很好的按钮禁用效果和处理文本,同时回发完成。

【讨论】:

  • 这是正确答案。您应该编辑您的答案以包含文章中的信息。 (UseSubmitBehavior="false")
  • @Sam,我对这个问题的回答是链接到文章,但其他人在 SO 上要求包含内容。反正已经包含了链接。谢谢
  • @VinayPandey,不客气!我仍然认为您的答案的格式并不能很清楚地表明您在引用其他人。我建议对答案进行编辑,以向您展示我的意思。
  • 这种方法的一个缺点是当 JavaScript 被禁用或不可用时按钮不再起作用。
  • @Sam,感谢您的编辑,有没有办法在没有 javascript 的情况下做同样的事情?
【解决方案2】:

OnClientClick 在与 OnClick 一起使用时似乎非常挑剔。

我尝试了以下用例但没有成功:

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;};" />

【讨论】:

  • 这会产生SyntaxError: Unexpected token if 前面不应该有javascript 协议吗?
  • 工作正常。谢谢 ! Js 函数应该 return true 验证成功,否则 OnClick 不会被命中。
  • Webforms 新手提供一个干净、美观且有效的解决方案 :) 谢谢 Garry
  • 这很奇怪,这很有效!但确实如此。谢谢!
  • 我也不确定为什么这与以前的语法相比有效。这也帮助了我。
【解决方案3】:

Vinay(上图)提供了一种有效的解决方法。 实际上导致按钮的 OnClick 事件不起作用在 OnClientClick 事件函数之后是 MS 已经定义了它,一旦按钮被禁用(在 OnClientClick 事件调用的函数中),按钮“荣誉" 这通过不尝试通过调用 OnClick 事件的定义方法来完成按钮的活动。

我挣扎了几个小时试图弄清楚这一点。一旦我删除了禁用提交按钮的语句(位于 OnClientClick 函数内),就调用了 OnClick 方法,没有进一步的问题。

Microsoft,如果你在听,一旦按钮被点击,它应该完成分配给它的活动,即使它在这个活动的过程中被禁用。只要点击时没有禁用,应该会完成所有分配的方法。

【讨论】:

  • 这里,这里!微软,遵循标准 dab nabbit!
【解决方案4】:

这里有两个问题:

禁用客户端的按钮可防止回发

要克服这个问题,请在 JavaScript onclick 事件之后禁用按钮。一个简单的方法是按照this answer 的建议使用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;
}

最后,请记住,防止重复按下按钮并不能防止两个不同的用户同时提交相同的数据。确保在服务器端考虑到这一点。

【讨论】:

  • 能否请反对者告诉我有什么问题?如果我错了,我想知道这样我可以删除这个答案并从我的错误中吸取教训。或者,如果您只是不理解我的代码或其背后的原因,请询问。在后一种情况下,您对好的建议投反对票是对社区的伤害。
  • 这是对非常有用的解决方法背后的根本原因和推理的最佳解释。
【解决方案5】:

如果您不立即将按钮设置为禁用,而是通过 setTimeout 将其延迟,该怎么办? 您的“禁用”功能将返回,提交将继续。

【讨论】:

    【解决方案6】:

    您的 JavaScript 没有问题,除非您在此页面上运行了其他可能会损坏所有内容的脚本。您可以使用Firebug 进行检查。

    我现在进行了一些测试,似乎 ASP.net 确实忽略了禁用的控件。基本上发出回发,但框架可能会忽略此类事件,因为它“假设”禁用的按钮不能引发任何回发,因此它忽略可能附加的处理程序。现在这只是我个人的推理,可以使用 Reflector 进行更深入的检查。

    作为一种解决方案,您可以稍后真正尝试禁用,基本上您可以使用 JavaTimer 或其他一些功能延迟 control.disabled = "disabled" 调用。以这种方式,在 JavaScript 函数禁用控件之前,第一次回发到服务器。没有测试这个,但它可以工作

    【讨论】:

      【解决方案7】:

      函数更新点击(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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多